Java垃圾收集导致延迟影响性能

6 java performance garbage-collection

我注意到我的应用程序中出现了一个奇怪的现象.我将对象提交到服务器后将其存储在Hashmap中,并在响应到达时将其删除.

我最近注意到跑步后性能非常慢.检查后,我发现内存使用率保持在4GB,然后下降到小于1 GB.我怀疑它正在清理很多对象,这就是性能变得如此糟糕的原因.

所以问题是为什么Java收垃圾收集这么晚?也就是说,为什么要等到堆满了然后再进行垃圾收集呢?不应该定期收集垃圾.

存储在HashMap中的对象就是在那个时候创建​​的,也就是说它们并不长久.

这是在Linux(RHEL),Oracle JVM HotSpot 7. 64位上.4核心.这就是应用程序的运行方式:

java -jar -Xmx4g prog.jar

注意:我已经看到了这一点:调整垃圾收集以获得低延迟但是现在我想了解为什么GC需要这么长时间才能启动?

whe*_*ies 3

听起来您遇到了以下两个问题之一:

  1. 如果您有半长寿命的对象,它们将从年轻代移动到较旧的对象(例如在 HotSpot 上移动到Mark-Compact 代)。也就是说,它们将停止对收集进行引用计数,并开始保留以供较慢的对象使用。 GC。
  2. 您的年轻代堆空间对于您的使用模式来说太小,迫使对象从年轻代移动到老一代。

我会考虑调整你的年轻一代,使其规模更大。请参阅分代垃圾收集并查看各种类型的代。