JavaJVM · Java虚拟机原理 · JVM上语言·框架· 生态系统

老年代回收器cms

2021-04-12  本文已影响0人  holysu

几个阶段

cms垃圾回收器的问题

  1. 消耗cpu资源
    并发标记和并发清理的过程中垃圾回收线程虽然能和系统线程同时工作,但是会导致有限的cpu资源被垃圾回收线程占用; cms默认启动的回收线程数为 (cpu核数+3)/4

  2. Concurrent Mode Failure
    cms 并发清理的过程,只会清理之前标记好的垃圾对象,但是并发清理的同时,系统还在运行着,可能有一些对象进入老年代,然后变为垃圾对象,这种垃圾称为 “浮动垃圾”

    所以,cms为了避免回收期间,有一些垃圾进入老年代,会预留一些空间;-XX:CMSInitiatingOccupancyFaction 设置老年代占用多少比例就触发cms垃圾回收,jdk1.6 默认为92%

    如果cms垃圾回收期间,进入老年代的对象大于可用内存空间,就会发生 Concurrent Mode Failure,此时就会降级用 “Serial Old” 垃圾回收期替代 cms,强行进行 stw 的垃圾回收过程,重新标记垃圾 回收后才恢复系统线程

    一般线上 -XX:CMSInitiatingOccupancyFaction 的比例不会那么大 55% 65%这样子

  3. 内存碎片
    cms 采用的是 标记-清理 算法, 所以会有内存碎片的问题,容易导致更加频繁的 full gc

    -XX:UseCMSCompactAtFullCollection 默认打开,full gc之后 stw 整理内存碎片
    -XX:CMSFullGCsBeforeCompaction 执行多少次 full gc 之后进行一次内存碎片整理,默认为0 ,表示每次full gc 之后都会进行一次整理

上一篇 下一篇

猜你喜欢

热点阅读