【问题标题】:JVM 64 is using a maximum of 2GB on Windows Server 2012 on AzureJVM 64 在 Azure 上的 Windows Server 2012 上使用最多 2GB
【发布时间】:2014-07-31 13:24:52
【问题描述】:

我在 Azure 上使用具有 7GB 内存的 Windows 2012 服务器。 我已经在机器上安装了 64 位 java。

在运行 jvm 时,我通过参数将最大堆大小设置为 4GB

-Xmx6g

但是,当我运行我的 jar 时,它遇到了 java OutOfMemory 异常。我在任务管理器运行时检查了它,它显示用于进程的内存在 2GB 左右达到峰值,并且从未超过该值。尽管我将 heapsize 设置为 6GB。

在我的本地 PC 上,我使用的是 8GM 内存的 Windows 7 机器,我没有遇到这个问题。

我在我的 java 应用程序中使用了以下命令

System.out.println(System.getProperty("sun.arch.data.model"));
System.out.println("Max Memory: " + Runtime.getRuntime().maxMemory());

它给了我以下信息:

Windows 服务器 2012

64
1670381568

本地电脑

64
6681001984

为什么 Windows Server 没有将全部内存分配给 JVM?有没有我遗漏的设置?

【问题讨论】:

  • 如果您尝试通过-Xms 设置最小堆大小,它有什么作用吗?
  • 我设置了 -Xms3g 但它没有帮助。最大内存仍然相同,任务管理器中的 ram 使用率仍然达到 2GB 的峰值。
  • 好的。这对我来说真的很愚蠢和愚蠢,但我找到了原因。当我需要将内存参数放在 java 命令之后时,我已经将内存参数放在了整个命令行的末尾。即我应该使用 java -jar "myapp.jar" "myArgs" -Xmx6g 而不是 java -Xmx6g -jar "myapp.jar" "myArgs"
  • 那么请发布答案:xkcd.com/979

标签: java windows azure jvm


【解决方案1】:

这对我来说真的很愚蠢和愚蠢,但我找到了原因。

当我需要将内存参数放在 java 命令之后时,我已经将内存参数放在了整个命令行的末尾。

即而不是

java -jar "myapp.jar" "myArgs" -Xmx6g 

我应该用过

java -Xmx6g -jar "myapp.jar" "myArgs"

【讨论】:

    【解决方案2】:

    要么没有考虑 -Xmx 参数,要么不允许进程从操作系统获取更多 RAM。

    我的建议:

    注意:我会使用评论,因为这实际上不是解决方案,但我还没有要点。如果这不是正确的贡献方式,我深表歉意。

    【讨论】:

      猜你喜欢
      • 2011-02-23
      • 2015-01-27
      • 2011-06-04
      • 1970-01-01
      • 2017-01-06
      • 2013-06-01
      • 2019-09-17
      • 1970-01-01
      • 2017-03-22
      相关资源
      最近更新 更多