3

jdk1.5 では、かなり大きな jar ファイルを抽出しようとすると OutofMemoryError が発生します。ただし、これは jdk6 では発生しません。jdk1.5 と jdk6 でデフォルトの heap-size/permgen 設定が異なるためですか、それとも jdk6 で修正された jdk1.5 のバグですか?

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

Tuning Garbage Collection with the 5.0 Java[tm] Virtual MachineのTotal Heap Sizeセクションを引用します。

総ヒープ

(...)

デフォルトでは、仮想マシンは各コレクションでヒープを拡大または縮小して、各コレクションでライブ オブジェクトに対する空き領域の比率を特定の範囲内に維持しようとします。このターゲット範囲は、パラメータ -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 に答える