使用jdk1.5,我在尝试提取一个相当大的jar时得到一个OutofMemoryError。 但是,这不会发生在jdk6上。是因为jdk1.5和jdk6上的默认堆大小/ permgen设置不同,还是jdk1.5中的一个错误在jdk6中修复了?
import java.io.*;
import java.util.zip.*;
public class UnZip {
final int BUFFER = 2048;
public static void main (String argv[]) {
try {
BufferedOutputStream dest = null;
FileInputStream fis = new FileInputStream(argv[0]);
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
while((entry = zis.getNextEntry()) != null) {
System.out.println("Extracting: " +entry);
int count;
byte data[] = new byte[BUFFER];
// write the files to the disk
FileOutputStream fos = new FileOutputStream(entry.getName());
dest = new BufferedOutputStream(fos, BUFFER);
while ((count = zis.read(data, 0, BUFFER)) != -1) {
dest.write(data, 0, count);
}
dest.flush();
dest.close();
}
zis.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:3)
引用Total Heap Size的Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine部分:
总堆
(...)
默认情况下,虚拟机会增长 或缩小每个集合的堆 尽量保持自由的比例 每个人都有活动空间的空间 特定范围内的集合。 此目标范围设置为a 百分比参数
-XX:MinHeapFreeRatio=<minimum>
和-XX:MaxHeapFreeRatio=<maximum>
,总大小受限于-Xms
及以上-Xmx
。 32位Solaris的默认参数 操作系统(SPARC平台 版本)显示在此表中:-XX:MinHeapFreeRatio= 40 -XX:MaxHeapFreeRatio= 70 -Xms 3670k -Xmx 64m
堆大小参数的默认值 在64位系统上已经扩大规模 大约30%。这种增加是 意在弥补更大的影响 64位系统上对象的大小。
在Default Heap Size的Java SE 6 HotSpot Virtual Machine Garbage Collection Tuning中,他们写道:
默认堆大小
如果未在命令行中另行设置,则根据计算机上的内存量计算初始和最大堆大小。用于堆的内存比例由命令行选项
DefaultInitialRAMFraction
和DefaultMaxRAMFraction
控制,如下表所示。 (在表中,内存表示计算机上的内存量。)Formula Default initial heap size memory / DefaultInitialRAMFraction memory / 64 maximum heap size MIN(memory / DefaultMaxRAMFraction, 1GB) MIN(memory / 4, 1GB)
请注意,无论计算机上安装了多少内存,默认的最大堆大小都不会超过1GB。
所以,是的,Java 6具有非常不同的堆设置,并且堆可以增长到RAM的1/4(如果你有超过4GB,则增加到1GB),即现在非常可能超过64m。