3

使用 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();
      }
   }
}
4

1 回答 1

3

引用使用 5.0 Java[tm] 虚拟机调整垃圾收集的总堆大小部分

总堆

(...)

默认情况下,虚拟机会在每个集合处增大或缩小堆,以尝试将每个集合处的可用空间与活动对象的比例保持在特定范围内。此目标范围由参数 -XX:MinHeapFreeRatio=<minimum>和设置为百分比-XX:MaxHeapFreeRatio=<maximum>,并且总大小的范围为低于 -Xms和高于-Xmx。下表显示了 32 位 Solaris 操作系统(SPARC 平台版)的默认参数:

-XX:MinHeapFreeRatio= 40
-XX:MaxHeapFreeRatio= 70
-Xms          3670k
-Xmx          64m

64 位系统上堆大小参数的默认值已按比例增加了大约 30%。这种增加是为了补偿 64 位系统上较大的对象大小。

Java SE 6 HotSpot Virtual Machine Garbage Collection Tuning的Default Heap Size中,他们写道:

默认堆大小

如果没有在命令行上另外设置,初始和最大堆大小是根据机器上的内存量计算的。用于堆的内存比例由命令行选项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。

于 2010-02-13T15:42:58.970 回答