我想知道如何编写一个ByteBuffer
回收类,它可以让我得到一个ByteBuffer
至少与指定长度一样大的回收类,并且它可以锁定ByteBuffer
正在使用的对象以防止它们被我的代码使用时使用。DirectByteBuffers
这将防止一遍又一遍地重建等等,而不是使用现有的。是否有现有的 Java 库可以非常有效地做到这一点?我知道 Javolution 可以使用对象回收,但是ByteBuffer
在这种情况下,它是否可以扩展到符合规定要求的类?
3 回答
首先,在您的使用模式上更加保守会更重要。例如,有很多代码显示在每个 OP_READ 上分配一个新的 ByteBuffer。疯了吧。每个连接最多只需要两个 ByteBuffer,一个用于输入,一个用于输出,根据您的操作,您可以只使用一个。在像回显服务器这样极其简单的情况下,您可以为整个应用程序使用一个 BB。
我会研究这一点,而不是用另一层软件掩盖裂缝。
这只是建议,而不是答案。如果您确实为 DirectByteBuffer 实现了一些缓存,请务必阅读有关 GC 含义的信息,因为垃圾收集器不会跟踪 DirectByteBuffer 消耗的内存。
一些参考资料:
通常,您将使用 ThreadLocal 和 SoftReference 包装器的组合。前者用于简化同步(基本上消除了对它的需要);如果没有足够的内存,后者可以使缓冲区可回收(请记住其他评论 wrt。直接缓冲区的 GC 问题)。其实很简单:检查 SoftReference 是否有足够大的缓冲区;如果没有,分配;如果是,请明确参考。完成后,将引用重新设置为指向缓冲区。
另一个问题是与常规字节 [] 相比,是否需要 ByteBuffer。许多开发人员认为 ByteBuffers 在性能方面更好,但这种假设通常没有实际数据的支持(即测试是否存在性能差异,以及在哪个方向上)。byte[] 通常更快的原因是访问它的代码可以更简单,更容易让 HotSpot 有效地 JIT。