0

尝试使用包含数组的 Javolution.Struct 分配(直接内存),并且内存“爆炸”。不知道为什么,希望有线索

A 类包含 B 类的 50 个数组。B 类包含 100 万个无符号空头数组:

import javolution.io.Struct;

public class Test {

    public static void main(String[] args) {
        Test t = new Test();
        t.work();
    }

    public void work() {
        A a = new A();
        System.out.println("a.size() = "+a.size()); // prints 100000000
    }
}

public class A extends Struct {
    public B[] randomName = array(new B[50]);
}

public class B extends Struct {
    public Unsigned16[] someData = array(new Unsigned16[1000000]);
}

我需要这些数组的原因是调用 getByteBuffer() 并将整个结构作为单个内存,直接分配在非 jvm 内存中的舒适性

内存显示 ( 10 GB ) 6 GB 而不是 100MB 不知道为什么

[javolution 6.1.0]

编辑 1: 发现一个更简洁的问题会导致相同的内存问题:

public Unsigned16[] someData = array(new Unsigned16[50000000]);

在 main(类需要扩展 Struct obv)函数中分配 50m unsigned16 预计将有 100mb 内存占用,其中实际分配 6gb

编辑 2: 如果我调用同一行,没有使用 array() 函数包装,它不会发生:

public Unsigned16[] someData = new Unsigned16[50000000];

这很奇怪。我需要结构包含这个数组,以及其他结构成员(如 Signed8 等),并且在调用 getByteBuffer() 时,它将分配相同的内存,而不是指向不同结构的指针

编辑 3: 这按预期工作: ByteBuffer bb = ByteBuffer.allocateDirect(100*1000000); // 分配 100MB

我怀疑 javolution lib 中的 Struct.array 函数存在错误。我会一直打开这个帖子,直到它被修复或有人发布解决方法..

4

0 回答 0