Java GC:老一代变得越来越大,无法回收

wuc*_*ang 7 java garbage-collection

我正在编写我的servlet程序并使用jconsole和jmap来监视它的内存状态.我发现当我的程序运行时,Memory Pool"PS Old Gen"变得越来越大,最后我的servlet无法响应任何请求.

这是我的JConsole输出的截图:

在此输入图像描述

当我单击"执行GC"按钮时,什么也没发生.

所以,要查看详细信息,我使用jmap转储详细信息:

在此输入图像描述

这是我的JConsole VM Summary输出: 在此输入图像描述 任何人都可以帮我解决可能出现的问题?你知道,GC"PS MarkSweep"和"PS ​​SCavenge"是我的服务器JVM的默认GC.

谢谢.


我发现一个非常奇怪的现象:从昨天的18:00到今天的09:00的15个小时,似乎GC上的"PS Old Gen"从未发生过,这使得老一代的旧记忆变得越来越大.i只需手动点击"执行GC"按钮,似乎这个GC非常有效并且回收了大量内存.但为什么老一代GC不会自动发生这么长时间?我们可以看到,在昨天的18:00之前,旧一代GC正常工作. 在此输入图像描述

Mar*_*nik 1

您的内存泄漏发生在 MongoDB 代码中。您看到的大量映射条目很可能是BasicDBObject(在您的转储中排名#6)的内部结构,它扩展了HashMap. 您也许可以通过重新配置 MongoDB 组件来解决该问题。