JVM で使用可能なすべてのメモリをほとんど埋める大きな int 配列を作成したいと考えています。たとえば、次のコードを見てください。
final int numBuffers = (int) ((runtime.freeMemory() - 200000L) / (BUFFER_SIZE));
System.out.println(runtime.freeMemory());
System.out.println(numBuffers*(BUFFER_SIZE/4)*4);
buffers = new int[numBuffers*(BUFFER_SIZE / 4)];
10M のヒープ サイズで実行すると、printlns からの出力が次のようになっているにもかかわらず、OutOfMemoryException がスローされます。
9487176
9273344
配列にはいくらかのオーバーヘッドがあることはわかっていますが、確かに200kではありませんか? java が十分なスペースがあると主張するものにメモリを割り当てられないのはなぜですか? Javaがこれを実行する前に、約4Mに減算される定数を設定する必要があります(その時点で、printlnsは次のようになります: 9487176 5472256 )
さらに当惑することに、バッファを 2D 配列に置き換えると、次のようになります。
buffers = new int[numBuffers][BUFFER_SIZE / 4];
次に、上記の 200k 減算を使用して問題なく実行されます-格納されている整数の量が両方の配列で同じであっても (そして、2D 配列のオーバーヘッドは 1D 配列のオーバーヘッドよりも大きくなりません。格納する他の配列へのそれらの参照)。
何か案は?