JVM GC笔记

堆分区:全部new的对象都会存放在堆中算法

     > 新生代(Young Generation):存放生命周期短的对象,具体还分为Eden和Survivor两个区,其中Survivor分为From Space和To Space;
     > 旧生代(Old Generation):存放生命周期长的对象
     > 持久代(Permenent Generation):用于存放class字节码等

 
JVM使用的GC算法是:分代收集
     > 频繁的收集新生代
     > 较少的收集旧生代
     > 基本不收集持久代

 
JVM的GC机制分为:Minor GC 和 Full GC
     > Minor GC: 即普通GC,负责收集新生代里全部对象,会把Eden里全部活着的对象复制到Survivor里,若是Survivor放不下,则把Survivor里活着的对象放入旧生代里
     > Full GC:会对新生代和旧生代进行收集,算法不一样效率会低于GC。显式调用System.gc()时,就是进行Full GC。
     > 触发条件:Eden满了触发Minor GC;有新对象进入旧生代时,旧生代空间不足则进行Full GC

 
JVM的清理算法:
     > 引用计数法(早期JVM):JVM会为对象的引用数进行计数,建立则添加,引用超出范围则删减,当计数为0时,则能够收集
     > 对象引用遍历:JVM会遍历全部根对象,根据对象图递归肯定可到达对象,若是某对象实例能够从根对象到达,则将其标记,称为标记对象;在执行收集阶段,只须要简单的扫描堆栈,删除全部未标记对象便可。通常在以后还会进行压缩,以便为新的对象腾出空间。
  > 复制清理法

 
JVM如何清理一个对象:
     > 新生代:采用复制清理法,扫描后把可到达的对象复制到未使用的区域,如survivor里,而后清楚Eden里全部对象
     > 旧生代:采用标记清理而后压缩,内容见对象引用遍历。
     > 机制:串行和并行两种,串行使用于单线程,单cpu;并行使用于多线程,多核cpu。
 

调优:
     >使用调优:尽早将不用的对象赋值null,而不是等到退出生命周期自动赋值;少用finalize(),会增大GC工做量;当程序等待时,手动执行system.gc();
     >虚拟机优化选项:网上查询