我有一台 Windows 7 笔记本电脑,配备 16GB RAM。当我运行多个 java 服务器时,我收到 OutOfMemory 错误,但是,Windows 任务管理器显示我仍然有 6GB 的可用物理内存。在我看来,我的 JVM 只能为所有正在运行的 Java 应用程序分配 ~2GB 堆。
所以我写了一些非常简单的Java代码:
public class HelloWorld {
public static void main(String[] args) {
for(;;) System.out.println("Hello, World");
}
}
我的-jvm版本:
$ java -version
java version "1.8.0_111"
Java(TM) SE Runtime Environment (build 1.8.0_111-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.111-b14, mixed mode)
JAVA_HOME“C:\Program Files\Java\jdk1.8.0_111”
JRE_HOME“C:\Program Files\Java\jre1.8.0_111”
我做了一个简单的java -Xmx256m -Xms256m HelloWorld
并且它按预期工作,但是当我切换到java -Xmx2048m -Xms2048m HelloWorld
时我得到以下信息:
Error occurred during initialization of VM
Could not reserve enough space for object heap
我尝试了多个 JDK,但都不起作用。 Windows和JVM都是64位的。
我可以做什么来解决这个问题?
最佳答案
It seems like to me that my JVM can only allocate ~2GB heap for all running java apps.
这是不正确的。 JVM 能够请求并使用 >2GB 的堆。
Windows 肯定限制了 Java 进程的请求。也可能是 Windows 为多个 Java 进程保留了内存,但该内存显示为空闲,因为 JVM 尚未使用它。
FWIW,使用比实际需要更多的内存运行 JVM 并不是一个好主意。
修复?
别这样做。不要在笔记本电脑上运行大量 2GB Java 服务器,或者将堆大小减小到更合理的大小。过度使用内存是一个很有吸引力的想法,直到 JVM 开始使用您分配给它们的所有内存为止。然后你的系统就会崩溃......
以不同的方式去做。您可以在单个 JVM 中运行多个服务器。
获取更多内存。
关于java - 64 位 JVM 无法为对象堆保留足够的空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40941522/