【问题标题】:Increasing the JVM maximum heap size for memory intensive applications为内存密集型应用程序增加 JVM 最大堆大小
【发布时间】:2011-03-03 02:19:09
【问题描述】:

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

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

  • 使用-XX:+AggressiveHeap option。当我尝试这种方法时,我收到一个“内存不足”错误,表明堆大小为 1273.4 MB,即使我的计算机有 8GB 内存。

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

  • 操作系统:Windows 7(64 位)
  • 处理器:Intel Core i7 (2.66 GHz)
  • 内存:8 GB
  • java -版本:
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)

【问题讨论】:

  • 顺便说一句:最小和最大内存大小现在是标准选项。您可以使用 -ms 和 -mx 代替 -Xms 和 -Xmx。 -X??为非标准选项保留。
  • 哪个 JVM 的标准?对于 HotSpot JVM(从 1.8 开始),它们仍然是非标准的。见docs.oracle.com/javase/8/docs/technotes/tools/unix/…
  • -mx 和 -ms 存在并且有效,但我在官方 java 文档中找不到它@PeterLawrey > 你可以添加文档链接吗?谢谢
  • @MichalBernhard 它向后兼容 Java 1.1。我看到它记录了该版本,但现在可能很难找到。 ;)
  • 感谢@PeterLawrey 的解释。但是当您说它现在是标准时,您的意思是它是 Java 1.1 的标准(但在以后的版本中不是文档)?看起来很奇怪 :) 顺便说一句,我在 Java 1.1 文档上找到了链接,你是对的:ad.ntust.edu.tw/course/ad5601701/jmdl/docs/java/tooldocs/win32/…

标签: java jvm jvm-arguments


【解决方案1】:

当您在 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位版本。
  • 我试过 JVM 64 位,它运行良好。我现在可以设置 4096 MB 的最大堆大小。当您同时安装了 32 位和 64 位时,至少在 Windows 上,您需要将应用程序的 Java 路径指向安装的新 64 位版本。否则,错误将持续存在。在 Windows 上,这通常可以通过更改系统环境变量中的 Java 路径来完成。
  • 我猜最大堆的限制不是 1280,而是接近 1700MB。我在 32 位 JVM 安装上使用了 1600MB 的最大堆,它运行良好。
  • 你的命令中的 HelloWorld 参数是什么?如果我想在 linux 上设置使用 java -jar myApp.jar 命令启动的 Java 进程的最大值,如何使用此命令?
  • 您好,请问我可以设置的最大 java 堆大小是多少?当我运行应用程序时,我的机器上默认的-Xmx是4GB,但我可以将它设置为超过4GB吗?
【解决方案2】:

Oracle 获取一个 64 位 JVM。

【讨论】:

  • 为我工作 :-) 使用 -Xmx4g 运行应用程序,到目前为止没有问题。
【解决方案3】:

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

【讨论】:

  • -D64 选项不起作用,我会按照 GregS 的建议尝试使用 64 位 JVM 并报告结果。
  • -d64 和 -d32 开关仅在 Solaris 上正常工作(至少根据这些文档):java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering
  • 我已经尝试了这两个选项。使用 -d64 时,即使我没有指定 Xmx 选项,JVM 也无法启动。 -D64 仅在我不指定 Xmx 时才有效。
  • @Lukasz -d64 和 -d32 似乎也适用于 Apple 的 JVM。但该文档似乎暗示它们对 Sun 的 Windows 和 Linux JVM 不起作用。
【解决方案4】:

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

Oracle 32 bit heap FAQ

引用

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

【讨论】:

    【解决方案5】:

    下面的 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 "$@"
    

    【讨论】:

      【解决方案6】:

      就我而言,

      -Xms1024M -Xmx1024M 有效

      -Xms1024M -Xmx2048M 结果:无法为对象堆保留足够的空间

      使用 JVM 64 位后,允许使用 2GB RAM,因为我使用的是 win server 2012

      请查看多个操作系统上 JVM 32 位可用的最大堆大小

      https://www.codementor.io/@suryab/does-32-bit-or-64-bit-jvm-matter-anymore-w0sa2rk6z

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 2013-01-01
          • 2016-07-18
          • 2010-11-29
          • 1970-01-01
          • 1970-01-01
          • 2012-04-04
          • 2011-07-24
          • 2012-03-25
          相关资源
          最近更新 更多