JDK提供了分配所谓的直接ByteBuffer的能力,其中内存是在Java堆之外分配的。这可能是有益的,因为该内存不会被垃圾收集器触及,并且因此不会增加GC开销:对于像缓存这样的长期存在的东西来说,这是一个非常有用的属性。
然而,现有实现存在一个关键问题:当拥有的ByteBuffer被垃圾回收时,底层内存仅异步分配;没有办法强制提前释放。这可能是有问题的,因为GC周期本身并不受ByteBuffer处理的影响,并且考虑到ByteBuffers很可能驻留在旧一代内存区域中,可能会在ByteBuffer不再使用数小时后调用GC。
但是理论上应该可以直接使用sun.misc.Unsafe方法(freeMemory,allocateMemory):这就是JDK自身用于分配/释放本机内存的方法。看代码,我看到一个潜在的问题是内存双重释放的可能性——因此,我想确保状态会被正确清除。
有人能指引我找到做这个的代码吗?最好使用这个而不是JNA。
注意:我看到了与此相关的这个问题。
看起来答案指出的方法是一个好方法:这里是Elastic Search的代码示例,使用了这个想法。谢谢大家!
然而,现有实现存在一个关键问题:当拥有的ByteBuffer被垃圾回收时,底层内存仅异步分配;没有办法强制提前释放。这可能是有问题的,因为GC周期本身并不受ByteBuffer处理的影响,并且考虑到ByteBuffers很可能驻留在旧一代内存区域中,可能会在ByteBuffer不再使用数小时后调用GC。
但是理论上应该可以直接使用sun.misc.Unsafe方法(freeMemory,allocateMemory):这就是JDK自身用于分配/释放本机内存的方法。看代码,我看到一个潜在的问题是内存双重释放的可能性——因此,我想确保状态会被正确清除。
有人能指引我找到做这个的代码吗?最好使用这个而不是JNA。
注意:我看到了与此相关的这个问题。
看起来答案指出的方法是一个好方法:这里是Elastic Search的代码示例,使用了这个想法。谢谢大家!