我分配了一个直接缓冲区:
ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024);我读过:
但它不能直接回答。
概括地说:
directbuffer,而没有引用directbuffer。在链接的帖子中写着:当您知道直接的NIO缓冲区对您来说已经毫无用处时,您必须使用它的sun.misc.Cleaner (StaxMan是正确的)释放它的本机内存,并调用clean() (除了Apache和谐之外)、调用free() (使用Apache和谐),或者使用更好的公共API来实现这一点(可能是在Java >= 1.9中,扩展AutoCloseable的AutoCleaning中?)。
但我不知道如何显式地释放内存块。好的,有一个sun.misc.Cleaner和什么?:
Cleaner c = new Cleaner()
Unsafe.allocateMemory的目的是什么?这个解决方案 (在这个杰普中,仍然是一个草案,可能在Java1.9中是不可用的)是非常有希望的,我们不需要使用非公共API。 公共长内存(长索引){ //内存区域可用//实现AutoClosable的作用域,但
close也可以手动调用(Scope =新的NativeScope()) { //分配实际内存区域,在这种情况下,使用“长数组”指针ptr = scope.allocate( NativeLibrary.createLayout(long.class),numElements)的样式;//获取对某个元素引用的引用ref =ptr.offset(索引).deref();//通过引用ref.set(Long.MAX_VALUE)为该元素设置一个值;//读取元素的值返回ref.get();}
它看起来像C++中的智能指针,不是吗?
发布于 2017-10-08 14:20:46
但我不知道如何显式地释放内存块。
目前您不能在java中使用,因为这样做不安全。它可能会导致使用后无菌虫。使其安全的方法,例如虚拟内存操作或safepoint体操,是困难的,可能会花费一些性能,或者可能无法在所有平台上工作。
这不是不可能的,但需要大量的工作。请参阅JDK-4724038,其副本和链接邮件列表,以了解多年来积累的提案。
使用DirectBuffer而不是Unsafe.allocateMemory的目的是什么?
安全地访问稳定的内存位置,无需复制就可以传递给本机代码,也不需要对象固定(hotspot不支持的东西)。
发布于 2017-10-15 18:03:01
你确实可以,但密码很奇怪。
// unmap the memory mapped buffer (wait gc cleans it up)
ReferenceQueue rq = new ReferenceQueue();
PhantomReference<ByteBuffer> ref = new PhantomReference<>(ref_out, rq);
ref_out = null;
while(rq.poll() == null) {
System.gc();
}
// all finalizers are finished... only phantom references left.
PhantomReference<PhantomReference> pref = new PhantomReference<>(ref, rq);
ref.clear();
ref = null;
while(rq.poll() == null) {
System.gc();
}
pref.clear();干杯,
D。
https://stackoverflow.com/questions/46625511
复制相似问题