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。如何知道?通过做一些实验!