0

配列を含む 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 関数にバグがあると思われます。修正されるか、誰かが回避策を投稿するまで、この投稿を開いたままにします..

4

0 に答える 0