Java堆外直接記憶體回收

深圳gg發表於2018-09-21

JVM引數設定:-XX:MaxDirectMemorySize=20M
import java.nio.ByteBuffer;
import sun.nio.ch.DirectBuffer;
public class DirectMemoryOOM {
public static void main(String[] args) {
ByteBuffer buffer = null;
try {
long startTime=System.currentTimeMillis();
for(int i=0;i<100;i++){
buffer = ByteBuffer.allocateDirect(1024 * 1024 * 15);
clean(buffer);
}
long endTime=System.currentTimeMillis();
System.out.println("程式執行時間: "+(endTime-startTime)+“ms”);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void clean(final ByteBuffer byteBuffer) {
if (byteBuffer.isDirect()) {
((DirectBuffer)byteBuffer).cleaner().clean();
}
}
}
測試1:
未加clean程式執行時間: 12116ms
加clean程式執行時間: 538ms

測試2:
把程式碼改為
buffer = ByteBuffer.allocateDirect(1024 * 1024 * 15);
未加clean會產生直接記憶體溢位:java.lang.OutOfMemoryError: Direct buffer memory
加clean不會產生記憶體溢位。

相關文章