姬長信(Redy)

java – JVM内存使用失控


我有一个Tomcat webapp,它代表客户端执行一些漂亮的内存和CPU密集型任务.这是正常的,是所需的功能.但是,当我运行Tomcat时,内存使用量会随着时间的推移而猛增至4.0GB以上,此时我通常会杀死该进程,因为它会破坏我在开发计算机上运行的所有其他内容:

我以为我无意中用我的代码引入了内存泄漏,但在用VisualVM检查后,我看到了一个不同的故事:

VisualVM显示堆占用大约一GB的RAM,这就是我用CATALINA_OPTS =“ – Xms256m -Xmx1024”设置的.

根据VisualVM的说法,为什么我的系统认为这个过程占用了大量的内存,它几乎没有占用任何内容?

经过一番进一步的嗅探,我注意到如果在应用程序中同时运行多个作业,则内存不会被释放.但是,如果我在将另一个作业提交给由ExecutorService提供服务的BlockingQueue之前等待每个作业完成,那么内存将被有效地回收.我该怎么调试呢?为什么垃圾收集/内存重用会有所不同?