uso excesivo de memoria por java
En un proyecto mío, comprimo constantemente pequeños bloques de datos. Ahora descubro que la jvm crece a 6 GB de RAM (RAM residente (RES), no compartida o virtual o algo así) y luego muere por falta de memoria. Es como si el recolector de basura nunca se ejecuta más o menos. Saqué el código relevante y lo pegué a continuación. Cuando lo ejecuto (Java6, Linux de 32 bits) crece a 1 GB de RAM. ¿Alguien tiene una idea de cómo reducir el uso de memoria?
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();
}
}