假设我有一个有内存泄漏的应用程序。在某些时候,GC会非常努力地清除内存,并且会降低我的应用程序的速度。我知道,如果为JVM -XX:-UseGCOverheadLimit设置此参数,它将抛出OutOfMemoryException:


如果超过98%的总时间花在了垃圾回收上,而回收的少于2%。


但是,这对我来说还不够好。因为即使在这些数字达到之前,我的应用程序也会变得非常缓慢。在抛出OutOfMemoryException之前,GC将占用CPU一段时间。我的目标是以某种方式尽早识别是否最可能出现问题,然后抛出OutOfMemoryexception。在那之后,我有了某种恢复策略。

好的,现在我发现了这两个附加参数GCTimeLimit和GCHeapFreeLimit。使用它们可以调整两个引用的常数(98%和2%)。

我自己做了一些测试,就像一小段代码,这会导致内存泄漏并使用这些设置进行播放。但是我不确定如何找到正确的权衡。我希望其他人也遇到同样的问题,并提出了合理的解决方案,或者也许还有其他我不知道的GC开关。

由于我不是这个主题的专家,我感到有些失落,而且似乎还有很多事情可以考虑。

最佳答案

您可以使用java.lang.management.MemoryUsage确定已用内存和可用总内存。当它接近可调的GC收集阈值时,您可能会抛出错误。

当然这样做有点荒谬。如果问题是您需要更多内存,则增加堆大小。更有可能的问题是,使用完内存后,您不能优雅地释放内存。

关于java - 如何防止垃圾收集器拖慢我的应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8527637/

10-10 19:23