- 1.1. New I/O の概要
- 1.2. バッファ
- 1.3. バッファの作成方法
- 1.4. バッファの位置プロパティ
- 1.5. バッファの読み書き
- 1.6. ダイレクトバッファ
- 1.7. MappedByteBuffer
- 1.8. メモリ領域の割り当て
1.8. メモリ領域の割り当て
Java仮想マシンが使用することのできるメモリ領域にはもちろん上限が存在します。ヒープのサイズは実行中にも必要に応じて変化しますが、ある最大値を超えることはできません。最大値を超えたメモリを使用しようとするとOutOfMemoryErrorが発生します。
ヒープ領域の初期値および最大値はjavaコマンドのオプションにより設定することができます(デフォルト値はJVMのバージョンやプラットホームによって異なることがあるため、ここには記載しません)。
オプション
|
説明
|
-Xms
|
ヒープの初期値を設定します。 |
-Xmx
|
ヒープの最大値を設定します。 |
たとえば、初期値を10MB、最大値を50MBとする場合には次のように指定します。
java -Xms10m -Xmx50m 実行するクラス名
アプリケーションによって多くのメモリを必要とする場合には、これらのオプションによりヒープ領域を調整します。パフォーマンスの観点からは、初期サイズと最大サイズを同じ値にすることが推奨されています。なお、ヒープ領域は内部的にいくつかの領域に分けられ、別のオプションによりそれぞれの領域のサイズを指定することができます。ここでは説明を省略しますが、アプリケーションのパフォーマンスを最適化したい場合には各領域ごとの細かな調整を行います。
ところで、ダイレクトバッファはヒープ外の領域ですので、上記のオプションではダイレクトバッファ用のメモリ領域サイズを指定することはできません。ダイレクトバッファ用のメモリ領域サイズを指定する方法は正式には文書化されていないようですが、SunのJava仮想マシンの場合、-XX:MaxDirectMemorySize オプションにより最大値を指定することができます。
たとえば、ダイレクトバッファ用のメモリ領域の最大値を10MBとしたい場合、次のように指定します。
java -XX:MaxDirectMemorySize=10m 実行するクラス名
(実習課題1)
まず、以下の要件を満たすメソッドを作成して下さい。
- int型とboolean型の2つの引数を受け取る。
- 次の処理を10回繰り返す
・int型引数で指定された大きさのint型バッファを新規作成する。
・boolean型引数がtrueのときはダイレクトバッファ、falseのときは非ダイレクトバッファを作成する。
・バッファの先頭から順に0,1,2,...というように連番の数字を書き込む。 - メソッドの最後に、引数の内容とメソッドの処理にかかった時間をコンソールに出力する。
このメソッドを、バッファサイズ100/1,000/10,000/100,000/1,000,000、ダイレクトバッファ/非ダイレクトバッファすべての組み合わせで実行するコンソールアプリケーションを作成してください。
(実習課題2)
実習課題1のプログラムで、作成するバッファサイズを増加させていくとOutOfMemoryErrorが発生することを確認してください。ダイレクトバッファと非ダイレクトバッファの作成の際にそれぞれエラーを発生させ、javaのオプションを指定することによりエラーを発生させないようにして下さい。