我想知道我如何编写一个ByteBuffer回收类,它可以让我获得一个至少与指定长度一样大的ByteBuffer,并且可以锁定正在使用的ByteBuffer对象,以防止它们被我的代码使用。这将防止一次又一次地重新构建DirectByteBuffers等,而不是使用现有的。有没有现成的Java库可以非常有效地做到这一点?我知道Javolution可以与对象回收一起工作,但是在这个上下文中,它是否扩展到了ByteBuffer类,并且满足了要求?
发布于 2010-02-26 15:23:48
首先,在你的使用模式上更加保守会更有意义。例如,有很多代码显示在每个OP_READ上分配新的ByteBuffer。这太疯狂了。每个连接最多只需要两个ByteBuffers,一个用于输入,一个用于输出,根据您正在做的事情,您可以只使用一个。在非常简单的情况下,例如回显服务器,您可以为整个应用程序使用一个BB。
我会调查这一点,而不是用另一层软件来掩盖裂缝。
发布于 2010-02-26 12:05:19
这只是建议,不是答案。如果您确实为DirectByteBuffer实现了一些缓存,那么一定要了解GC的含义,因为垃圾收集器不会跟踪DirectByteBuffer消耗的内存。
一些参考资料:
A thread - featuring Stack Overflow's tackline
A blog post on the same subject
And the followup
发布于 2010-05-23 11:02:54
通常,您将结合使用ThreadLocal和SoftReference包装器。前者用于简化同步(本质上消除了对同步的需求);后者用于在内存不足时使缓冲区可回收(请记住其他注释wrt )。直接缓冲区的GC问题)。这实际上很简单:检查SoftReference是否有足够大的缓冲区;如果没有,则分配;如果有,则清除引用。完成后,将reference重新设置为指向buffer。
另一个问题是,与常规的byte[]相比,是否需要ByteBuffer。许多开发人员假设ByteBuffers在性能方面更好,但这种假设通常不会得到实际数据的支持(即,测试是否存在性能差异,以及方向)。byte[]通常更快的原因是HotSpot访问它的代码可以更简单、更容易地高效地执行JIT。
https://stackoverflow.com/questions/2339016
复制相似问题