尝试使用包含数组的 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 函数存在错误。我会一直打开这个帖子,直到它被修复或有人发布解决方法..