jvm内存结构:《Java虚拟机原理图解》3、JVM运行时数据区

程序计数器:

,是执行的字节码的行号指示器,记录的是正在执行的虚拟机字节码指令的地址。
,每个线程都有独立计数器,互不干扰。
,唯一不会发生内存泄漏的一块区域。

Java虚拟机栈:

,这是我们通常所说的“堆和栈”中存放局部变量的栈(和存放对象的堆),但是却不仅仅存放局部变量,存放局部变量的只是里面的变量表部分。
,是方法执行产生的内存,每一个方法会创建一个栈帧,用于存储局部变量表、操作栈、动态链接、方法出口等信息。
2.1,局部变量表存放了编译期可知基本数据类型(boolean、byte、char、short、int、float、long、double)和引用所指向的地址
(这个地址可能是对象的地址,也可能是对象地址所在的地址(句柄),也可能是指令的地址)
注意:string类型的值没有存放在这里。这里存放的只是指向堆中或者方法区常量池的地址。
2.2,局部变量表的内存大小,在编译期就能确定,所以在方法执行时,内存分配后就不会改变了。
,每一个方法从被调用到执行完成,就是一个栈帧在虚拟机栈中从入栈到出栈的过程。
,虚拟机栈也是线程独立的。也就是每个线程有自己的栈帧。
,虚拟机栈可能出现的两种异常:栈溢出和内存溢出。
如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常(如:将一个函数反复递归自己,最终会出现这种异常)。
如果JVM栈可以动态扩展(大部分JVM是可以的),当扩展时无法申请到足够内存则抛出OutOfMemoryError异常。

本地方法栈:

