Утечка действительно есть, см. Комментарий Фолкберта - он пропустил end () - и это, скорее всего, утечка внутренней памяти, а не Java, поэтому GC не требуется.

м проекте я постоянно сжимаю небольшие блоки данных. Теперь я узнаю, что jvm увеличивается до 6 ГБ оперативной памяти (резидентная (RES) RAM, не разделяемая или виртуальная или около того) и затем умирает из-за нехватки памяти. Это как если бы сборщик мусора никогда не работал или около того. Я вытащил соответствующий код и вставил его ниже. Когда я запускаю его (java6, 32-разрядная версия Linux), он увеличивается до 1 ГБ ОЗУ. Кто-нибудь получил идею, как уменьшить использование памяти?

import java.util.Random;
import java.util.zip.Deflater;
import java.util.zip.Inflater;

class test  {
    int blockSize = 4096;
    Random r = new Random();

    public test() throws Exception {
        blockSize = 4096;
        byte [] data = new byte[blockSize];
        for(int index=0; index<blockSize; index++)
            data[index] = (byte)r.nextInt();

        for(long cnt=0; cnt<1000000; cnt++) {
            byte [] result = compress(data);
            if (result != null)
                data[0] = result[0];
        }
    }

    byte [] compress(byte [] in) {
        assert in.length == blockSize;

        Deflater compresser = new Deflater();
        compresser.setInput(in);
        compresser.finish();
        byte [] out = new byte[in.length];
        int outLen = compresser.deflate(out);

        if (outLen < blockSize) {
            byte [] finalOut = new byte[outLen];
            System.arraycopy(out, 0, finalOut, 0, outLen);
            return finalOut;
        }

        return null;
    }

    public static void main(String [] args) throws Exception {
        new test();
    }
}

Ответы на вопрос(2)

Ваш ответ на вопрос