DeflaterOutputStream内存泄露BUG
BUG代码:
public static void main(String[] args) throws IOException {
byte[] data = new byte[1024 * 16];
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024 * 16);
//参数:1.OutputStream 2. level 3.是否使用字典 4.是否 sync同步
DeflaterOutputStream dos = new DeflaterOutputStream(baos, new Deflater(9, false), true);
dos.write(data);
dos.flush();
dos.close();
}
原因: new Deflater(9, false);
忽略了DeflaterOutputStream
内部的 Deflater
;
Deflater
没有释放资源导致的直接内存泄露。
改进方法1:
使用默认构造函数,不在构造函数内创建 Deflater
对象,此时 Deflater
由 DeflaterOutputStream
主动释放。
DeflaterOutputStream dos = new DeflaterOutputStream(baos, true);
改进方法2:
使用后,主动释放 Deflater
。
public static void main(String[] args) throws IOException {
byte[] data = new byte[1024 * 16];
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024 * 16);
Deflater deflater = new Deflater(9, false);
DeflaterOutputStream dos = new DeflaterOutputStream(baos, deflater, true);
dos.write(data);
dos.flush();
dos.close();
deflater.end();
}