美文网首页JVM
垃圾回收

垃圾回收

作者: 那些年搬过的砖 | 来源:发表于2020-12-17 20:56 被阅读0次

    如何查看当前JVM使用的垃圾回收器?

    java -XX:+PrintCommandLineFlags -version
    

    如何指定使用CMS回收?

    -XX:+UseConcMarkSweepGC
    

    如何打印回收日志?

    -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/Users/dbq/Documents/git/gctest/logs/gc.log
    

    垃圾回收过程

    CMS垃圾回收的6个重要阶段

    1、initial-mark 初始标记(CMS的第一个STW阶段),标记GC Root直接引用的对象,GC Root直接引用的对象不多,所以很快。
    2、concurrent-mark 并发标记阶段,由第一阶段标记过的对象出发,所有可达的对象都在本阶段标记。
    3、concurrent-preclean 并发预清理阶段,也是一个并发执行的阶段。在本阶段,会查找前一阶段执行过程中,从新生代晋升或新分配或被更新的对象。通过并发地重新扫描这些对象,预清理阶段可以减少下一个stop-the-world 重新标记阶段的工作量。
    4、concurrent-abortable-preclean 并发可中止的预清理阶段。这个阶段其实跟上一个阶段做的东西一样,也是为了减少下一个STW重新标记阶段的工作量。增加这一阶段是为了让我们可以控制这个阶段的结束时机,比如扫描多长时间(默认5秒)或者Eden区使用占比达到期望比例(默认50%)就结束本阶段。
    5、remark 重标记阶段(CMS的第二个STW阶段),暂停所有用户线程,从GC Root开始重新扫描整堆,标记存活的对象。需要注意的是,虽然CMS只回收老年代的垃圾对象,但是这个阶段依然需要扫描新生代,因为很多GC Root都在新生代,而这些GC Root指向的对象又在老年代,这称为“跨代引用”。
    6、concurrent-sweep ,并发清理。


    CMS的一次回收详细过程

    日志分析

    在线分析工具https://gceasy.io/

    image.png

    相关文章

      网友评论

        本文标题:垃圾回收

        本文链接:https://www.haomeiwen.com/subject/rnqtnktx.html