Что ж, Фолькерт ван Хойсден решил свою проблему, но в итоге:
В начале compress(byte [] in)
-метода мы создаем java.util.zip.Deflater
.
Мы используем Deflater
чтобы что-то сделать, и тогда мы оставляем compress()
-метод.Мы теряем нашу ссылку на deflater
-вариант.На данный момент Deflater
больше не используется и ожидает уничтожения сборщиком мусора.
Deflater
выделяет обе память кучи Java и C/ C ++ / собственная память кучи .Собственная кучная память, выделенная Deflater
, будет храниться до тех пор, пока сборщик мусора не вызовет Deflater.finalize
-метод.Если сборщик мусора работает недостаточно быстро (может быть много свободной памяти кучи Java), мы можем исчерпать память кучи C / C ++.Если это произойдет, мы получим ошибки «Недостаточно памяти».
Отчет об ошибке Oracle JDK-4797189 , вероятно, связан.Он содержит фрагмент кода, который иллюстрирует и воспроизводит проблему:
public class Bug {
public static void main( String args[] ) {
while ( true ) {
/* If ANY of these two lines is not commented, the JVM
runs out of memory */
final Deflater deflater = new Deflater( 9, true );
final Inflater inflater = new Inflater( true );
}
}
}
Решение состоит в том, чтобы освободить ресурсы, когда вы закончите, вызывая Deflater.end()
-метод (или Inflater.end()
).