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日志文件。日志内容如下:
Java HotSpot(TM) 64-Bit Server VM (25.181-b13) for bsd-amd64 JRE (1.8.0_181-b13), built on Jul 7 2018 01:02:31 by "java_re" with gcc 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)
Memory: 4k page, physical 8388608k(258072k free)
命令行标志:-XX:cmSinitiatingOccinecyFraction=75-XX:+expliciticgCinVokesConcurrent-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:+PrintPromotionFailure-XX:+-XX:ThreadStackSize=512-XX:+UseCmSinitiatingOccupencyOnly-XX:+UseCompressedClassPointers-XX:+UseCompressedDoops-XX:+UseCommarkSweepGC-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.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.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.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并发重置启动]
堆
伊甸园空间838912K,1%已使用[0x00000007400000,0x00000007408315f0,0x0000000773340000)
对于空间104832K,0%已使用[0x0000000773340000,0x0000000773340000,0x00000007799a0000)
并发标记扫描生成总计1048576K,已使用0K[0x0000000780000000,0x00000007c000000,0x00000007c000000)
类空间使用338K,容量392K,提交512K,保留1048576K
我们可以在gc日志文件中看到CMS gc。是由方法系统引起的CMS gc。是否调用了gc()?如何在gc日志中知道这一点?我们只能看到由方法系统引起的新gc。gc日志中的gc()。