JVM进行完整的GC,然后没有更多的系统内存剩余



我有一个Java web应用程序,当JVM进行FGC时,没有更多的内存剩余,然后将使用交换,并且负载增长很快。我不明白为什么,有人能帮我吗?

您似乎已经将最大堆大小(-Xmx)设置得足够高,以至于JVM没有任何内存用于垃圾收集。因此,系统用完RAM并开始交换到磁盘。

你可以从减少-Xmx或增加一些RAM到你的系统开始,并找出是什么让你的应用程序消耗这么多内存。

您的Java堆大小对于您正在处理的数据工作集来说太低了,或者您有内存泄漏,占用了本来可以用于有用处理的内存。

您的第一个攻击点可能是使用分析器来准确地了解什么正在消耗内存。JVisualVm是一个略显简单但功能强大的分析器。从那里,您可以决定是否需要分配更多内存(通过-Xmx VM参数),修复内存泄漏或进行算法改进。

启用完全GC日志记录,这样您就可以看到堆中发生了什么。

  • 计算实时数据集、分配率和提升率。这将告诉您是否需要更大的Heap或者您的eg。年轻一代太小,或者如果你的幸存者空间已经满了,等等
  • 计算总GC时间,它应该是总运行时间的<5%。

使用-XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion