1

我有一个 Java Web 应用程序,当 JVM 进行 FGC 时,没有更多的内存剩余,然后将使用交换,并且负载正在快速增长。我无法理解为什么,有人可以帮助我吗?

4

3 回答 3

2

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

您可以从减少-Xmx或添加一些 RAM 到您的系统开始,并弄清楚是什么让您的应用程序消耗了如此多的内存。

于 2013-05-31T05:09:23.967 回答
1

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

您的第一个攻击点可能是使用分析器来准确了解消耗内存的内容。 JVisualVm是一个有点简单但称职的分析器。从那里,您可以决定是否需要分配更多内存(通过-XmxVM 参数)、修复内存泄漏或进行算法改进。

于 2013-05-31T05:29:51.893 回答
0

启用完整 GC 日志记录,以便您可以查看堆中发生的情况。

  • 计算实时数据集、分配率和提升率。这将告诉您是否需要更大的堆或您的例如。Young Gen 太小,或者您的 Survivor 空间溢出等。
  • 计算总 GC 时间,它应该小于总运行时间的 5%。

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

于 2013-05-31T17:29:18.710 回答