我们有一个JVM进程,它很少将CPU占用100%,看起来(根据visualgc)是一个非常接近耗尽的堆。我们的假设是,该进程正在大刀阔斧地进行GC,从而导致CPU峰值,从而影响整个系统(由其他JVM执行不同任务)的整体健康状况。
此过程并不重要,可以重新启动。有没有办法通过命令行调优JVM,让它自食其力,而不是让它继续GC‘并导致整个机器都受到影响?
值得注意的是,我们没有得到OOMExceptions,所以堆并没有完全耗尽,但我们认为只是勉强没有耗尽。
或者,一些东西可以让我们深入了解JVM中实际使用CPU的方式,以确认/否认我们的GC假设?
发布于 2013-01-18 17:37:51
我们可以从以下地址获取统计数据
1):选项-XX:+PrintGCTimeStamps将在每个集合的开始处添加一个时间戳。这对于查看垃圾收集发生的频率很有用。
有了上面的选项,我们可以得到粗略的估计,无论您是否假设该进程正在英勇地进行GC,从而导致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调试选项,请查看this
发布于 2013-01-18 03:25:35
并行和并发收集器有一个“开销限制”,它可能会执行您想要的操作:
如果总时间的98%以上花费在垃圾收集上,而恢复的堆不足2%,则将抛出OutOfMemoryError
有关详细信息,请参阅http://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html。
发布于 2013-01-18 02:49:46
最好的办法是找出内存泄漏并修复它。
一种在内存使用率较高时退出的简单方法:
if(Runtime.getRuntime().totalMemory()>100*1024*1024)
System.exit(0);https://stackoverflow.com/questions/14385753
复制相似问题