深入理解JVM(一)
第二章、Java内存区域和内存溢出异常
2.1、运行时数据区域
线程私有部分(图中白色部分)
- 程序计数器:
- 作用:使得线程切换后能恢复到正确的执行位置。
- 虚机机栈:
- 作用:描述Java方法执行的内存模型:每个方法在执行的同时会创建一个帧栈用于存储局部变量表,操作数栈、动态链接、方法出口信息等。(在一个方法执行的过程中会细讲)
- 本地方法栈:
- 作用:与虚拟机栈类似,但是为Native方法服务
程序公有部分(图中绿色部分)
- 堆:
- 作用:存放对象实例(new)
- 内部结构:新生代和老年代(Eden空间、From Survivor空间和To Survivor;8:1:1);
- gc回收的目标:all
- 方法区:
- 作用:存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
- gc的回收目标:常量池的回收和对类型的卸载
2.2 对象的创建
2.3、对象的内存布局
对象在内存中存储主要分为3块,分别是:对象头、实例数据和对齐补充。
对象头主要包含两部分信息:
- Mark Word:存储对象自身的运行时数据,如:HashCode,GC分代年龄、锁状态标志等等。
- 类型指针:对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。
2.4、对象的访问定位
Java程序需要通过栈上的reference数据来操作堆上的具体对象。目前,主流的访问方式有句柄和直接指针两种。