JVM&垃圾回收机制

1.JVM垃圾回收机制

1.1 标记算法
  • 引用计数法(进行对象引用计数)——缺点是无法进行解决循环引用
  • 可达性分析——通过一个图,进行从root节点往下进行遍历,没有遍历到的就是无引用对象
1.2 回收算法
  • 标记-清除法——分为标记,清除两个算法,先一层循环进行标记,再一层循环进行清除
  • 复制算法——进行将内存分为两块,一块进行使用,使用完进行一次回收
  • 标记整理——一轮循环标记,一轮进行交换位置,将不使用的放在末端,最后再全部回收(解决内存碎片化的问题)
  • 分代收集算法——分为新生代,老年代,新生代有Eden, From Survivor, To Survivor区域,老年代有Tenured Gen区域
    • Eden空间和Survivor空间的默认大小比例是8:1,可通过 -XX:SurvivorRatio 命令调整这个比例。
    • 新生代和老年代默认内存大小的比例是1:2,可用过 -XX:NewRatio 命令调整这个比例。
      • 经历一定Minor次数依然存活的对象,该次数可通过 -XX:MaxTenuringThreshold 命令调整,默认:15。
      • Survivor空间中存放不下的对象,会存储在老年代。
      • 新生成的大对象会存储在老年代中,可通过 -XX:+PretenuerSizeThreshold 命令调整。
    • GC的分类
      • Minor GC:从新生代回收内存。
      • Full GC:回收整个Java堆空间的内存,包括新生代和老年代。Full GC比Minor GC慢很多,大概有10倍的差距,但是Full GC执行的频率比较低。
      • Major GC:一般来说和Full GC是等价的,由于名词解读的混乱,当说Major GC时一定要问清楚是指Full GC还是仅指从老年代回收内存。
    • 触发Full GC的条件:
      • 老年代空间不足
      • 永久代空间不足
      • CMS GC时出现promotion failed,concurrent mode failure时
      • Minor GC晋升到老年代的平均大小大于老年代的剩余空间
      • 调用System.gc()
      • 使用RMI来进行RPC或管理的JDK应用,没小时执行一次Full GC
1.3 垃圾回收器
  • Serial(单线程——复制算法)
  • ParNew(多线程——复制算法)
  • Parallel Scavenge(多核多线程——复制算法)
  • CMS(stop-the-world——标记清除)
  • ParOld(多线程——标记清除)
  • SerialOld(单线程——标记清除)
  • G1(复制+标记清理,分为不等的region,年轻老年代不再物理隔离)
  • jdk 1.8(Parallel Scanvenge(新生代)+Serial Old(老年代))
  • jdk 1.9(G1)
1.4 查看回收器使用
  • java -XX:+PrintCommandLineFlags -version

2. jstat使用

  • jstat -class vmid 类加载统计
  • jstat -compiler vmid 编译统计
  • jstat -gc vmid GC查看
  • jstat -gccapacity vmid 查看gc容量
  • jstat -gcnew vmid 查看gc新生内存统计
  • jstat -gcnewcapacity vmid 查看新生代容量
  • jstat -gcold vmid 查看老年代内存统计
  • jstat -gcoldcapacity vmid 查看老年代容量
  • jstat -gcmetacapacity vmid 查看gc的元数据空间统计
  • jstat -gcutil vmid 总结垃圾回收统计
  • jstat -printcompilation vmid 编译方法统计
posted @ 2021-01-13 22:49  SteveYu  阅读(145)  评论(0编辑  收藏  举报