垃圾回收

简介: 垃圾回收

如何查看当前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 ,并发清理。


image.png

CMS的一次回收详细过程


日志分析


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


image.png

image.png


相关文章
|
4月前
|
算法 Java
G1垃圾回收器
G1垃圾回收器
|
存储 算法 JavaScript
V8如何进行垃圾回收的
V8如何进行垃圾回收的
41 0
|
算法 Java 程序员
【垃圾回收器】
【垃圾回收器】
|
算法 小程序 Java
【垃圾回收】原来是这样!我懂了
本文主要介绍 java性能分析 之 垃圾收集
168 0
|
存储 前端开发 算法
V8 如何进行垃圾回收?
V8 如何进行垃圾回收?
103 0
|
算法 Java
详解gc(垃圾回收)机制六:分代垃圾回收
详解gc(垃圾回收)机制六:分代垃圾回收
212 0
详解gc(垃圾回收)机制六:分代垃圾回收
|
算法 Java UED
17-垃圾回收器(二)
17-垃圾回收器(二)
101 0
|
算法 Java API
17-垃圾回收器(一)
17-垃圾回收器(一)
162 0
|
存储 算法 Oracle
17-垃圾回收器(三)
17-垃圾回收器(三)
85 0
|
监控 算法 Oracle
17-垃圾回收器(四)
17-垃圾回收器(四)
196 0