私は記憶に関するいくつかの実験を行っています。私が遭遇した最初の問題は、実行時に特定の量のメモリを割り当てる方法です。たとえば、500MB です。プログラムが終了するまで、プログラムのプロセスがそれを保持する必要があります。
これを達成するにはいくつかの方法があると思いますか?シンプルだけど実用的なものが好きです。
私は記憶に関するいくつかの実験を行っています。私が遭遇した最初の問題は、実行時に特定の量のメモリを割り当てる方法です。たとえば、500MB です。プログラムが終了するまで、プログラムのプロセスがそれを保持する必要があります。
これを達成するにはいくつかの方法があると思いますか?シンプルだけど実用的なものが好きです。
public static void main( String[] args ) {
final byte[] x = new byte[500*1024 ]; // 500 Kbytes
final byte[] y = new byte[500*1024*1024]; // 500 Mbytes
...
System.out.println( x.length + y.length );
}
Java はメモリ管理を隠しているため、質問に対する答えは 2 つあります。
このサイズのデータ構造を作成します。アクティブなスレッドでヒープ上のデータへの参照がなくなると、ガベージ コレクション可能になるため、プログラムが終了するまで、一部のスレッドでそれらへの参照が必要になり、保持されます。32 ビット システムでは、125000 セルの int 配列、または 1000 セルの 125 int 配列には 500MB で十分です。
メモリを割り当てて使用可能にしたいだけで、いっぱいにしない場合は、仮想マシンを -Xms=512M で起動します。これにより、VM は起動時にプログラムに 512 M のメモリを割り当てますが、必要になるまで空になります (ポイント 1 を実行します)。Xmx は、プログラムによって割り当て可能な最大メモリを設定します。
jmallocを使用すると実行できますが、本当に専門家でない限りお勧めしません。Java の中心となるもの、つまりガベージ コレクションを放棄しています。あなたはCを書いているかもしれません。
Java NIO は、この方法でバイト バッファをヒープ外に割り当てます。これは、オラクルが JAR のメモリ マッピングと perm gen の廃止を目指しているところだと思います。