ByteBuffer回收类

时间:2010-02-26 01:52:38

标签: java data-structures memory-management bytebuffer recycle

我想知道我是如何编写一个ByteBuffer回收类,它可以得到一个至少与指定长度一样大的ByteBuffer,并且可以锁定{{1}用于防止在我的代码使用它们时使用的对象。这样可以防止重复构建ByteBuffer等等,而不是使用现有的。是否存在可以非常有效地执行此操作的现有Java库?我知道Javolution可以使用对象回收,但是在这个上下文中是否会扩展到DirectByteBuffers类并满足要求?

3 个答案:

答案 0 :(得分:4)

首先,您的使用模式会更加保守。例如,有很多代码显示在每个OP_READ上分配新的ByteBuffer。疯了吧。每个连接最多只需要两个ByteBuffers,一个用于输入,一个用于输出,并且根据您正在做的事情,您可以使用一个。在非常简单的情况下,例如echo服务器,您可以在整个应用程序中使用一个BB。

我会研究那个而不是用另一层软件来解决问题。

答案 1 :(得分:3)

这只是建议,而不是答案。如果您确实为DirectByteBuffer实现了一些缓存,那么请务必阅读有关GC含义的内容,因为垃圾收集器不会跟踪DirectByteBuffer消耗的内存。

一些参考文献:

A thread - featuring Stack Overflow's tackline

A blog post on the same subject

And the followup

答案 2 :(得分:1)

通常,您将使用ThreadLocal和SoftReference包装器的组合。以前简化同步(基本上消除了它的需要);如果内存不足,可以使缓冲区可循环使用(请记住其他注释事项。直接缓冲区的GC问题)。它实际上非常简单:检查SoftReference是否具有足够大的缓冲区;如果没有,分配;如果是,请明确参考。完成后,重新设置指向缓冲区的引用。

另一个问题是,与常规byte []相比,是否需要ByteBuffer。许多开发人员认为ByteBuffers在性能方面更好,但这种假设通常不受实际数据的支持(即测试是否存在性能差异以及方向)。 byte []可能通常更快的原因是访问它的代码可以更简单,更容易使HotSpot高效JIT。