我读过这个Process Memory Vs Heap -- JVM,我也有同样的问题。
jvm进程内存使用量一直在增加,而且从未收缩。我在linux服务器上做了一个顶部检查。应用程序正在将作业调度到集群(使用Quartz +)
java堆空间在应用程序生命周期期间保持在限制范围内,但是jvm进程显示内存使用量正在稳步上升,并且永远不会下降。
这是内存泄漏吗?如果是这样的话,为什么堆空间在限制之内。有人能解释一下吗。
更新:,我有-Xmx1600m -Xms1600m,当我通过jconsole跟踪时,我可以很好地看到堆空间在这个限制范围内--大约450米--但是顶部的命令显示进程使用的时间超过900米。
发布于 2011-07-22 06:40:47
使用的总虚拟内存是最大堆+线程堆栈+直接内存+ perm gen +共享库的总和。这永远不会缩小。
实际使用的主内存取决于占用了多少虚拟内存。共享库是共享的,因此拥有多个JVM不会导致内存加倍等等。
JVM从不向操作系统释放内存,但是如果很长一段时间没有使用主内存,则可以在需要时将内存交换出去。
发布于 2011-07-22 05:26:58
实际的内存消耗比用Xmx等设置的内存更多,这是正常的。java将为其他事情分配内存,包括每个线程的堆栈。VM的总内存消耗超过-Xmx的值并不少见。
发布于 2012-07-31 08:29:44
参数-Xmx1600m -Xms1600m告诉JVM至少分配1600 at内存,最多分配1600 at内存。因此JVM应该在启动时分配1600 it,并且永远不要释放它。
如果您希望JVM将内存释放回操作系统,那么-Xms应该很低,您可能需要在新的G1垃圾收集器中使用Java1.7。/wp/?P=14。
使用MacOSX10.8和Java1.7和-Xms32m -Xmx256m -XX:+UseG1GC -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10,在运行System.gc()之后,将将内存释放回操作系统。
https://stackoverflow.com/questions/6785754
复制相似问题