Windows上每个Java进程的最大内存量?
您可以使用 在 32 位 Windows 上为 Java 进程分配的最大堆大小是多少?-Xmx
我问是因为我想在OpenMap中使用ETOPO1数据,原始的二进制浮点文件大约是910 MB。
您可以使用 在 32 位 Windows 上为 Java 进程分配的最大堆大小是多少?-Xmx
我问是因为我想在OpenMap中使用ETOPO1数据,原始的二进制浮点文件大约是910 MB。
没有什么比经验实验更好的了,可以回答你的问题。我已经编写了一个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)WinXP SP2, IBM JVMWin2003 SE, IBM JVM Linux 2.6, IBM JVMjava -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.
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 - 20070131c:\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.");
}
}
对于大文件,我建议您使用内存映射文件。这不会使用堆空间(或非常少),因此在这种情况下,最大堆大小应该不是问题。