我正在与一个开发在1GB
Linux目标系统上运行的Java GUI应用程序的团队合作.
我们有一个问题,我们的java进程使用的内存无限期地增长,直到Linux终于杀死了java进程.
我们的堆内存健康稳定. (我们广泛地分析了我们的堆)我们还使用MemoryMXBean监视应用程序的非堆内存使用情况,因为我们认为问题可能在这里.但是,我们看到的报告的堆大小报告的非堆大小保持稳定.
以下是使用1GB RAM(由MemoryMXBean报告的堆和非堆,使用Linux的顶级命令(驻留内存)监视的Java进程使用的总内存))在目标系统上运行应用程序时的数字的示例.
在启动时:
> 200 MB堆提交
> 40 MB非堆提交
> java进程使用320 MB
1天后:
> 200 MB堆提交
> 40 MB非堆提交
> java进程使用的360 MB
2天后:
> 200 MB堆提交
> 40 MB非堆提交
> java进程使用的400 MB
上面的数字只是我们系统执行的“更干净”的代表,但它们是相当准确和接近现实的.正如你所看到的,趋势是明确的.运行应用程序几周后,由于系统内存不足,Linux系统开始出现问题.事情开始放缓.再过几个小时之后,Java进程就被杀死了.
经过几个月的分析,并试图弄清楚这一点,我们仍然在亏损.我觉得很难找到关于这个问题的信息,因为大多数讨论最终解释堆或其他非堆内存池. (如Metaspace等)
我的问题如下:
>如果你打破它,java进程使用的内存包括什么? (除堆和非堆内存池之外)
>哪些其他潜在的来源有内存泄漏? (本机代码?JVM开销?)哪些是一般的,最可能的罪魁祸首?
>如何一个监视器/配置文件这个内存?堆堆之外的所有东西目前对我们来说都是一个黑匣子.
任何帮助将不胜感激.