Ошибка OutOfMemory при попытке извлечь большую банку с помощью ZipFileSet - PullRequest
3 голосов
/ 13 февраля 2010

С jdk1.5 я получаю ошибку OutofMemoryError, пытаясь извлечь достаточно большую флягу. Тем не менее, это не происходит на JDK6. Это из-за разных настроек размера кучи / permgen по умолчанию на jdk1.5 и jdk6 или это ошибка в 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 Ответ

3 голосов
/ 13 февраля 2010

Цитирование раздела Общий размер кучи в Настройка сборки мусора с виртуальной машиной Java [tm] 5.0 * :

Общая куча

(...)

По умолчанию виртуальная машина растет или сжимает кучу в каждой коллекции пытаться сохранить пропорцию свободного пространство для живых объектов на каждом Коллекция в пределах определенного диапазона. Этот целевой диапазон устанавливается как процент по параметрам -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 , они пишут:

Размер кучи по умолчанию

Если в командной строке не указано иное, начальный и максимальный размеры кучи рассчитываются на основе объема памяти на машине. Доля памяти, используемой для кучи, контролируется параметрами командной строки DefaultInitialRAMFraction и DefaultMaxRAMFraction, как показано в таблице ниже. (В таблице память представляет объем памяти на машине.)

                                             Formula  Default
initial heap size     memory / DefaultInitialRAMFraction          memory / 64
maximum heap size     MIN(memory / DefaultMaxRAMFraction, 1GB)    MIN(memory / 4, 1GB)

Обратите внимание, что максимальный размер кучи по умолчанию не будет превышать 1 ГБ, независимо от того, сколько памяти установлено на машине.

Итак, да, Java 6 имеет очень разные настройки кучи, и куча может вырасти до 1/4 вашей ОЗУ (или 1 ГБ, если у вас больше 4 ГБ), то есть, скорее всего, намного больше, чем 64 м. В настоящее время.

...