2016-12-02 52 views
1

我有一台带有16GB RAM的Windows 7笔记本电脑。当我运行多个java服务器时,出现OutOfMemory错误,但是,Windows任务管理器显示我仍有6GB剩余物理内存。在我看来,我的JVM只能为所有正在运行的java应用程序分配〜2GB的堆。64位JVM无法为对象堆预留足够的空间

所以我写了一些非常简单的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,但他们都不工作。窗口和JVM都在64位。

我能做些什么来解决这个问题?

+0

vmmap可能重复[“VM初始化期间发生错误;无法为对象堆预留足够的空间“使用-Xmx3G](http://stackoverflow.com/questions/9303889/error-occurred-during-initialization-of-vm-could-not-reserve-enough-space-for) 。特别是,看到这个答案http://stackoverflow.com/a/9304270/529630 – Dunes

+0

你有交换启用? windows的内存记帐与linux相比是不同的。 – the8472

回答

1

在我看来,我的JVM只能为所有正在运行的java应用程序分配〜2GB的堆。

这是不正确的。 JVM能够请求并使用> 2GB的堆。

它必须是Windows限制了Java进程可以请求的内容。也可能是Windows为多个Java进程保留了内存,但内存显示为空闲,因为JVM尚未使用它。

FWIW,运行带有比他们真正需要更多内存的JVM并不是一个好主意。

修复?

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

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

  3. 获得更多的记忆。

0

只是不要使用-Xms2048m。它使JVM一次请求连续2Gb的内存块。让JVM决定何时为堆需求获取额外的内存。在Windows的情况下,您观察到的效果可能是映射到proc虚拟内存(防病毒,防火墙,rootkit,病毒等)的严重对齐DLL导致虚拟内存碎片化的结果。从ide运行java,使用代理(使用本地impl)也可以添加隐藏内容来处理虚拟内存。观察虚拟内存过程的一个很好的工具是从Microsoft Sysinternals suite

相关问题