()本地方法栈与虚拟机栈所发挥的作用很相似,他们的区别在于虚拟机栈为执行Java代码方法服务,而本地方法栈是为Native方法服务(也就第3方的:c/c++等)。
()和JVM栈一样,这个区域也会抛出StackOverflowError和OutOfMemoryError异常。
()甚至有的虚拟机(譬如Sun HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。

Java堆:

()是JVM所管理的最大的一块内存。被所有线程共享,在虚拟机启动时创建。(可能存在只被多个线程分配的私有缓冲区)
()理论上所有的对象实例以及数组都要在堆上分配。(随着JIT编译器,逃逸分析,栈上分配、标量替换优化技术发展变的不绝对了)。
()Java堆是垃圾收集管理的主要战场。现在收集器基本都是采用的分代收集算法,
(Java堆可以细分为:新生代和老年代。再细致分就是把新生代分为:Eden空间、FromSurvivor空间、To Survivor空间。)
()Java堆只要逻辑上是连续的即可。
()堆的大小是可变的。如果在堆中没有内存完成实例分配,并且堆也无法再扩展时,将会抛出OutOfMemoryError异常。

方法区(Method Area)

()存放的是加载后的字节码,类信息、常量、静态变量、即时编译器编译后的代码等数据 。
(如:getName、isInterface等方法来获取的数据来源于方法区)
()方法区域是全局共享的,比如每个线程都可以访问同一个类的静态变量。
(虽然Java虚拟机规范把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫做Non-Heap(非堆))
()这块区域主要是针对常量池回收和类型的卸载,值得注意的是JDK1.7已经把常量池转移到堆里面了。
(由于使用反射机制的原因,虚拟机很难推测哪个类信息不再使用,因此这块区域的回收很难!)
()同样,当方法区无法满足内存分配需求时,会抛出OutOfMemoryError。

运行时常量池:之前其空间从方法区域(JDK1.7后为堆空间)中分配

,它用于存放编译期生成的各种字面量和符号引用。
,但是Java语言并不要求一定只Class的常量表的内容才能进入方法区常量池,运行期间也可将新内容放入常量池(最典型的String.intern()方法)。
,当常量池无法在申请到内存时会抛出OutOfMemoryError异常

JVM学习笔记

一点一滴探究 JVM 之内存结构

JVM——Java虚拟机架构

Java内存管理原理及内存区域详解

jvm内存结构(一)(结构总览)的更多相关文章

  1. JVM内存模型和结构详解(五大模型图解)

    JVM内存模型和Java内存模型都是面试的热点问题,名字看感觉都差不多,实际上他们之间差别还是挺大的. 通俗点说,JVM内存结构是与JVM的内部存储结构相关,而Java内存模型是与多线程编程相关@mi ...

  2. 请你尽量全面的说一个对象在 JVM 内存中的结构?

    从 Java 14 开始,Project Valhala引入了 Value Type(或者称为 inline type),参考: Valhalla: https://openjdk.java.net/ ...

  3. JVM内存空间划分与作用详解

    在之前已经对Java的字节码进行了非常详细而又系统的学习了,接下来开启jvm内存相关的新篇章,在一个新知识开头之前肯定得理论化的对其进行一个整体的介绍,所以摒弃浮躁,先来看看相关的理论,主要是看一下J ...

  4. jvm系列(二):JVM内存结构

    JVM内存结构 所有的Java开发人员可能会遇到这样的困惑?我该为堆内存设置多大空间呢?OutOfMemoryError的异常到底涉及到运行时数据的哪块区域?该怎么解决呢?其实如果你经常解决服务器性能 ...

  5. 浅析JVM内存结构和6大区域(转)举例非常好

    内存作为系统中重要的资源,对于系统稳定运行和高效运行起到了关键的作用,Java和C之类的语言不同,不需要开发人员来分配内存和回收内存,而是由JVM来管理对象内存的分配以及对象内存的回收(又称为垃圾回收 ...

  6. JVM内存结构之三--持久代

    本文会介绍一些JVM内存结构的基本概念,然后很快会讲到持久代,来看下Java SE 8发布后它究竟到哪去了. 基础知识 JVM只不过是运行在你系统上的另一个进程而已,这一切的魔法始于一个java命令. ...

  7. JVM内存结构

    前言 在Java语言开发过程中,out of memory错误是很常见的一种错误.对于JVM的内存结构有更深入的了解,更更好的帮我们排查此类问题,有效的避免此类问题发生.在JAVA 8中内存结构有进行 ...

  8. 管中窥豹——从对象的生命周期梳理JVM内存结构、GC调优、类加载、AOP编程及性能监控

    如题,本文的宗旨既是透过对象的生命周期,来梳理JVM内存结构及GC相关知识,并辅以AOP及双亲委派机制原理,学习不仅仅是海绵式的吸收学习,还需要自己去分析why,加深对技术的理解和认知,祝大家早日走上 ...

  9. JVM内存结构,运行机制

    三月十号,白天出去有事情出去了一天,晚上刚到食堂就接到阿里电话, 紧张到不行,很多基础的问题都不知道从哪里说了orz: 其中关于JVM内存结构,运行机制,自己笔记里面有总结的,可当天还是一下子说不出来 ...

随机推荐

  1. OSGi 系列(七)之服务的监听、跟踪、声明等

    OSGi 系列(七)之服务的监听.跟踪.声明等 1. OSGi 服务的事件监听 和 bundle 的事件监听类似,服务的事件监听是在服务注册.注销,属性被修改的时候,OSGi 框架会发出各种不同的事件 ...

  2. Task构造

    //原文:http://www.tuicool.com/articles/IveiQbQ 创建并且初始化Task 使用lambda表达式创建Task Task.Factory.StartNew(() ...

  3. msys2 设置home路径为windows用户路径

    1配置/etc/nsswitch.conf db_home: windows 2(可不配)增加windows环境变量HOME为%USERPROFILE% 3(可不配)ssh默认仍使用msys中的hom ...

  4. c++中如何定义编译期间常量,即这个常量可以用于定义数组下标

    在c++中,类里面的成员变量不仅仅可以被const修饰,还可以被static const修饰,此时一个内建类型(如int ,char ,long等)的static const 可以看做是一个编译期间的 ...

  5. 20155206 2016-2017-2 《Java程序设计》第9周学习总结

    20155206 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 第十六章 JDBC简介 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 ...

  6. 2018.08.20 loj#116. 有源汇有上下界最大流(模板)

    传送门 貌似就是转成无源汇,然后两遍最大流搞定? 其实第二遍跑最大流是自动加上了第一次的答案. 代码: #include<bits/stdc++.h> #define N 100005 # ...

  7. 2018.08.04 spoj TTM to the moon(主席树)

    spoj传送门 vjudge传送门 主席树板子题. 支持历史版本的区间和,区间和,区间修改和时光倒流. 其中新奇一点的也只有区间修改了,这个东西直接标记永久化就行了. 如果想下传标记的话也行,需要在p ...

  8. hdu-1061(快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1061 思路:快速幂 #include<iostream> #include<cstd ...

  9. 1024 Hello World

    哈哈,原来今天是程序员的节日啊,快乐咯,可是今天好冷好冷~~

  10. =delete(c++11)

    1.为什么要阻止类对象的拷贝? 1)有些类,不需要拷贝和赋值运算符,如:IO类,以避免多个拷贝对象写入或读取相同的IO缓冲 2.如何阻止? 1)不定义拷贝构造函数和拷贝赋值运算符时,好心的编译器也会及 ...