Java 尝试使用ZipFileSet提取大型jar时发生OutOfMemory错误
在jdk1.5中,我在试图提取一个相当大的jar时遇到了一个OutofMemoryError。 但是,jdk6上不会发生这种情况。这是因为jdk1.5和jdk6上的默认堆大小/permgen设置不同,还是jdk1.5中的错误在jdk6中得到了修复Java 尝试使用ZipFileSet提取大型jar时发生OutOfMemory错误,java,out-of-memory,zipfile,Java,Out Of Memory,Zipfile,在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
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();
}
}
}
引用以下章节:
总堆
(……)
默认情况下,虚拟机会增长
或缩小每个集合的堆
尽量保持免费的比例
每个位置的活动对象空间
特定范围内的集合。
此目标范围设置为
按参数计算的百分比
-XX:MinHeapFreeRatio=
和-XX:MaxHeapFreeRatio=
,并且总大小以
-Xms
及以上版本由-Xmx
提供。32位Solaris的默认参数
操作系统(SPARC平台)
本表所示为:
-XX:MinHeapFreeRatio= 40
-XX:MaxHeapFreeRatio= 70
-Xms 3670k
-Xmx 64m
堆大小参数的默认值
在64位系统上已按比例增加
大约30%。这一增长是不公平的
为了补偿更大的损失
64位系统上对象的大小
在其中,他们写道:
默认堆大小
如果没有在命令行上进行其他设置,则根据计算机上的内存量计算初始堆大小和最大堆大小。堆使用的内存比例由命令行选项DefaultInitialRAMFraction
和DefaultMaxRAMFraction
控制,如下表所示。(在表中,内存表示机器上的内存量。)
请注意,无论计算机上安装了多少内存,默认最大堆大小都不会超过1GB
因此,是的,Java 6有非常不同的堆设置,堆可以增长到RAM的1/4(如果内存超过4GB,则为1GB),也就是说,现在很可能超过64m。您是否尝试过使用jdk1.5来增加堆大小?是的,我尝试过,而且效果很好。但是它在jdk6上工作,而不增加任何堆大小设置。您能提供一些代码行来说明如何提取jar吗?另一方面,将close()调用移到finally块中。如果之前发生了某些异常,则会阻止释放连接。最后,{…}确保始终执行close()。
Formula Default
initial heap size memory / DefaultInitialRAMFraction memory / 64
maximum heap size MIN(memory / DefaultMaxRAMFraction, 1GB) MIN(memory / 4, 1GB)