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


88

我需要运行一个使用2GB以上内存的Java内存密集型应用程序,但是在增加堆最大大小时遇到​​了问题。到目前为止,我已经尝试了以下方法:

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

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

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

  • 作业系统:Windows 7(64 bit)
  • 处理器: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??保留用于非标准选项。
彼得·劳瑞

2
哪个JVM的标准?对于HotSpot JVM(从1.8版本开始),它们仍然是非标准的。请参阅docs.oracle.com/javase/8/docs/technotes/tools/unix/…–
Huckle

-mx和-ms存在并且可以工作,但是我在官方Java文档@PeterLawrey中找不到它>您可以添加文档链接吗?感谢
Michal Bernhard '18

2
@MichalBernhard它与Java 1.1向后兼容。我看到了该版本的文档,但现在可能很难找到。;)
彼得·劳瑞

1
感谢@PeterLawrey的解释。但是,当您说它现在是标准的时,您是说它是Java 1.1的标准(但不是更高版本的文档)吗?似乎很奇怪:)顺便说一句,我发现关于Java 1.1的链接文件和你是对的:ad.ntust.edu.tw/course/ad5601701/jmdl/docs/java/tooldocs/win32/...
米哈尔伯恩哈德

Answers:



96

在32位模式下使用JVM时,可以分配的最大堆大小为1280 MB。因此,如果您想超越此范围,则需要以64模式调用JVM。

您可以使用以下内容:

$ java -d64 -Xms512m -Xmx4g HelloWorld

哪里,

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

您可以根据需要调整-Xms和-Xmx(YMMV)

有关JVM性能调优的非常好的资源,可能需要研究一下:http : //java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html


我的JVM是32位的,最多允许-Xmx1024M。也将尝试64位版本。
kiltek13年

我已经尝试过64位JVM,它运行良好。我现在可以设置4096 MB的最大堆大小。当同时安装了32位和64位时,至少在Windows上,需要将应用程序的Java路径指向安装的新64位版本。否则,错误将继续存在。在Windows上,这通常可以通过更改系统环境变量上的Java路径来完成。
法比亚诺2015年

我猜最大堆的限制不是1280,而是接近1700MB。我在32位JVM安装上使用了1600MB的最大堆,并且运行良好。
法比亚诺2015年

您的命令中的HelloWorld参数是什么?如果要设置在Linux上以java -jar myApp.jar命令启动的Java进程的最大值,该如何使用此命令?
LordScone

嗨,请问我可以设置的最大Java堆大小是多少?运行应用程序时,我的计算机上的默认-Xmx为4GB,但是我可以将其设置为大于4GB吗?
玉珠

14

我相信2GB的限制适用于32位Java。我以为v1.6始终是64位,但尝试强制使用64位模式只是为了看看:添加-d64选项。


-D64选项不起作用,我将按照GregS的建议尝试使用64位JVM并报告结果。
Alceu Costa

1
-d64和-d32开关仅在Solaris上正确工作(至少根据这些文档):java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering
Lukasz Stelmach 2010年

我尝试过两种选择。使用-d64时,即使我未指定Xmx选项,JVM也无法启动。-D64仅在我未指定Xmx时有效。
Alceu Costa

@Lukasz -d64和-d32似乎也可以在Apple的JVM上运行。但是该文档似乎确实暗示它们对于Sun的Windows和Linux JVM不起作用。
G__10年

8

32位Java限于大约1.4到1.6 GB。

Oracle 32位堆常见问题解答

引用

32位JVM的最大理论堆限制为4G。由于各种其他限制,例如可用交换,内核地址空间使用,内存碎片和VM开销,实际上,限制可能要低得多。在大多数现代的32位Windows系统上,最大堆大小范围为1.4G至1.6G。在32位Solaris内核上,地址空间限制为2G。在运行32位VM的64位操作系统上,最大堆大小可能更高,在许多Solaris系统上接近4G。


4

下面的conf为我工作:

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 "$@"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.