Java JVM生成一个完整的GC,然后就没有更多的系统内存了

Java JVM生成一个完整的GC,然后就没有更多的系统内存了,java,garbage-collection,jvm,Java,Garbage Collection,Jvm,我有一个javaweb应用程序,当JVM生成FGC时,没有更多的内存了,然后将使用swap,负载正在快速增长。我不明白为什么有人能帮我 您似乎已将最大堆大小(-Xmx)设置得足够高,以至于JVM没有剩余内存用于垃圾收集。因此,系统耗尽RAM并开始交换到磁盘 您可以从减少-Xmx或向系统中添加一些RAM开始,并找出是什么原因导致应用程序占用了如此多的内存。您的Java堆大小对于正在处理的数据量来说太小,或者您的Java堆占用了原本可以用于有用处理的内存 您的第一个攻击点可能是使用一个工具来准确地了

我有一个javaweb应用程序,当JVM生成FGC时,没有更多的内存了,然后将使用swap,负载正在快速增长。我不明白为什么有人能帮我

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


您可以从减少
-Xmx
或向系统中添加一些RAM开始,并找出是什么原因导致应用程序占用了如此多的内存。

您的Java堆大小对于正在处理的数据量来说太小,或者您的Java堆占用了原本可以用于有用处理的内存


您的第一个攻击点可能是使用一个工具来准确地了解什么在消耗内存。是一个有点肤浅但有能力的探查器。从那里,您可以决定是否需要分配更多内存(通过
-Xmx
VM参数)、修复内存泄漏或进行算法改进。

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

  • 计算实时数据集、分配率和促销率。这将告诉你是否需要一个更大的堆,或者你的年轻一代是否太小,或者你的幸存者空间是否溢出,等等

  • 计算总GC时间,应该是多少?JvisualVMi有5G内存,-Xmx我设置为2048m,所以还剩下3G。但你系统上的其他应用可能使用的超过3G。您最了解系统上运行的是什么。有没有办法找出“在linux平台的特定时间内哪个进程使用的内存最多”?您最好的办法是监视系统变量。为了监视JVM,可以考虑使用与JDK绑定的<代码> J控制台< /代码>。谢谢您的回答,我将尝试。