在这种Java方案中,内存泄漏在哪里?

时间:2019-06-03 18:13:29

标签: java memory-leaks

我正在内存不足的主机上使用Java应用程序,并导致JVM崩溃。

JVM是8。例如,我在16gb主机(运行Linux)上将Xms和Xmx设置为10240m。随着时间的流逝,我监视JVM堆(例如使用JMX或Java代理),并且使用情况保持一致且在范围之内。 GC会定期运行并清理,并且所有内存空间都不会随时间增长。

但是在主机操作系统上,我通过ps-vsizesize参数监控内存使用情况,保持一致,但是pmem随时间增加(我认为{ {1}},但只是刚刚开始对其进行监视)。 pmem使用率达到99%,然后jvm无法分配内存并退出。我怀疑rss会随着时间的推移而增加(它已经开始以这种方式移动)。

这是否表明JVM正在运行的Java应用程序中存在内存泄漏?我认为JVM本身不太可能发生内存泄漏。并且运行在rss上的代理已被广泛使用,因此也不要这样。那是一个很好的猜测吗?如果这是基于应用程序的内存泄漏,则可能发生什么类型的泄漏,或者找到它的好方法是什么?像JMX之类的东西似乎并没有提供任何东西,它看起来像是JVM并不知道的分配在内存中的东西。

谢谢。

1 个答案:

答案 0 :(得分:1)

恐怕您将不得不调试此问题,无法得知服务器上正在运行什么。

您可以通过使用-Xms10240m启动选项预先分配JVM堆内存来改善这种情况。如果-Xms等于-Xmx,则不会调整JVM堆内存的大小。

由于您使用的是Java 8,因此应检查Metaspace memory的利用率。默认情况下没有限制,因此潜在的类加载器可能会泄漏内存。您可以设置-XX:MaxMetaspaceSize=512m启动选项。

第三种可能的罪魁祸首是使用堆外内存的第三方库,例如一些缓存库直接在JVM堆外部访问内存。