2012-01-10 75 views
3

我想运行一个jar文件,但我想处理jvm最大堆大小。大小我使用-Xmx80m参数为了设置最大头大小80MB。我使用我的Linux操作系统的“顶部”命令来监视我的应用程序的内存分配,我很惊讶,与使用-Xmx参数(java -Xmx80m -jar myapp.jar)指定的相比,jvm使用的内存更多。更具体地讲,从我的首要输出java最大堆大小和操作系统顶部输出

VIRT:257米
RES:109米

我认为RES应该是最大80MB,如果我的应用程序需要超过80MB的JVM更会特罗例外“内存不足”(或这样的事情)

在我的应用程序我使用外部库。除了我用param指定的堆外,这个库是否使用自己的内存?

在任何情况下,如何限制jvm的内存使用量,以便不克服我使用参数设置的内容?

更新:
使用ulimit(unix命令)限制JVM使用的资源是否是一个很好的解决方案?

我使用:

Java版本 “1.7.0_02”
的Java(TM)SE运行时环境(建立1.7.0_02-B13)
的HotSpot的Java(TM)服务器VM(生成22.0 -B10,混合模式)

在Fedora 8的PC

+0

“堆大小”!=“JVM使用的内存”。顺便说一下,在这些情况下,您使用的是什么JVM /版本以及哪个平台很重要。 – Viruzzo 2012-01-10 14:59:05

回答

2

你不应该指望-Xmx会放置一个硬约束由JVM使用的内存总量。

-Xmx对Java堆的大小有限制。 Java堆外的任何内存都不受此限制。这包括代码,类元数据,常量池等。

您可以调整的另一件事是永久空间的大小(-XX:MaxPermSize),因为它不包含在-Xmx中。

2

-mx-Xmx选项设置最大堆大小。该虚拟内存在启动时分配,并在程序运行时使用。正如@aix所指出的,非堆内存可以更多。

外部本地库将使用自己的非堆内存。最大限度会限制所有库的堆。 (其预先分配且不能增加)