配列を含む Javolution.Struct を使用して (メモリを直接) 割り当てようとすると、メモリが「爆発」します。理由がわからない、手がかりが欲しい
クラス A は、クラス B の 50 個の配列を保持します。クラス B は、100 万個の unsigned short の配列を保持します。
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]);
}
これらの配列を 1 つにまとめて必要とする理由は、getByteBuffer() を呼び出して構造全体を単一のメモリとして取得し、非 jvm メモリに直接割り当てられるためです。
メモリには ( 10 GB ) 100MB ではなく 6 GB と表示されますが、理由はわかりません
[javolution 6.1.0]
編集1: 同じメモリの問題を引き起こすことが判明したより簡潔な問題:
public Unsigned16[] someData = array(new Unsigned16[50000000]);
main (クラスは Struct obv を拡張する必要がある) 関数に 50m の unsigned16 を割り当てると、実際に 6 GB を割り当てる場所に 100 MB のメモリ フットプリントが予想されます。
編集 2: array() 関数でラップせずに、同じ行を呼び出している場合は発生しません。
public Unsigned16[] someData = new Unsigned16[50000000];
これは奇妙です。この配列を含む構造体と、他の構造体メンバー (Signed8 など) が必要です。getByteBuffer() を呼び出すと、別の構造体へのポインターではなく、同じメモリが割り当てられます。
編集 3: これは期待どおりに機能します: ByteBuffer bb = ByteBuffer.allocateDirect(100*1000000); // 100MB を割り当てます
javolution lib の Struct.array 関数にバグがあると思われます。修正されるか、誰かが回避策を投稿するまで、この投稿を開いたままにします..