JVM-垃圾回收

 
 常见的垃圾回收算法:
1. 引用计数法 : 无法解决循环引用的问题
2.标记清除算法:从根节点开始标记引用的对象,未被标记引用标记的对象可以被清除。
        解决了循环引用的问题。但是效率较低,标记和清除都要遍历所有对象。GC时,需要停止应用程序(否则可能导致标记不准确)。碎片化严重。
3.标记压缩算法:标记同“标记清除算法”,清理是将存货的对象压缩到内存的一端。
        解决了碎片化的问题。但对象需要移动内存位置,对效率有影响
4.复制算法:将内存空间一分为二,GC时,将存货对象复制到另一个空间,将该内存情况,交换两个内存的角色。适用于垃圾对象比较多,复制的对象比较少的时候。内存使用率低,最大50%。
         JVM年轻代内存空间就是用的这种算法。GC时,Eden区存货对象被复制到To,from中达到一定阙值的对象被复制到老年代中,没有达到阙值的被复制到to区。from和to交换角色。GC会一直这样重复,知道to被填满,会将所有对象移到老年代中。
5.分代算法:根据回收对象的特点进行选择,年轻代适合复制算法,老年代适合标记清除或标记压缩算法。
垃圾收集器
1.串行垃圾收集器 : 使用单线程进行垃圾回收。垃圾回收时,java应用中的线程都要暂停,等待垃圾回收的完成(STW,stop the world)。不适合java web应用。
 -XX:+UseSerialGC : 新生代和老年代都用串行垃圾收集器
 -XX:+PrintGCDetails : 打印垃圾回收的详细信息
 
2.并行垃圾收集器:单线程变成多线程,速度更快些,应用暂停的时间更短些。
  2.1 ParNew垃圾收集器: 工作在新生代   -XX:+UseParNewGC(新生代使用ParNew,老年代使用串行垃圾收集器)
  2.2 ParallelGC收集器
 
前三个参数相对比较常用
3. CMS垃圾收集器
 
4. g1垃圾收集器
 

可视化分析工具 : GCeasy

原文地址:https://www.cnblogs.com/yintingting/p/8893880.html