在32位Windows上,使用-Xmx
为Java进程分配的最大堆大小是多少?
我之所以问这个问题,是因为我想在OpenMap中使用ETOPO1数据,而原始二进制浮点文件约为910 MB。
在32位Windows上,使用-Xmx
为Java进程分配的最大堆大小是多少?
我之所以问这个问题,是因为我想在OpenMap中使用ETOPO1数据,而原始二进制浮点文件约为910 MB。
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.");
}
}
对于大文件,建议使用内存映射文件。这不会使用堆空间(或者很少),因此在这种情况下最大堆大小不应该是一个问题。
如评论中提到的问题所述,实际上存在一个实际限制,大约为1200 MB。
然而,您所描述的情况比纯粹的内存大小更为深入。
当您读取910 MB的二进制数据并基于它构建网络对象(而不仅仅将数据保留为字节数组)时,您最终会消耗比910 MB多得多的内存。合理的估计是,内存中的表示将消耗两倍的内存 - 这是因为(1)每个对象都包含一个额外的指针(指向对象的类);和(2)有很多簿记数据。例如,如果您使用HashMap来管理对象,则除了每个对象之外,还会分配一个Map.Entry对象,该对象可以轻松消耗16或20字节(具体实现取决于)。
另一方面,仍然有希望:您真的需要在内存中保留所有910 MB吗?不能您只构建以懒惰方式读取数据的东西吗?结合WeakReferences,我认为您可以做到这一点。
-Xmx2048M
。然而,如果你安装了更多内存,你可以通过使用启动参数将虚拟地址空间增加到3GB。[boot loader]<br>
timeout=5<br>
default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS<br>
[operating systems]<br>
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - magyar" /noexecute=optin /fastdetect /usepmtimer<br>
multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional - magyar 3GB" /noexecute=optin /fastdetect /usepmtimer /3GB /USERVA=2800<br>
通过调整/USERVA=2800参数,您可以优化您的机器。但请注意,某些配置不喜欢这个参数的高值 - 可能会导致崩溃。