我已经阅读了这个Process Memory Vs Heap -- JVM
和我有同样的问题。
jvm进程的内存使用量一直在增加,而且从未减少。我通过在linux服务器上执行top进行检查。该应用程序正在将作业调度到群集(使用Quartz + Sun Java DRMAA API)
Java堆空间在应用程序生命周期内保持在限制之内,但是jvm进程显示内存使用率稳定增长,并且从未下降。
这是内存泄漏吗?如果是这样,为什么堆空间在限制之内。有人可以解释一下。
更新:当我通过jconsole跟踪时,我有-Xmx1600m -Xms1600m,我可以看到堆空间恰好在此限制450m之内,但顶部命令显示该进程正在使用900m以上的内存。
最佳答案
使用的总虚拟内存是最大堆+线程堆栈+直接内存+ perm gen +共享库的总和。这永远不会缩小。
实际使用的主内存取决于已占用的虚拟内存量。共享库是共享的,因此拥有多个JVM不会导致此内存加倍等。
JVM从不向操作系统释放内存,但是,如果长时间不使用主内存,可以在需要时将其交换出来。