garbage-collection - gc log是minor gc还是full gc
问题描述
这是我的演示应用程序的 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 和 Metaspace 信息,这使其类似于 Full GC。
那么谁能告诉第 4 行和第 5 行是 Minor GC(young gc)还是 Full GC(young+tenured+metaspace)?
如果它们是次要 gc,那么第 2、3 和 4,5 行有什么区别?
如果它们是完整的 gc,那么导致完整 gc 的原因是什么?
解决方案
很难从您发布的内容中明确地说出,但这里有更多关于 GC 工作原理的详细信息。
使用 CMS,其想法是避免完整的 GC。当占用率和碎片太高而无法使 VM 轻松为旧代中的新对象分配空间时,就会发生 CMS 的完整 GC。此时,VM 将暂停所有应用程序线程并执行完整的压缩收集,以通过将对象移动到内存中连续来消除所有碎片。这不是你在这里看到的。
CMS 主要是并发的,即收集的某些阶段(并发标记、预清理、清扫和重置)可以在应用程序线程运行时发生。初始标记阶段是 stop-the-world,通常由次要 GC 触发,因此直接发生在次要 GC 之后。这可能是您在此处观察到的,因此第 4 行和第 5 行将这两个事件一起记录(次要 GC 和触发 CMS 初始标记阶段)。
推荐阅读
- reactjs - 反应:从数组中删除元素后显示删除的元素
- visual-studio-code - 我不断收到错误代码“无法写入程序用户数据”我什至无法打开程序 Visual Studio 代码
- r - readr::read_csv() 将第一列 X1 与行号相加
- javascript - 如何重构此查询以不包含这么多变量?
- android - 使用最新的 WindowInset API 出现软键盘时如何调整对话框布局
- react-native - 在反应原生图表工具包中在 barChart 中导入 Y 标签
- rust - 由两个闭包修改的变量
- python - Pythonseasonal_decompose 函数中的残差图未正确显示
- docker - 在气流上使用 docker 操作符挂载目录不起作用
- java - Apache Beam - RabbitMq 读取 - 失败确认消息和引发异常