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

2022-09-01 20:13:18

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

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


答案 1

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

操作系统:Windows XP SP2, JVM: Sun 1.6.0_02, 最大堆大小: 1470 MB
OS: Windows XP SP2, JVM: IBM 1.5, 最大堆大小: 1810 MB
OS: Windows Server 2003 SE, JVM: IBM 1.5, 最大堆大小: 1850 MB
OS: 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 JVMWin2003 SE, IBM JVM Linux 2.6, IBM JVM
 
C:>c:\ibm\jdk\bin\java.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:\ibm\jdk\bin\java.exe -Xms1810m -Xmx1810m Class1 178 ... about to create object 177 object 177 created

C:>c:\ibm\jdk\bin\java.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.

C:>"C:\IBM\java" -Xms1850m -Xmx1850m Class1
sleeping for 5 seconds.
Done.

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

[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.");
    }

}

答案 2

对于大文件,我建议您使用内存映射文件。这不会使用堆空间(或非常少),因此在这种情况下,最大堆大小应该不是问题。


推荐