垃圾回收机制
一.如何定位需要回收的对象
1.引用计数算法
给对象添加一个引用计数器,每当一个对象被引用则+1,当引用被减少则—1,当计数为0时,任何被标记为0的对象都为可回收对象。 弊端:当两个对象互相引用而没有别的对象引用他们时,会出现无法回收的情况,因为他们的计数器不为0。
2.根可达性分析算法
将GC Roots 对象作为起点,从这些节点向下搜索引用的对象,找到的对象都标记为非垃圾对象,
二.使用哪种策略回收垃圾?
1.标记清除算法(Mark-Sweep)
弊端:位置不连续,产生磁盘碎片
2.标记整理算法(Mark-Compact)
弊端:效率较低
3.复制算法(Copying)
弊端:浪费空间
垃圾收集器
jdk1.8及之前使用分代 jdk1.9级之后使用分区
在GC中可以把堆分为两个区,新生代,老年代。 默认分配内存的新生代1/3,老年代2/3。
新生代分为 Eden区(8/10),Servivor From(1/10),Servivior To(1/10)三个区域 新建对象在eden区 在eden区满了以后执行引擎开启垃圾收集线程(GC线程)minorGC对新生代进行一次垃圾回收 使用根可达性分析算法判断是否为垃圾对象,如果可以找到则被分到Servivor From区域,对象计数+1 当再次进行GC时,eden区幸存对象放入ServivorFrom区,ServivorFrom也被扫描,幸存对象则被放到Servivor To中,计数+2 当对象经过15次GC还被引用的时候,会被放入老年代 当老年代满了会出现 OutOfMermonyException异常
FullGC开始时会对老年去进行扫描。
Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外)
jdk1.8. parallelScavenge+parallerlOld
1.Serial 串形化(作用于年轻代)使用复制算法,STW
2.ParallelScavenge并行(作用于年轻代),采用复制算法STW
3.ParNew并行(作用于年轻代)–ParallelScavenge改良版
4.CMS(ConcurrentMarkSweep)并发标记清除(作用于老年代)标记清除算法,用户线程不会暂停,会产生浮动垃圾。
在并发的过程中用户线程能正常执行,会导致一些情况的发生, 一 当线程过程中用户线程产生了垃圾没有被标记到这种现象称为浮动垃圾。 二 当对象已经被标记为垃圾对象后又被引用,这种称为漏标。所以在整个过程中会进行第二次标记。 GC开始标记,初始标记,并发线程,重新标记,标记清除
5.Serial Old (作用于老年代)采用标记整理算法,会暂停所有用户进程
6.Parrallel Old 并行(作用于老年代)标记整理算法
G1 jdk9默认收集器
ZGC 12 Epsilon 测试时使用,不会真正的进行收集
如何进行优化待补充
|