一、 JVM内存区域
1. 程序计数器(PC 寄存器):一块较小的内存空间,是当前线程所执行的字节码的行号指示器,循环、跳转、线程恢复等通过它来完成
——(唯一一个不会出现OutOfMemoryError的内存区域)
2. 虚拟机栈:也叫栈内存,在线程创建时创建,线程结束时栈内存释放。每个方法被调用直到执行完毕的过程,对应帧栈在虚拟机栈的入栈和出栈的过程,这个过程遵循“先进后出”的原则。
——栈帧:虚拟机栈由一个个栈帧组成,栈帧是一个内存区块,每个栈帧中都拥有:局部变量表、操作数栈、动态链接、方法出口信息等
3. 本地方法栈:与虚拟机栈相似,虚拟机栈为JVM提供执行JAVA方法的服务,本地方法栈则为JVM提供使用native 方法的服务,在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。
4. 堆:JVM的内存数据区,所有线程共享,在虚拟机启动时创建,是垃圾收回收的主要区域。
——由年轻代和老年代组成,而年轻代内存又被分成三部分,Eden空间、From Survivor空间(S0)、To Survivor空间(S1),默认情况下年轻代按照8:1:1的比例来分配;
——元空间:f在 JDK 1.8中移除整个永久代,取而代之的是一个叫元空间(Metaspace)的区域(永久代使用的是JVM的堆内存空间,而元空间使用的是物理内存,直接受到本机的物理内存限制)
——直接内存:不是虚拟机运行时数据区的一部分,可以使用Native函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。避免了在 Java 堆和 Native 堆之间来回复制数据。
5. 方法区:也是所有线程共享。主要用于存储类的信息、常量池、静态变量、方法数据、方法代码等
——运行时常量池:JDK1.7及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。
二、JVM运行原理
1. 运行过程
第1步:向操作系统申请空闲内存。系统查找内存分配表,然后把内存段的起始地址和终止地址给JVM,JVM准备加载类文件。
第2步:给堆、栈分配内存。
第3步:文件检查和分析class文件。
第4步:加载类。(类加载机制)
第5步:执行方法。
第6步:释放内存。
2. 对象的内存布局
1)对象头:包括两部分信息,一部分用于存储对象自身的自身运行时数据(哈希码、GC分代年龄、锁状态标志等等),另一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是那个类的实例。
2)实例数据:是对象真正存储的有效信息,也是在程序中所定义的各种类型的字段内容。
3)对齐填充:不是必然存在的,也无特别含义,仅仅起占位作用。当实例数据部分没有对齐时,就通过它来补全。
——对象的大小必须是8字节的整数倍,而对象头部分正好是8字节的倍数
3. 对象的访问方式
1)句柄:Java堆将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息
2)直接指针:Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,而reference 中存储的直接就是对象的地址。
——使用句柄来访问的最大好处是 reference 中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,而 reference 本身不需要修改。使用直接指针访问方式最大的好处就是速度快,它节省了一次指针定位的时间开销。
4. 对象的回收
1)可达性分析算法:把内存中的每一个对象都看作一个节点,并且定义了一些对象作为根节点“GC Roots”,从这些结点开始向下搜索,搜索所经过的路径成为“引用链”,当一个对象到GC Roots没有任何引用链时,则证明此对象是不可用的。
——可达性分析算法中某个对象不可达,它也并非”非死不可”。如果这个对象覆盖了finalize()方法且这个方法没有被JVM调用过,则JVM会执行finalize()方法。这时你可以在这个方法中重新使某个引用指向该对象。当然,finalize()方法只能救它一次。
2)四种可作为GC Roots的对象:虚拟机栈中引用的对象、方法区中类静态属性引用的对象、方法区中常量引用的对象、本地方法栈中JNI[即一般说的Native]引用的对象
3)四种对象引用:强引用、软引用、弱引用、虚引用
三、垃圾回收机制
1. 垃圾收集算法
1)标记-清除
2)标记-复制
3)标记-压缩
4)分代收集算法:新生代——复制,老年代——压缩
2. 垃圾收集器 详解 JVM Garbage First(G1) 垃圾收集器
1)Serial收集器
2)ParNew收集器
3)Parallel收集器
4)Parallel Old 收集器
5)CMS收集器
6)G1(Garbage First)收集器
——收集器的组合
3. 收集内容
1)方法区的垃圾收集主要回收两部分内容:废弃常量、无用的类