我们有一个JVM进程,它不经常将CPU固定在100%,看起来(根据visualgc)是一个非常接近耗尽的堆。我们的假设是,进程正在英勇地进行GC,导致CPU峰值,这会影响整个系统的整体健康状况(由其他JVM组成)。
此过程并不重要,可以重新启动。有没有一种方法可以通过命令行来调优JVM,让它自己倒在自己的剑上,而不是让它继续GC'ing并导致整个机器受到影响?
值得注意的是,我们没有得到OOMCepception,所以堆没有完全耗尽,但我们认为只是勉强没有。
或者,一些东西给予我们了解JVM中实际上是以什么方式使用CPU来确认/否认GC假设?
5条答案
按热度按时间t30tvxxf1#
我们可以从
1):选项-XX:+PrintGCTimeStamps将在每次收集开始时添加时间戳。这对于查看垃圾收集发生的频率非常有用。
使用上面的选项,我们可以得到粗略的估计,无论您是否假设该进程正在英勇地进行GC'ing,从而导致CPU峰值。
如果你的假设是正确的,那么开始调整你的GC。
有关JVM中Gc调优的更多信息,请参阅this,有关vm调试选项,请检查此
vybvopom2#
并行收集器和并发收集器有一个“开销限制”,它可能会做你想做的事情:
如果总时间的98%以上用于垃圾回收,而回收的堆不到2%,则将引发OutOfMemoryError
有关详细信息,请参阅http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html。
30byixjq3#
最好的办法是找出内存泄漏并修复它。
一种在高内存使用情况下退出的简单方法:
wfsdck304#
尝试查看JVM中当前正在运行哪些进程。
jstack
,你可以创建一个线程转储(也有其他方法可以做到这一点)jvisualvm
,您可以查看JVM的当前状态(需要一些资源)verbosegc
(以证明GC是频繁的)wsewodh25#
您需要找到一种方法来收集一些关于GC工作的统计数据。实际上有一些方法可以做到这一点。我不会做复制粘贴,只是给予你类似的问题的链接:
Can you get basic GC stats in Java?
我相信,你会想到如何分析这个统计数据,并决定何时GC是不断活跃的。
因为这个问题包含了GC统计应用的一些新的想法,我不认为它是重复的。