OutOfMemory尝试使用ZipFileSet提取大型jar时出错

时间:2010-02-13 13:14:42

标签: 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 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();
      }
   }
}

1 个答案:

答案 0 :(得分:3)

引用Total Heap SizeTuning 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 SizeJava SE 6 HotSpot Virtual Machine Garbage Collection Tuning中,他们写道:

  

默认堆大小

     

如果未在命令行中另行设置,则根据计算机上的内存量计算初始和最大堆大小。用于堆的内存比例由命令行选项DefaultInitialRAMFractionDefaultMaxRAMFraction控制,如下表所示。 (在表中,内存表示计算机上的内存量。)

                                             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。