gc日志是次要gc或完整gc

时间:2019-12-03 14:03:12

标签: garbage-collection jvm

这是我的演示应用程序的jvm gc日志:

CommandLine flags: -XX:CMSInitiatingOccupancyFraction=70 -XX:+CMSParallelRemarkEnabled -XX:CompressedClassSpaceSize=44040192 -XX:+DisableExplicitGC -XX:InitialHeapSize=10485760 -XX:LargePageSizeInBytes=134217728 -XX:MaxHeapSize=10485760 -XX:MaxMetaspaceSize=52428800 -XX:MaxNewSize=5242880 -XX:MaxTenuringThreshold=6 -XX:MetaspaceSize=52428800 -XX:NewSize=5242880 -XX:OldPLABSize=16 -XX:-OmitStackTraceInFastThrow -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:ThreadStackSize=256 -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseConcMarkSweepGC -XX:+UseFastAccessorMethods -XX:+UseParNewGC 
2019-12-03T21:43:04.462-0800: 0.279: [GC (Allocation Failure) 2019-12-03T21:43:04.462-0800: 0.279: [ParNew: 4048K->512K(4608K), 0.0020396 secs] 4048K->722K(9728K), 0.0021283 secs] [Times: user=0.01 sys=0.00, real=0.00 secs] 
2019-12-03T21:43:04.469-0800: 0.286: [GC (Allocation Failure) 2019-12-03T21:43:04.469-0800: 0.286: [ParNew: 4608K->418K(4608K), 0.0022851 secs] 4818K->3190K(9728K), 0.0023372 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
2019-12-03T21:43:04.475-0800: 0.291: [GC (Allocation Failure) 2019-12-03T21:43:04.475-0800: 0.291: [ParNew: 4514K->4514K(4608K), 0.0000198 secs]2019-12-03T21:43:04.475-0800: 0.291: [CMS: 2771K->2764K(5120K), 0.0040364 secs] 7286K->2764K(9728K), [Metaspace: 4253K->4253K(1056768K)], 0.0041089 secs] [Times: user=0.00 sys=0.00, real=0.00 secs] 
2019-12-03T21:43:04.481-0800: 0.297: [GC (Allocation Failure) 2019-12-03T21:43:04.481-0800: 0.297: [ParNew: 4096K->4096K(4608K), 0.0000200 secs]2019-12-03T21:43:04.481-0800: 0.297: [CMS: 2764K->2721K(5120K), 0.0031319 secs] 6860K->2721K(9728K), [Metaspace: 4253K->4253K(1056768K)], 0.0032046 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

除了第4行和第5行外,所有内容都可以预期。由于它的标题是GC(Allocation Failure),似乎是由eden空间中的分配失败引起的小gc。但是,日志详细信息包含CMS和元空间信息,这使其像Full GC。

那么有人能说出第4行和第5行是Minor GC(年轻gc)还是Full GC(年轻+ tenured + metaspace)吗?

如果他们是次要的gc,那么第2、3行和第4,5行之间有什么区别?

如果他们是完整的gc,什么原因导致了完整的gc?

1 个答案:

答案 0 :(得分:0)

很难确切地说出您发布的内容,但这是有关GC如何工作的更多详细信息。

使用CMS的目的是避免使用完整的GC。当占用率和碎片率过高而无法使VM轻松为旧一代中的新对象分配空间时,就会发生CMS的完整GC。此时,VM将暂停所有应用程序线程,并进行完整的压缩收集,以通过将对象移动到内存中连续的对象来消除所有碎片。那不是您在这里看到的。

CMS主要是并发的,即在应用程序线程运行时,收集的某些阶段(并发标记,预清理,清除和重置)可能会发生。最初的标记阶段是停止运行,通常由次要GC触发,因此直接在次要GC之后发生。这可能就是您在此处观察到的,因此第4行和第5行同时记录了两个事件(较小的GC和CMS初始标记阶段的触发)。