Java 它';这是由方法System.gc()引起的CMS gc吗?

Java 它';这是由方法System.gc()引起的CMS gc吗?,java,garbage-collection,concurrent-mark-sweep,Java,Garbage Collection,Concurrent Mark Sweep,我有这样一个代码,非常简单: public class Main { public static void main(String[] args) throws Exception { Thread.sleep(5000); System.gc(); } } 这是我的JVM选项: -XX:+ExplicitGCInvokesConcurrent -XX:+PrintPromotionFailure -XX:+PrintGCApplicatio

我有这样一个代码,非常简单:

public class Main {

    public static void main(String[] args) throws Exception {
        Thread.sleep(5000);
        System.gc();
    }

}
这是我的JVM选项:

-XX:+ExplicitGCInvokesConcurrent -XX:+PrintPromotionFailure -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails -server -XX:NewRatio=1 -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 -XX:+UseConcMarkSweepGC -Xloggc:/Users/roger/gc.log -Xms2G -Xmx2G -Xss512k
我可以在路径dir/Users/roger中获得gc日志文件,gc.log内容如下:


用于bsd-amd64 JRE(1.8.0_181-b13)的Java HotSpot(TM)64位服务器虚拟机(25.181-b13),由“Java_re”于2018年7月7日01:02:31通过gcc 4.2.1(基于苹果公司构建5658)(LLVM构建2336.11.00)构建
内存:4k页,物理8388608k(258072k可用)

/proc/meminfo:

命令行标志:-XX:cmSinitiatingOccinecyFraction=75-XX:+ExplicitGCInvokesConcurrent-XX:InitialHeapSize=2147483648-XX:MaxHeapSize=2147483648-XX:MaxTenuringThreshold=6-XX:NewRatio=1-XX:OldPLABSize=16-XX:+PrintGC-XX:+PrintGCApplicationsTopedTime-XX:+PrintGCDateStamps-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX-XX:+PrintPromotionFailure-XX:ThreadStackSize=512-XX:+UseCmSinitiatingOccupencyOnly-XX:+UseCompressedClassPointers-XX:+UseCompressedDoops-XX:+UseCompresseMarkSweepGC-XX:+UseParNewGC 2018-11-03T01:26:37.136-0800:0.245:应用程序线程停止的总时间:0.0000852秒,停止线程的时间:0.0000282秒 2018-11-03T01:26:37.136-0800:0.245:应用程序线程停止的总时间:0.0000434秒,停止线程的时间:0.0000213秒 2018-11-03T01:26:37.136-0800:0.245:应用程序线程停止的总时间:0.0000500秒,停止线程的时间:0.0000072秒 2018-11-03T01:26:38.138-0800:1.247:应用程序线程停止的总时间:0.0000811秒,停止线程的时间:0.0000215秒 2018-11-03T01:26:41.441-0800:4.550:应用程序线程停止的总时间:0.0000860秒,停止线程的时间:0.0000173秒 2018-11-03T01:26:42.419-0800:5.527:[GC(System.GC())2018-11-03T01:26:42.419-0800:5.527:[ParNew:33556K->536K(943744K),0.0049418秒]33556K->536K(1992320K),0.0051371秒][Times:user=0.02 sys=0.00,real=0.01秒] 2018-11-03T01:26:42.424-0800:5.533:应用程序线程停止的总时间:0.0052935秒,停止线程的时间:0.0000191秒 2018-11-03T01:26:42.424-0800:5.533:[GC(CMS初始标记)[1 CMS初始标记:0K(1048576K)]536K(1992320K),0.0003129秒][次:用户=0.00系统=0.00,实数=0.00秒] 2018-11-03T01:26:42.424-0800:5.533:应用程序线程停止的总时间:0.0003991秒,停止线程的时间:0.0000239秒 2018-11-03T01:26:42.424-0800:5.533:[CMS并发标记开始] 2018-11-03T01:26:42.438-0800:5.547:[CMS并发标记:0.014/0.014秒][次数:用户=0.01系统=0.00,实数=0.01秒] 2018-11-03T01:26:42.438-0800:5.547:[CMS并发预清洁启动] 2018-11-03T01:26:42.440-0800:5.548:[CMS并发预清洗:0.002/0.002秒][次数:用户=0.00系统=0.00,实际=0.01秒] 2018-11-03T01:26:42.440-0800:5.548:[GC(CMS最终评论)[YG入住率:536K(943744K)]2018-11-03T01:26:42.440-0800:5.548:[Rescan(并行),0.0010829秒]2018-11-03T01:26:42.441-0800:5.550:[0.0000814秒弱参考处理,0.0000814秒]2018-11-03T01:26:42.441-0800:5.550:[0.0002646秒][擦洗符号表,0.0003364秒]2018-11-03T01:26:42.442-0800:5.550[擦洗字符串表,0.0001618秒][1 CMS备注:0K(1048576K)]536K(1992320K),0.0020665秒][次数:用户=0.01系统=0.00,实际=0.00秒] 2018-11-03T01:26:42.442-0800:5.551:应用程序线程停止的总时间:0.0021350秒,停止线程的时间:0.0000122秒 2018-11-03T01:26:42.442-0800:5.551:[CMS并发扫描开始] 2018-11-03T01:26:42.442-0800:5.551:[CMS并发扫描:0.000/0.000秒][次数:用户=0.00系统=0.00秒,实数=0.00秒] 2018-11-03T01:26:42.442-0800:5.551:[CMS并发重置启动] 堆 PAR新一代总计9437.44K,使用8926K[0x000 000 07000 000,0x000 000 07800万,0x000 000 07800万) 伊甸园空间838912K,1%已使用[0x00000007400000,0x00000007408315f0,0x0000000773340000) 从空间104832K,0%已使用[0x00000007799a0000,0x0000000779a263b0,0x000000078000000) 对于空间104832K,0%已使用[0x0000000773340000,0x0000000773340000,0x00000007799a0000) 并发标记扫描生成总计1048576K,已使用0K[0x0000000780000000,0x00000007c000000,0x00000007c000000) 元空间使用3157K,容量4568K,提交4864K,保留1056768K 类空间使用338K,容量392K,提交512K,保留1048576K


我们可以在gc日志文件中看到CMS gc。这是由调用的method System.gc()引起的CMS gc吗?如何在gc日志中知道这一点?我们只能在gc日志中看到method System.gc()引起的新gc。

是的,您的日志显示了这一点。但是请记住,调用System.gc()并不保证gc运行。这是对JVM的提示

您还可以尝试通过设置
-XX:+DisableExplicitGC标志。比较两次运行之间的日志。

但是,如何知道System.gc()引起的CMS gc?我的gc日志只显示了System.gc()引起的新gc。如何知道?通过做一些实验!