2

我想知道如何编写一个ByteBuffer回收类,它可以让我得到一个ByteBuffer至少与指定长度一样大的回收类,并且它可以锁定ByteBuffer正在使用的对象以防止它们被我的代码使用时使用。DirectByteBuffers这将防止一遍又一遍地重建等等,而不是使用现有的。是否有现有的 Java 库可以非常有效地做到这一点?我知道 Javolution 可以使用对象回收,但是ByteBuffer在这种情况下,它是否可以扩展到符合规定要求的类?

4

3 回答 3

4

首先,在您的使用模式上更加保守会更重要。例如,有很多代码显示在每个 OP_READ 上分配一个新的 ByteBuffer。疯了吧。每个连接最多只需要两个 ByteBuffer,一个用于输入,一个用于输出,根据您的操作,您可以只使用一个。在像回显服务器这样极其简单的情况下,您可以为整个应用程序使用一个 BB。

我会研究这一点,而不是用另一层软件掩盖裂缝。

于 2010-02-26T07:23:47.890 回答
3

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

一些参考资料:

一个线程 - 以 Stack Overflow 的主旨为特色

关于同一主题的博客文章

以及后续

于 2010-02-26T04:05:19.150 回答
1

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

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

于 2010-05-23T03:02:54.343 回答