Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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 调查垃圾收集周期的原因_Java_Performance_Garbage Collection_Jvm_Jvm Hotspot - Fatal编程技术网

Java 调查垃圾收集周期的原因

Java 调查垃圾收集周期的原因,java,performance,garbage-collection,jvm,jvm-hotspot,Java,Performance,Garbage Collection,Jvm,Jvm Hotspot,在生产环境中运行的当前基于BPM的应用程序(部署在JBOSS AS 4.2.3中)中,注意到了一些性能问题,这是因为在峰值负载期间运行的GC暂停周期较长。通过进一步分析,我发现运行JVM实例的jstat实用程序有以下输出 /usr/jdk1.6.0-x64/bin/jstat-gccapacity 5583 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC 838848.0 1677696.0 167

在生产环境中运行的当前基于BPM的应用程序(部署在JBOSS AS 4.2.3中)中,注意到了一些性能问题,这是因为在峰值负载期间运行的GC暂停周期较长。通过进一步分析,我发现运行JVM实例的jstat实用程序有以下输出

/usr/jdk1.6.0-x64/bin/jstat-gccapacity 5583 NGCMN NGCMX NGC S0C S1C EC OGCMN OGCMX OGC OC PGCMN PGCMX PGC PC YGC FGC 838848.0 1677696.0 1677696.0 167744.0 167744.0 1342208.0 3355456.0 6710912.0 6710912.0 21248.0 524288.0 480084.0 8448 268

/usr/jdk1.6.0-x64/bin/jstat-gcutil 5583 1s S0 S1 E O P YGC YGCT FGC FGCT GCT 0.00 46.33 23.11 81.23 60.38 8451 1386.335 268 159.553 1545.887 0.00 46.33 27.99 81.23 60.38 8451 1386.335 268 159.553 1545.887

在第一个命令中,(使用选项-gccapacity),我观察到NGC=NGCMX和OGC=OGCMX。也就是说,当前旧发电容量达到最大旧发电容量,当前新发电容量达到最大新发电容量

我想了解一下,这可能是导致频繁GC循环和一些大的执行(有时需要25-30秒以上)的原因吗


对于当前的解决方案,我们将最大JVM堆内存从8GB增加到9GB。但是,我们需要了解可能的原因,以便我们可以向开发人员团队提出同样的问题,以优化应用程序。

如果您想了解内存使用的原因,我建议您使用内存分析器。一种选择是使用VisualVM,但是像YourKit这样的商业分析器可能会更好地处理更大的内存大小

从8 GB增加到9 GB不太可能有多大区别。如果你有内存,试试16GB或30GB,看看这是否超过你的需要,然后减少它


如果您无法在生产中评测应用程序,并且测试没有再现相同的行为,那么您可以使用
jmap-histo
了解内存的最大消费者。有时这会给你一个线索。

如果你关心的是GC,也许你可以尝试使用另一种GC算法,或者甚至是两者的组合。 您描述的场景看起来确实像是无法满足您需求的GC算法

算法并行收集器(您可以使用-XX:+UseParallelGC启用此功能)可以并行运行次要收集器。 警告:此算法是“停止世界”算法,但可以使用多个处理器执行GC

还有-XX:+UseParallelOldGC,它为旧版本启用收集器

这些算法会从一个VM变为另一个VM。因此,请查看您使用的JVM版本,并根据您的需要选择正确的算法


正如Peter在回答中所说,分析器将帮助您评估应用程序、选择的GC算法并做出决策。

+1 JVisualVM很好。还有一个用于远程分析的功能。使用探查器,您可能会发现应用程序内部的漏洞。探查器可以帮助您找出为什么在负载下保留的内存比您认为的要多。感谢Peter的回答。我将尝试jmap-histo来深入了解原因,并查看是否有任何工具可以按照您的建议使用。然而,我想了解,如果NGC=NGCMX和OGC=OGCMX(如我目前的情况),这是否是一个值得关注的问题,增加内存可能会使NGC和OGC分别低于NGCMX和OGCMX值?注意:我在执行jstat-gccapacity时得到了这些值。除非您有内存泄漏,否则增加足够的最大值将导致最大值高于所使用的值。非常感谢您的回答,我们将看看这是否可以解决现有问题。