首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectBuffer,去分配

DirectBuffer,去分配
EN

Stack Overflow用户
提问于 2017-10-07 21:56:45
回答 2查看 903关注 0票数 0

我分配了一个直接缓冲区:

代码语言:javascript
复制
ByteBuffer directBuffer = ByteBuffer.allocateDirect(1024);

我读过:

在Java中为JOGL配置直接缓冲区本地内存

但它不能直接回答。

概括地说:

  1. GC将在GC启动时发布directbuffer,而没有引用directbuffer。在链接的帖子中写着:

当您知道直接的NIO缓冲区对您来说已经毫无用处时,您必须使用它的sun.misc.Cleaner (StaxMan是正确的)释放它的本机内存,并调用clean() (除了Apache和谐之外)、调用free() (使用Apache和谐),或者使用更好的公共API来实现这一点(可能是在Java >= 1.9中,扩展AutoCloseable的AutoCleaning中?)。

但我不知道如何显式地释放内存块。好的,有一个sun.misc.Cleaner和什么?:

Cleaner c = new Cleaner()

  1. 使用DirectBuffer而不是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++中的智能指针,不是吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-08 14:20:46

但我不知道如何显式地释放内存块。

目前您不能在java中使用,因为这样做不安全。它可能会导致使用后无菌虫。使其安全的方法,例如虚拟内存操作或safepoint体操,是困难的,可能会花费一些性能,或者可能无法在所有平台上工作。

这不是不可能的,但需要大量的工作。请参阅JDK-4724038,其副本和链接邮件列表,以了解多年来积累的提案。

使用DirectBuffer而不是Unsafe.allocateMemory的目的是什么?

安全地访问稳定的内存位置,无需复制就可以传递给本机代码,也不需要对象固定(hotspot不支持的东西)。

票数 1
EN

Stack Overflow用户

发布于 2017-10-15 18:03:01

你确实可以,但密码很奇怪。

代码语言:javascript
复制
    // 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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46625511

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档