如何在Java中垃圾收集直接缓冲区

我有一个内存泄漏,我已经隔离到不正确的直接字节缓冲区.

ByteBuffer buff = ByteBuffer.allocateDirect(7777777);

GC收集包含这些缓冲区的对象,但不会丢弃缓冲区本身.如果我实例化足够的包含缓冲区的瞬态对象,我会收到这条令人鼓舞的消息:

java.lang.OutOfMemoryError: Direct buffer memory

我一直在寻找这个问题,显然

buff.clear();

System.gc();

不工作.

解决方法:

我怀疑你的应用程序的某个地方有对ByteBuffer实例的引用,这就是阻止它被垃圾回收.

直接ByteBuffer的缓冲区内存在普通堆之外分​​配(这样GC就不会移动它!!).但是,ByteBuffer API没有提供显式处理/解除分配缓冲区的方法.所以我假设垃圾收集器会这样做……一旦它确定不再引用ByteBuffer对象.

上一篇:使Java的ByteBuffer线程安全的选项


下一篇:3. Netty源码阅读之Channel