JVM堆内存回收(HotSpot)

分为两个大区域:新生代和老年代,一般比例为1:2

新生代使用“复制算法”进行回收,因此新生代分为三个区域:Eden,Survivor1,Survivor2,比例为8:1:1,
实现该复制算法的过程为:在Eden和一个Survivor1内存中产生新的对象,然后当这两个内存满时,进行GC回收,
将还存活的对象,复制到空闲的Survivor2中,然后清空Eden和Survivor1,然后继续在Eden和Survivor2中生成
新的对象,重复这个过程。对象每熬过一次GC回收,年龄就会加1(初始为0),当年龄到达一定值时(默认为15),
会将该对象移到老年代内存中去。

老年代内存采用“标记-清理”或“标记-整理”算法进行GC回收,老年代内存中的对象为存活时间较久,或者占连续
内存空间较大的对象。

判断一个对象是否需要回收,主要是看它是否还被引用,不被引用的对象经过两次标记后,进行回收,主要的算法有:
“引用计数法”和“可达性分析算法”,HotSpot使用后者。

内存分配时,根据空闲内存是否连续分为“指针碰撞法”和“空闲列表法”两种。

——————————————————————————————————————————————————————

JVM如何发起内存回收(HotSpot)

HotSpot使用“可达性分析算法”来判断某个对象是否已经“死亡”,可达性分析的关键在与GC Root对象是否与对象可达,
可以作为GC Root对象的一般为全局性的引用(例如常量和静态变量)和执行上下文(例如栈中的本地变量列表)。HotSpot
在“安全点”记录所有的GC Root信息,使用“主动式中断”方案来进行GC停顿,设置GC回收标志位,线程在安全点获取到GC回收
标志位的信息时,会停止在安全点不再继续运行,当所有线程都停止之后,开始进行GC检测和回收。触发GC回收的条件是新生代
内存(Eden区和Survivor区)使用已满。