JVM进程与JVM堆内存使用情况

时间:2011-07-22 04:46:28

标签: java memory process jvm heap

我已阅读此Process Memory Vs Heap -- JVM  我有同样的问题。

jvm进程内存使用量不断增加而且从不收缩。我通过在linux服务器上执行顶部检查。应用程序正在将作业调度到集群(使用Quartz + Sun Java DRMAA API)

java堆空间在应用程序生命周期中保持在限制范围内,但是jvm进程显示内存使用量稳步攀升并且永远不会下降。

这是内存泄漏吗?如果是这样,为什么堆空间在限制范围内。有人可以解释一下。

更新:当我通过jconsole跟踪时,我有-Xmx1600m -Xms1600m我可以看到堆空间在这个限制范围内,距离为450m,但top命令显示该进程使用的时间超过900m。

4 个答案:

答案 0 :(得分:11)

使用的总虚拟内存是最大堆+线程堆栈+直接内存+ perm gen +共享库的总和。这永远不会缩小。

使用的实际主内存取决于占用了多少虚拟内存。共享库是共享的,因此拥有多个JVM不会导致此内存加倍等。

JVM永远不会向操作系统释放内存,但是如果长时间不使用主内存,则可以在需要时将其换出。

答案 1 :(得分:2)

实际内存消耗量大于您使用Xmx等设置的内存消耗量,这是正常的。 “java将为其他东西分配内存,包括每个线程的堆栈。虚拟机的总内存消耗超过-Xmx的值并不罕见。”

答案 2 :(得分:1)

参数-Xmx1600m -Xms1600m告诉JVM最少分配1600MB内存,最多分配1600MB内存。所以JVM应该在启动时分配1600MB而从不释放它。

如果您希望JVM将内存释放回操作系统,则-Xms应该尽可能低,并且您可能必须将Java 1.7与新的G1垃圾收集器一起使用。 stefankrause.net/wp/?p=14。

将Mac OS X 10.8和Java 1.7与-Xms32m -Xmx256m -XX一起使用:+ UseG1GC -XX:MinHeapFreeRatio = 5 -XX:MaxHeapFreeRatio = 10在运行System.gc()后,内存将释放回操作系统

答案 3 :(得分:0)

在堆中,Java虚拟机(JVM)存储由Java应用程序创建的所有对象,例如:通过使用“新”运算符。 Java垃圾收集器(gc)可以在逻辑上将堆分成不同的区域,这样gc可以更快地识别可以被删除的对象

新对象的内存在运行时在堆上分配。实例变量存在于声明它们的对象中。

Stack是存储方法调用和局部变量的地方。如果调用了一个方法,则将其堆栈帧放在调用堆栈的顶部。堆栈帧保存方法的状态,包括执行哪行代码和所有局部变量的值。堆栈顶部的方法始终是该堆栈的当前运行方法。线程有自己的调用堆栈。

如前所述,Java对象是在堆中创建的。编程语言不允许程序员决定是否应该在堆栈中生成对象。但在某些情况下,最好在堆栈上分配一个对象,因为堆栈上的内存分配比堆中的内存分配便宜,堆栈上的释放是免费的,堆栈由运行时有效管理。 / p>

JVM因此使用内部转义分析来检查对象是否仅用于线程或方法。如果JVM识别出这一点,它可能决定在堆栈上创建对象,从而提高Java程序的性能。 (http://www.ibm.com/developerworks/java/library/j-nativememory-linux/)