Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 调整GC(CMS)的参数_Java_Garbage Collection_Jvm - Fatal编程技术网

Java 调整GC(CMS)的参数

Java 调整GC(CMS)的参数,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,我使用CMS进行GC,但是每两个月CPU的使用率就会非常高 当情况变得更糟时,有一段GC日志,您可能会发现长STW 3519696.386: [GC [1 CMS-initial-mark: 8617524K(12582912K)] 17105967K(23907584K), 4.9369140 secs] [Times: user=4.94 sys=0.00, real=4.94 secs] 3519701.324: [CMS-concurrent-mark-start] 3519709.41

我使用CMS进行GC,但是每两个月CPU的使用率就会非常高

当情况变得更糟时,有一段GC日志,您可能会发现长STW

3519696.386: [GC [1 CMS-initial-mark: 8617524K(12582912K)] 17105967K(23907584K), 4.9369140 secs] [Times: user=4.94 sys=0.00, real=4.94 secs]
3519701.324: [CMS-concurrent-mark-start]
3519709.419: [CMS-concurrent-mark: 8.096/8.096 secs] [Times: user=16.17 sys=0.00, real=8.09 secs]
3519709.420: [CMS-concurrent-preclean-start]
3519709.442: [CMS-concurrent-preclean: 0.023/0.023 secs] [Times: user=0.02 sys=0.00, real=0.02 secs]
3519709.442: [CMS-concurrent-abortable-preclean-start]
 CMS: abort preclean due to time 3519714.691: [CMS-concurrent-abortable-preclean: 3.345/5.248 secs] [Times: user=3.36 sys=0.00, real=5.25 secs]
3519714.692: [GC[YG occupancy: 8489655 K (11324672 K)]3519714.692: [Rescan (parallel) , 8.4072250 secs]3519723.099: [weak refs processing, 0.0000190 secs]3519723.099: [scrub string table, 0.0008130 secs] [1 CMS-remark: 8617524K(12582912K)] 17107180K(23907584K), 8.4081940 secs] [Times: user=65.71 sys=0.15, real=8.41 secs]
3519723.100: [CMS-concurrent-sweep-start]
3519725.451: [CMS-concurrent-sweep: 2.350/2.350 secs] [Times: user=2.36 sys=0.00, real=2.35 secs]
3519725.451: [CMS-concurrent-reset-start]
3519725.478: [CMS-concurrent-reset: 0.028/0.028 secs] [Times: user=0.03 sys=0.00, real=0.03 secs]
3519727.480: [GC [1 CMS-initial-mark: 8617522K(12582912K)] 17107229K(23907584K), 4.9378950 secs] [Times: user=4.94 sys=0.00, real=4.94 secs]
3519732.418: [CMS-concurrent-mark-start]
我的GC参数:

java -server -Xmx24g -Xms24g -XX:NewSize=12g -XX:MaxNewSize=12g -XX:+HeapDumpOnOutOfMemoryError -XX:MaxDirectMemorySize=24g -XX:+UseConcMarkSweepGC -XX:+UseCMSCompactAtFullCollection -XX:ReservedCodeCacheSize=128m  -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:CMSInitiatingOccupancyFraction=68
我的服务器上安装了9个CPU和64G内存


你能帮我找出每月病情恶化的关键点吗?

好的,让我们详细了解一下。我首先要注意的是,所有的时间似乎都在user中,而不是在sys中,所以主要的嫌疑犯是JVM和应用程序

GC在旧发电机占用8617524K(容量12582912K)时触发。堆的总使用量为17105967K,大小为23907584K

初始标记需要约5秒

3519696.386: [GC [1 CMS-initial-mark: 8617524K(12582912K)] 17105967K(23907584K), 4.9369140 secs] [Times: user=4.94 sys=0.00, real=4.94 secs]
AFAIK初始标记只处理GC根。你可以看到哪些是这些,但事实上,它需要这么多是奇怪的。我的第一个怀疑是,这受到达安全点的时间的影响,因此可能启用:

-XX:+PrintSafepointStatistics–XX:PrintSafepointStatisticsCount=1

并发标记阶段需要8秒

3519709.419: [CMS-concurrent-mark: 8.096/8.096 secs] [Times: user=16.17 sys=0.00, real=8.09 secs]
这是扫描活动对象

预清洁相对较快

可中止预清洁在5s时取消,AFAIK可通过CMSMAXABORTABLE预清洁时间进行配置。深入研究这个选项,我发现在这个阶段进行小收集是可取的,如果不这样做,可能会导致CMS中出现可变的大暂停。增加CMSmaxaborTablePreCleansTime,并在备注前激活CMSSCavenue。请通过查看此帖子

年轻一代是8G,重新扫描是8s,这似乎太多了。同样的评论。安全点

3519714.692:[GC[YG占用率:8489655 K 11324672 K]3519714.692:[Rescan parallel,8.4072250秒]3519723.099:[weak refs processing,0.0000190秒]3519723.099:[scrub string table,0.0008130秒][1 CMS备注:8617524K12582912K]17107180K23907584K,8.408140秒][次数:用户=65.71系统=0.15,实际=8.41秒]

请注意,年轻一代的体型在这一时期实际上有所增加:8617524K

并发扫描时的最终清理需要2.35秒,堆内容似乎没有实质性变化。您仍然有大致相同的young和heap用法

因此,我看到两点:

