【发布时间】: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