今天在看netty源码时候又再次遇到了DirectByteBuffer,关于DirectByteBuffer的内存回收机制,在netty框架中被封装的面目全非,但其回收机制也是万变不离其宗,下面这几篇简单易懂的文章就介绍了DirectByteBuffer的概念极其内存回收方式,在这里和大家分享一下:
文章列表 |
jvm堆外内存–DirectByteBuffer |
java之HeapByteBuffer&DirectByteBuffer以及回收DirectByteBuffer |
NIO DirectByteBuffer 内存泄露的测试 |
关键的几行代码也黏贴在这,旨在加深印象
public static void sleep(long i) {
try {
Thread.sleep(i);
} catch (Exception e) {
/*skip*/
}
}
@Test
public void testDirectByteBufferDeallocation() {
/**
DirectByteBuffer构造方法是包私有的,只能通过工具方法:
public static ByteBuffer allocateDirect(int capacity)生成对象
*/
ByteBuffer byteBuffer = ByteBuffer.allocateDirect( * * );
System.out.println(byteBuffer.isDirect());
sleep( * );
System.out.println("start clean");
//可以通过操作系统命令查看堆外内存清理前后的内存占用
clean(byteBuffer);
System.out.println("end clean");
sleep( * );
}
public static void clean(final ByteBuffer byteBuffer) {
if (byteBuffer.isDirect()) {
((DirectBuffer) byteBuffer).cleaner().clean();
}
}
lhever
.---.
| | . __.....__ .----. .----. __.....__
| | .'| .-'' '. \ \ / /.-'' '.
| |< | / .-''"'-. `. ' '. /' // .-''"'-. `. .-,.--.
| | | | / /________\ \| |' // /________\ \| .-. |
| | | | .'''-. | || || || || | | |
| | | |/.'''. \\ .-------------''. `' .'\ .-------------'| | | |
| | | / | | \ '-.____...---. \ / \ '-.____...---.| | '-
| | | | | | `. .' \ / `. .' | |
'---' | | | | `''-...... -' '----' `''-...... -' | |
| '. | '. |_|
'---' '---'