您的堆很大,您正在到达CMSInitiatingOccupencyFraction并触发CMS,而且很多时间似乎都在扫描活动对象。不管是哪种方式,都要检查sizepoint时间,看看这是否可以改进。 GC收集的数据并不多,因此您可能处于以下情况之一: 您希望保留大量长寿命对象,例如缓存。在这种情况下,您希望增加CMSInitiatingOccuppancyFraction,因为您希望旧的gen变得非常满。但也要注意不要推销任何中寿命或短寿命的物品,因为这些物品最终会在一天或两个月内产生长期的地面军事系统。也就是说:避免老一代的搅动。 您正在生成大量的中短期对象,您需要避免升级。减少分配,增加伊甸园。
关于你的应用程序的更多细节,等等,肯定会有助于更好地确定它。我希望这能有所帮助。

好的,让我们来详细了解一下。我首先要注意的是,所有的时间似乎都在user中,而不是在sys中,所以主要的嫌疑犯是JVM和应用程序

GC在旧发电机占用8617524K(容量12582912K)时触发。堆的总使用量为17105967K,大小为23907584K

初始标记需要约5秒

3519696.386: [GC [1 CMS-initial-mark: 8617524K(12582912K)] 17105967K(23907584K), 4.9369140 secs] [Times: user=4.94 sys=0.00, real=4.94 secs]
AFAIK初始标记只处理GC根。你可以看到哪些是这些,但事实上,它需要这么多是奇怪的。我的第一个怀疑是,这受到达安全点的时间的影响,因此可能启用:

-XX:+PrintSafepointStatistics–XX:PrintSafepointStatisticsCount=1

并发标记阶段需要8秒

3519709.419: [CMS-concurrent-mark: 8.096/8.096 secs] [Times: user=16.17 sys=0.00, real=8.09 secs]
这是扫描活动对象

预清洁相对较快

可中止预清洁在5s时取消,AFAIK可通过CMSMAXABORTABLE预清洁时间进行配置。深入研究这个选项,我发现在这个阶段进行小收集是可取的,如果不这样做,可能会导致CMS中出现可变的大暂停。增加CMSmaxaborTablePreCleansTime,并在备注前激活CMSSCavenue。请通过查看此帖子

年轻一代是8G,重新扫描是8s,这似乎太多了。同样的评论。安全点

3519714.692:[GC[YG占用率:8489655 K 11324672 K]3519714.692:[Rescan parallel,8.4072250秒]3519723.099:[weak refs processing,0.0000190秒]3519723.099:[scrub string table,0.0008130秒][1 CMS备注:8617524K12582912K]17107180K23907584K,8.408140秒][次数:用户=65.71系统=0.15,实际=8.41秒]

请注意,年轻一代的体型在这一时期实际上有所增加:8617524K

并发扫描时的最终清理需要2.35秒,堆内容似乎没有实质性变化。您仍然有大致相同的young和heap用法

因此,我看到两点:

您的堆很大,您正在到达CMSInitiatingOccupencyFraction并触发CMS,而且很多时间似乎都在扫描活动对象。不管是哪种方式,都要检查sizepoint时间,看看这是否可以改进。 GC收集的数据并不多,因此您可能处于以下情况之一: 您希望保留大量长寿命对象,例如缓存。在这种情况下,您希望增加CMSInitiatingOccuppancyFraction,因为您希望旧的gen变得非常满。但也要注意不要推销任何中寿命或短寿命的物品,因为这些物品最终会在一天或两个月内产生长期的地面军事系统。也就是说:避免老一代的搅动。 您正在生成大量的中短期对象,您需要避免升级。减少分配,增加伊甸园。
关于你的应用程序的更多细节,等等,肯定会有助于更好地确定它。我希望这能有所帮助。

在您的日志中,我没有看到正常的年轻GC。CMS Stop the World阶段旨在借助年轻人的空间收集来提高效率

3519727.480: [GC [1 CMS-initial-mark: 8617522K(12582912K)] 17107229K(23907584K), 4.9378950 secs] [Times: user=4.94 sys=0.00, real=4.94 secs]
这里CMS初始标记必须在一个线程中扫描8.6 GiB的年轻空间。如果在young GC之后立即调用它,那么young的空间占用将减少一个数量级

CMS评论也是如此

年轻人有很大的年轻人空间,所以当你们的旧空间比年轻人空间更频繁地被收集时,你们就会陷入这样的境地

这里有一些补救办法

-XX:CMSWaitDuration=3600000让CMS初始标记等待一小时,直到下一个年轻GC。 -XX:+CMSScavengeBeforeRemark让CMS remark强制年轻的集合产生可预测的暂停时间。 使用具有并行CMS初始标记的最新Java 7/8
更多详细信息请参见。

在您的日志中,我没有看到正常的young GC。CMS Stop the World阶段旨在借助年轻人的空间收集来提高效率

3519727.480: [GC [1 CMS-initial-mark: 8617522K(12582912K)] 17107229K(23907584K), 4.9378950 secs] [Times: user=4.94 sys=0.00, real=4.94 secs]
这里CMS初始标记必须在一个线程中扫描8.6 GiB的年轻空间。如果在young GC之后立即调用它,那么young的空间占用将减少一个数量级

CMS评论也是如此

年轻人有很大的年轻人空间,所以当你们的旧空间比年轻人空间更频繁地被收集时,你们就会陷入这样的境地

这里有一些补救办法

-XX:CMSWaitDuration=3600000让CMS初始标记等待一小时,直到下一个年轻GC。 -XX:+CMSScavengeBeforeRemark让CMS remark强制年轻的集合产生可预测的暂停时间。 使用具有并行CMS初始标记的最新Java 7/8
更多详细信息,请访问。

是否附加了visual以查看是否存在泄漏或最终确定问题?@ThorbjørnRavnAndersen是否有任何工具可供使用?Visualvm是jdk发行版的一部分。是否附加了visual以查看是否存在泄漏或最终确定问题?@ThorbjørnRavnAndersen是否有任何工具可供使用?Visualvm是jdk发行版的一部分jdk发行版。