java - 64 位 JVM 无法为对象堆保留足够的空间

标签 java windows jvm out-of-memory

我有一台 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 并不是一个好主意。

修复?

  1. 别这样做。不要在笔记本电脑上运行大量 2GB Java 服务器,或者将堆大小减小到更合理的大小。过度使用内存是一个很有吸引力的想法,直到 JVM 开始使用您分配给它们的所有内存为止。然后你的系统就会崩溃......

  2. 以不同的方式去做。您可以在单个 JVM 中运行多个服务器。

  3. 获取更多内存。

关于java - 64 位 JVM 无法为对象堆保留足够的空间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40941522/

相关文章:

java - 在 Android Studio 中使用 Cmake 未定义函数引用

windows - FOR/F 命令循环中的 ERRORLEVEL 返回意外结果

java - java进程中有很多线程

操作系统内存不足时的 JVM 行为

java - 为 Java 程序分配自己的命令的最简单方法是什么?

java - 使用命令参数启动 native 终端 (Java)

java - 上传文件到 ocr.space api

具有列表映射的 Java 并发性

c - 查找当前的 NT 内核记录器

python - 如何用python添加windows系统路径?