我有一个Java Web应用程序,当JVM生成FGC时,没有剩余内存,然后将使用交换,并且负载正在快速增长。我不能低估为什么,任何人都可以帮助我?
答案 0 :(得分:2)
您似乎已将最大堆大小(-Xmx)
设置得足够高,以至于JVM没有任何内存可用于垃圾回收。因此,系统耗尽RAM并开始交换到磁盘。
您可以先减少-Xmx
或在系统中添加一些内存,然后了解您的应用消耗了大量内存的原因。
答案 1 :(得分:1)
您的Java堆大小对于正在处理的working set数据来说太低,或者您有memory leak正在消耗可能用于有用处理的内存。
你的第一个攻击点可能是使用profiler来准确理解消耗内存的内容。 JVisualVm是一个有点骨干但很称职的探究者。从那里,您可以决定是否需要分配更多内存(通过-Xmx
VM参数),修复内存泄漏或进行算法改进。
答案 2 :(得分:0)
启用完整GC日志记录,以便您可以查看堆中发生的情况。
使用-XX:+PrintTenuringDistribution -XX:+UnlockDiagnosticVMOptions -XX:+LogVMOutput -XX:LogFile=jvm.log -XX:+HeapDumpOnOutOfMemoryError -Xloggc:gc.log -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -showversion