1.概述
在此不进行JVM与GC的复杂解释,只进行简单的概述。
JVM:Java Virtual Machine(Java虚拟机)
GC:Garbage Collection,gc是java虚拟机的垃圾回收组件。
1.1 JVM结构
首先,我们要知道,jvm主要分为五个部分:方法区、堆、栈(方法栈)、本地方法栈(native)、程序计数器。
而其中,方法区与堆区是线程共享区;栈、本地方法栈、程序计数器则是线程私有区。
而我们进行gc的部分就是在堆区。
2. GC算法
垃圾回收的算法有很多,其中常见的有标记-清除算法、复制算法、标记-整理算法、分代收集算法等。
2.1 结构与功能
我们将堆分为两个部分:新生代和老年代。其中新生代的 gc 我们称之为 minor gc,也叫轻gc;老年代的 gc 叫做 full gc。
1 eden区,既是所谓的“伊甸园”,也叫做新生代,生成的对象首先在 eden 区中开辟空间(针对的是体积小的对象,如果对象的体积太大会直接在老年代中开辟存储空间),如果 eden 空间不够对象进行分配,则会进行一次 minor gc。
2 From survivor 区,这是第一个幸存者空间。在eden区由于空间不足进行 minor gc 的时候,会将 eden 区中存活的对象拷贝到 From 区,直到From区装满。
3 To survivor 区,这是第二个幸存者空间。在 From 区装满之后,会将From区的的 对象复制到 To 区,从而清空From区,同时将From 区变成 To 区,To 区变成 From 区,保证 To 区永远保持空的状态,而这一次交换使得 survivor 空间中的对象的“年龄”加一,达到一定的年龄之后(默认15,即交换15次),将仍然存活的对象存入老年代。
4 老年代,老年代的对象则只能等待 full gc 的回收。
5 以上就是 GC 的简单过程。
【以上gc过程是jdk1.8的实现原理,jdk11之后取消了 full gc 的机制】
2.2 JVM调优
jvm的调优的话针对两方面:
1 降低full gc 的执行频率:增大内存,增大full gc 的空余内存
2 提高执行时间:加大运行内存