【发布时间】:2011-10-10 17:20:08
【问题描述】:
所以 Java NIO 架构师没有做一个ByteBuffer 接口,而是一个ByteBuffer class,它不是最终类,但它没有包公共构造函数,因此它不能被子类化在它的包装之外。菲。 :P
我有一个程序在很多地方使用内存映射文件字节缓冲区(通过 FileChannel.map() 获得),我试图找出一个令人讨厌的错误,其中有问题的文件处于打开状态,因为至少有一个 ByteBuffer 未释放到垃圾回收中。
我希望喜欢创建一个看起来像字节缓冲区的InstrumentedByteBuffer 类,但装饰一个常规的ByteBuffer(或其子类,例如MappedByteBuffer)并跟踪它的存在(包括由 duplicate() 和 slice() 创建的新缓冲区)——这样我可以保持使用 ByteBuffer 的代码完整,我只需要装饰原始字节缓冲区。
有没有办法(通过反射或代理或其他方式)绕过私有构造函数?我不需要将它运送到最终产品中,我只需要暂时使用它来解决这个错误。
【问题讨论】:
-
我想知道是否有像
YourKit这样的工具,以及它的内存调试器和探针,可以帮助您追踪流浪对象(我经常使用YourKit,但从来不需要调试像这样的问题)。 -
另外,我不确定子类化会有什么帮助,因为您不控制缓冲区的创建。你说你使用
FileChannel.map(),所以你需要以某种方式诱使后者创建你的类的实例,不是吗? -
你能转储堆并通过对你的恶意实例的引用进行跟踪吗?
-
@aix:我可以控制(好吧,我是编写调用 FileChannel.map() 的函数的人)控制缓冲区的初始创建,只是我最终使用了它在几十个地方,其中任何一个都可以被 slice()d 并作为私有变量隐藏起来。
-
ByteBuffer 在构建时考虑到了性能,这是理所当然的。
标签: java nio bytebuffer