Windows上每个Java进程的最大内存量?

使用-Xmx可以在32位Windows上为Java进程分配的最大堆大小是多少?

我在问,因为我想在OpenMap中使用ETOPO1数据,原始二进制浮点文件大约为910 MB。


没有什么比用经验实验来回答你的问题更好。 我写了一个Java程序并在指定XMX标志时运行它(还使用XMS = XMX来强制JVM预先分配所有内存)。 为了进一步防止JVM优化,我主动分配X个10MB对象。 我使用Sun和IBM JVM在不同的32位操作系统上对许多JVM执行了大量测试,从而增加了XMX值,同时增加了分配的MB数量,以下是对结果的总结:

操作系统:Windows XP SP2,JVM:Sun 1.6.0_02,最大堆大小:1470 MB
操作系统:Windows XP SP2,JVM:IBM 1.5,最大堆大小:1810 MB
操作系统:Windows Server 2003 SE,JVM:IBM 1.5,最大堆大小:1850 MB
操作系统:Linux 2.6,JVM:IBM 1.5,最大堆大小:2750 MB

以下是详细的运行尝试以及分配类助手源代码:

WinXP SP2,SUN JVM:

C:>java -version
java version "1.6.0_02"
Java(TM) SE Runtime Environment (build 1.6.0_02-b06)
Java HotSpot(TM) Client VM (build 1.6.0_02-b06, mixed mode)

java -Xms1470m -Xmx1470m Class1 142 ... about to create object 141 object 141 created

C:>java -Xms1480m -Xmx1480m Class1 145 Error occurred during initialization of VM Could not reserve enough space for object heap Could not create the Java virtual machine.

WinXP SP2,IBM JVM
 
C:>c:ibmjdkbinjava.exe -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pwi32devifx-20070323 (if
ix 117674: SR4 + 116644 + 114941 + 116110 + 114881))
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Windows XP x86-32 j9vmwi3223ifx-2007
0323 (JIT enabled)
J9VM - 20070322_12058_lHdSMR
JIT  - 20070109_1805ifx3_r8
GC   - WASIFIX_2007)
JCL  - 20070131

c:ibmjdkbinjava.exe -Xms1810m -Xmx1810m Class1 178 ... about to create object 177 object 177 created

C:>c:ibmjdkbinjava.exe -Xms1820m -Xmx1820m Class1 179 JVMJ9VM015W Initialization error for library j9gc23(2): Failed to instantiate he ap. 1820M requested Could not create the Java virtual machine.

Win2003 SE,IBM JVM
C:>"C:IBMjava" -Xms1850m -Xmx1850m Class1
sleeping for 5 seconds.
Done.

C:>"C:IBMjava" -Xms1880m -Xmx1880m Class1 JVMJ9VM015W Initialization error for library j9gc23(2): Failed to instantiate he ap. 1880M requested Could not create the Java virtual machine.

Linux 2.6,IBM JVM
[root@myMachine ~]# /opt/ibm/java2-i386-50/bin/java -version
java version "1.5.0"
Java(TM) 2 Runtime Environment, Standard Edition (build pxi32dev-20060511 (SR2))
IBM J9 VM (build 2.3, J2RE 1.5.0 IBM J9 2.3 Linux x86-32 j9vmxi3223-20060504 (JIT enabled)
J9VM - 20060501_06428_lHdSMR
JIT  - 20060428_1800_r8
GC   - 20060501_AA)
JCL  - 20060511a

/opt/ibm/java2-i386-50/bin/java -Xms2750m -Xmx2750m Class1 270

[root@myMachine ~]# /opt/ibm/java2-i386-50/bin/java -Xms2800m -Xmx2800m Class1 270 JVMJ9VM015W Initialization error for library j9gc23(2): Failed to instantiate heap. 2800M requested Could not create the Java virtual machine.

代码如下:


import java.util.StringTokenizer;


public class Class1 {

        public Class1() {}

        private class BigObject {
                byte _myArr[];
                public BigObject() {
                        _myArr = new byte[10000000];
                }
        }
    public static void main(String[] args) {
                (new Class1()).perform(Integer.parseInt(args[0]));
        }
        public void perform(int numOfObjects) {
                System.out.println("creating 10 MB arrays.");
                BigObject arr[]  = new BigObject[numOfObjects];
                for (int i=0;i <numOfObjects; i++) {
                        System.out.println("about to create object "+i);
                        arr[i] = new BigObject();
                        System.out.println("object "+i+" created");
                }
                System.out.println("sleeping for 5 seconds.");
                try {
                Thread.sleep(5000);
                }catch (Exception e) {e.printStackTrace();}
                System.out.println("Done.");
    }

}

对于大文件,我建议你使用内存映射文件。 这不使用堆空间(或者很少),因此在这种情况下最大堆大小不应该成为问题。


我们最近从Windows移植到Linux(由于VM大小问题)。

过去我听说过Windows VM大小(1200,1400,1600,1800)过去大量的数字。 在我们的Windows服务器(2003)上,在我们的环境中,使用我们的应用程序,...我从未成功使用超过1280MB。 除此之外,我们的应用程序开始展示GC和OOM问题。

每次我得到一个新的VM版本时,我都试着改变这个数字,它从不改变。

你现在有一个900MB的文件,如果文件增加到1300MB会怎么样? 你会怎么做?

你有很多选择

  • 端口到Linux / Solaris。 这只需要硬件/软件,而且通常是简单的移植练习。
  • 使用64位Windows。 尽管这可能不是GC问题 - 我听说过64位vms的不同故事。
  • 重新设计应用程序以不同的方式处理文件,你能否以某种方式逻辑分割文件,你能够以块读取文件并以不同的方式处理文件吗?
  • 其他使用OpenMap的人必须遇到这个问题。 你可以挖掘他们的知识,而不是重新发明任何车轮?

    链接地址: http://www.djcxy.com/p/90559.html

    上一篇: Maximum amount of memory per Java process on Windows?

    下一篇: Is Eclipse 3.4 (Ganymede) memory usage significantly higher than 3.2?