Java 尝试使用ZipFileSet提取大型jar时发生OutOfMemory错误

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

在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();
      }
   }
}
引用以下章节:

总堆 (……)

默认情况下,虚拟机会增长 或缩小每个集合的堆 尽量保持免费的比例 每个位置的活动对象空间 特定范围内的集合。 此目标范围设置为 按参数计算的百分比
-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)