增加JVM最大堆大小以应对内存密集型应用程序

97

我需要运行一个占用2GB以上内存的Java应用程序,但是我无法增加堆最大大小。到目前为止,我尝试了以下方法:

  • 设置-Xmx参数,例如-Xmx3000m。这种方法在创建JVM时失败了。从我搜索得到的信息来看,-Xmx必须小于2GB。

  • 使用-XX:+AggressiveHeap选项。当我尝试这种方法时,我会收到“内存不足”的错误消息,告诉我堆大小为1273.4 MB,即使我的计算机有8GB的内存。

是否有其他方法可以尝试增加JVM的最大堆大小?以下是计算机规格的摘要:

  • 操作系统:Windows 7(64位)
  • 处理器:Intel Core i7(2.66 GHz)
  • 内存:8 GB
  • java -version:
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)

7
顺便提一句:最小和最大内存大小现在是标准选项。您可以使用 -ms 和 -mx 代替 -Xms 和 -Xmx。-X?? 保留用于非标准选项。 - Peter Lawrey
2
JVM 的标准是什么?截至 1.8 版本,它们在 HotSpot JVM 中仍然是非标准的。请参阅 http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html#BABDJJFI。 - Huckle
-mx和-ms是存在且可用的,但我在官方Java文档中找不到相关内容。@PeterLawrey > 你能否添加文档链接?谢谢。 - Michal Bernhard
2
@MichalBernhard 这是与Java 1.1的向后兼容性。我看到它在那个版本中有记录,但现在可能很难找到。 ;) - Peter Lawrey
1
感谢@PeterLawrey的解释。但是当你说现在它成为标准时,你是指从Java 1.1开始就成为标准了吗?这似乎很奇怪 :)顺便说一句,我在Java 1.1文档中找到了链接,你是正确的: http://www.ad.ntust.edu.tw/course/ad5601701/jmdl/docs/java/tooldocs/win32/java.html - Michal Bernhard
7个回答

106

如果你在32位模式下使用JVM,可以分配的最大堆大小为1280 MB。因此,如果你想超出这个限制,需要在64位模式下启动JVM。

你可以使用以下命令:

$ java -d64 -Xms512m -Xmx4g HelloWorld

其中,

  • -d64:启用64位JVM
  • -Xms512m:将初始堆大小设置为512 MB
  • -Xmx4g:将最大堆大小设置为4 GB

您可以根据自己的要求调整-Xms和-Xmx(效果因人而异)

有一个非常好的JVM性能调优资源,您可能会感兴趣:http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html


我的JVM是32位的,最大允许-Xmx1024M。我还打算尝试64位版本。 - kiltek
我已经尝试了JVM 64位版本,它完美地运行了。现在我可以设置最大堆大小为4096 MB。 当你同时安装了32位和64位版本时,在Windows系统上,你需要将Java路径指向新安装的64位版本,否则错误将持续存在。 在Windows系统中,这通常可以通过更改系统环境变量中的Java路径来完成。 - Fabiano
我猜最大堆限制不是1280,而是接近1700MB。我在32位JVM安装中使用了1600MB的最大堆,它运行得很好。 - Fabiano
你的命令中的HelloWorld参数是什么?如果我想在Linux上使用这个命令来设置使用java -jar myApp.jar命令启动的Java进程的最大值,该怎么做? - LordScone
您好,我可以问一下我可以设置的最大Java堆大小是多少吗?当我运行应用程序时,我的机器上默认的-Xmx为4GB,但我可以将其设置为超过4GB吗? - user5567313

49

Oracle 获取一个64位的JVM。


1
对我有用 :-) 使用 -Xmx4g 运行应用程序,目前没有任何问题。 - Alceu Costa

15

我认为2GB的限制是针对32位Java的。我以为v1.6一直都是64位,但是可以尝试强制使用64位模式来验证:添加-d64选项。


-D64选项没有起作用,我会尝试使用GregS建议的64位JVM并报告结果。 - Alceu Costa
2
-d64和-d32开关仅在Solaris上正常工作(至少根据这些文档):http://java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering。 - Lukasz Stelmach
1
我已经尝试了两个选项。使用-d64选项,即使我不指定Xmx选项,JVM也无法启动。只有在我不指定Xmx时,-D64才能正常工作。 - Alceu Costa
@Lukasz -d64和-d32在苹果的JVM上似乎也能工作。但是该文档似乎暗示它们在Sun的Windows和Linux JVM上无法正常工作。 - G__

8

32位Java的最大限制为大约1.4到1.6 GB。

Oracle 32位堆FAQ

引用

32位JVM的最大理论堆限制为4G。由于各种额外的限制,例如可用交换空间、内核地址空间使用、内存碎片化和VM开销,在实践中,限制可能会低得多。在大多数现代32位Windows系统上,最大堆大小将从1.4G到1.6G不等。在32位Solaris内核上,地址空间限制为2G。在运行32位VM的64位操作系统上,最大堆大小可以更高,在许多Solaris系统上接近4G。


4

以下配置适用于我:

JAVA_HOME=/JDK1.7.51-64/jdk1.7.0_51/
PATH=/JDK1.7.51-64/jdk1.7.0_51/bin:$PATH
export PATH
export JAVA_HOME

JVM_ARGS="-d64 -Xms1024m -Xmx15360m -server"

/JDK1.7.51-64/jdk1.7.0_51/bin/java $JVM_ARGS -jar `dirname $0`/ApacheJMeter.jar "$@"

1

对于内存密集型应用程序,GraalVm可以作为更好的选择。提供32GB的最大堆大小和其他优点。 Hotspot vs Graal


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接