JVM生成一个完整的GC,然后就不再有系统内存了

时间:2013-05-31 04:52:51

标签: java garbage-collection jvm

我有一个Java Web应用程序,当JVM生成FGC时,没有剩余内存,然后将使用交换,并且负载正在快速增长。我不能低估为什么,任何人都可以帮助我?

3 个答案:

答案 0 :(得分:2)

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

您可以先减少-Xmx或在系统中添加一些内存,然后了解您的应用消耗了大量内存的原因。

答案 1 :(得分:1)

您的Java堆大小对于正在处理的working set数据来说太低,或者您有memory leak正在消耗可能用于有用处理的内存。

你的第一个攻击点可能是使用profiler来准确理解消耗内存的内容。 JVisualVm是一个有点骨干但很称职的探究者。从那里,您可以决定是否需要分配更多内存(通过-Xmx VM参数),修复内存泄漏或进行算法改进。

答案 2 :(得分:0)

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

  • 计算实时数据集,分配率和促销率。这将告诉您是否需要更大的堆或者如果您需要更大的堆。 Young Gen太小,或者你的幸存者空间溢出等等。
  • 计算总GC时间,应该<总运行时间的5%。

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

相关问题