Java垃圾回收思想
枚举根节点,做可达性分析。
根节点
可以做根节点的有:类加载器、Thread、虚拟机栈的本地变量表、static成员、常量引用、本地方法栈的变量等。
垃圾回收算法
标记清除
算法分为标记、清除两个阶段。首先标记处所有需要回收的对象,在标记完成后统一回收所有。
缺点:效率不高,标记和清除两个过程的效率都不高。产生碎片,碎片过多会导致提前GC。
复制算法
它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块内存用完了,就将还存活的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。
优缺点:实现简单,运行高效,但是空间利用率低。
标记整理
标记过程仍然与"标记-清除"算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存。
优缺点:没有了内存碎片,但是整理内存比较耗时。
分带垃圾回收
JVM采用分带垃圾回收,即Young区用复制算法,Old区用标记清除或者标记整理算法。因为对象分配是在Young区进行分配的,大部分对象的生命周期都很短。但是Old区存放的对象生命周期都比较长,需要被回收的垃圾比较少,不适合使用复制算法。
对象分配
JVM对象分配优先分配在Eden区分配,大对象直接进入老年代,可以由-XX:PretenureSizeThreshold参数来设置。
长期存活的对象直接进入到老年代,可以由-XX:MaxTenuringThreshold、-XX:+PrintTenuringDistribution、-XX:TargetSurvivorRatio等参数来设置。