如何调优一个jvm使其崩溃而不是英勇地GC直到100%的CPU利用率?

np8igboo  于 11个月前  发布在  其他
关注(0)|答案(5)|浏览(63)

我们有一个JVM进程,它不经常将CPU固定在100%,看起来(根据visualgc)是一个非常接近耗尽的堆。我们的假设是,进程正在英勇地进行GC,导致CPU峰值,这会影响整个系统的整体健康状况(由其他JVM组成)。
此过程并不重要,可以重新启动。有没有一种方法可以通过命令行来调优JVM,让它自己倒在自己的剑上,而不是让它继续GC'ing并导致整个机器受到影响?
值得注意的是,我们没有得到OOMCepception,所以堆没有完全耗尽,但我们认为只是勉强没有。
或者,一些东西给予我们了解JVM中实际上是以什么方式使用CPU来确认/否认GC假设?

t30tvxxf

t30tvxxf1#

我们可以从
1):选项-XX:+PrintGCTimeStamps将在每次收集开始时添加时间戳。这对于查看垃圾收集发生的频率非常有用。
使用上面的选项,我们可以得到粗略的估计,无论您是否假设该进程正在英勇地进行GC'ing,从而导致CPU峰值。
如果你的假设是正确的,那么开始调整你的GC。

Both parallel collector and Concurrent Collector will throw an OutOfMemoryError if too much time is being
 spent in garbage collection: if more than 98% of the total time is spent in garbage collection and 
less than 2% of the heap is recovered, an OutOfMemoryError will be thrown. the option X:-UseGCOverheadLimit 
 is enabled by default for both Parallel and concurrent collector . Check whether this option is disabled in
 your system .

有关JVM中Gc调优的更多信息,请参阅this,有关vm调试选项,请检查此

vybvopom

vybvopom2#

并行收集器和并发收集器有一个“开销限制”,它可能会做你想做的事情:
如果总时间的98%以上用于垃圾回收,而回收的堆不到2%,则将引发OutOfMemoryError
有关详细信息,请参阅http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html

30byixjq

30byixjq3#

最好的办法是找出内存泄漏并修复它。
一种在高内存使用情况下退出的简单方法:

if(Runtime.getRuntime().totalMemory()>100*1024*1024)
    System.exit(0);
wfsdck30

wfsdck304#

尝试查看JVM中当前正在运行哪些进程。

  • 使用jstack,你可以创建一个线程转储(也有其他方法可以做到这一点)
  • 使用jvisualvm,您可以查看JVM的当前状态(需要一些资源)
  • 同时打开verbosegc(以证明GC是频繁的)
wsewodh2

wsewodh25#

您需要找到一种方法来收集一些关于GC工作的统计数据。实际上有一些方法可以做到这一点。我不会做复制粘贴,只是给予你类似的问题的链接:
Can you get basic GC stats in Java?
我相信,你会想到如何分析这个统计数据,并决定何时GC是不断活跃的。
因为这个问题包含了GC统计应用的一些新的想法,我不认为它是重复的。

相关问题