Deflater/Inflater如使用不當,將有可能造成native memory leak,下面是一段示例的代碼:
import java.util.zip.*;
public class Bug {
public static void main( String args[] ) throws Exception{
for(int i=0;i<100;i++){
new Thread(new Runnable(){
public void run(){
for(int i=0;i<200;i++){
Deflater deflater = new Deflater( 9, true );
//deflater.end();
}
byte[] bytes1=new byte[1024*512];
byte[] bytes2=new byte[1024*512];
byte[] bytes3=new byte[1024*512];
byte[] bytes4=new byte[1024*512];
byte[] bytes5=new byte[1024*512];
byte[] bytes6=new byte[1024*512];
byte[] bytes7=new byte[1024*512];
byte[] bytes8=new byte[1024*512];
}
}).start();
Thread.sleep(1);
}
Thread.sleep(30000);
}
}
用-Xmn10m運行上面的代碼,可以看到即使在觸發了minor gc和full gc後,Java進程占用的地址空間也不會降下去,而當主動調用deflater.end後,再次運行上面的代碼,則可看到Java進程占用的地址空間就比較少了,因此在使用Deflater/Inflater時,一定要記得在不需要用了時主動的調用下end方法,就像使用FileInputStream之類的一樣。