Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Java在本机内存中存储对象数组_Java_Buffer_Project Panama - Fatal编程技术网

如何使用Java在本机内存中存储对象数组

如何使用Java在本机内存中存储对象数组,java,buffer,project-panama,Java,Buffer,Project Panama,我想使用巴拿马项目的外部内存访问API在本机内存中实现一个数据结构 为此,我需要一个底层对象数组(Object[])作为条目 在所有外部内存访问API示例中,MemorySegment仅用于存储和检索原语,如下所示: //I would like to use Object here instead of int ResourceScope scope = ResourceScope.newConfinedScope(); SequenceLayout layout = MemoryLayout

我想使用巴拿马项目的外部内存访问API在本机内存中实现一个数据结构

为此,我需要一个底层对象数组(
Object[]
)作为条目

在所有外部内存访问API示例中,MemorySegment仅用于存储和检索原语,如下所示:

//I would like to use Object here instead of int
ResourceScope scope = ResourceScope.newConfinedScope();
SequenceLayout layout = MemoryLayout.sequenceLayout(100, MemoryLayouts.JAVA_INT); 
VarHandle intHandle = seq.varHandle(int.class, sequenceElement());
MemorySegment segment = MemorySegment.allocateNative(layout, scope);
是否有办法将非原语存储在MemorySegment(例如Object)中? 如果是这样的话,当VarHandles只支持原语载体时,我如何使用VarHandle解除对MemorySegment的引用

是否有办法将非原语存储在MemorySegment(例如Object)中

不,至少不是直接的。对象由Java运行时管理,它们不能安全地存储在本机内存中(例如,因为垃圾收集器无法跟踪本机内存中对象内部的对象引用)

但是,如注释中所述,出于您的目的,将数据存储在本机内存中的对象中可能就足够了。例如,如果一个对象只包含基本字段(不过,对于对象字段也可以递归地执行相同的操作),则可以将每个这样的字段分别写入本机内存。例如(使用JDK 16 API):


作为第一种近似,我假设可以将对象序列化为ByteArrayStream,然后将其移动到本机内存段。但我刚刚读了巴拿马的管理摘要,所以我可能完全走错了方向。。。
public static void main(String[] args) {
    try (MemorySegment segment = MemorySegment.allocateNative(Widget.NATIVE_LAYOUT)) {
        Widget widget1 = new Widget(1, 2);
        widget1.write(segment);

        Widget widget2 = Widget.read(segment);
        System.out.println(widget2); // Widget[x=1, y=2]
    }
}

record Widget(int x, int y) {
    static final MemoryLayout NATIVE_LAYOUT = MemoryLayout.ofStruct(
        MemoryLayouts.JAVA_INT.withName("x"),
        MemoryLayouts.JAVA_INT.withName("y")
    );

    static final VarHandle VH_x = NATIVE_LAYOUT.varHandle(int.class, MemoryLayout.PathElement.groupElement("x"));
    static final VarHandle VH_y = NATIVE_LAYOUT.varHandle(int.class, MemoryLayout.PathElement.groupElement("y"));

    public static Widget read(MemorySegment segment) {
        int x = (int) VH_x.get(segment);
        int y = (int) VH_y.get(segment);
        return new Widget(x, y);
    }

    public void write(MemorySegment segment) {
        VH_x.set(segment, x());
        VH_y.set(segment, y());
    }
}