Javaヒープ領域について
Javaヒープとシステムのメモリ領域
Javaプログラムを実行しているとJavaヒープ領域に余裕があるににもかかわらずメモリ不足、またはリソース不足になる場合があります。その場合の原因と対処方法を以下に示します。
- 動作中のスレッドの数が多すぎる
Windows 版の JavaVM では、Java のスレッドは Windows のスレッド API を用いて実装されています。
Windows上では使用できるスレッドの数にはプロセスあるいはシステム全体での上限があり、それを超えると OutOfMemoryError
が発生します。
このような状況になった場合には、アプリケーションで使用するスレッドの数を減らすようにしてください。
- Windows のリソースを消費するオブジェクトを大量に使用している
次のオブジェクトが Windows のリソースを消費します。
- ヘビーウェイトの GUI 部品( Java の AWT 部品)
AWT の Button や Label などのヘビーウェイト部品は、Windows のウィンドウを用いて実装されています。
- グラフィックオブジェクト( java.awt.Graphics クラスのオブジェクト)
AWT のグラフィックオブジェクトは、Windows のデバイスコンテキストを用いて実装されています。
- (1.1系の JavaVM のみ)イメージオブジェクト( java.awt.Image
クラスのオブジェクト)
1.1系の JavaVM では、AWT のイメージオブジェクトは、Windows のビットマップを用いて実装されています。
WindowsNT4.0 / 2000 の場合には、これらのリソースは JavaVM のヒープ領域ではなく、マシンの空きメモリ上に確保されます(下図“空き領域”部)。
|
マシンの全メモリ
|
|
OSの使用領域
|
同時に実行している他のアプリの使用領域
|
JavaVMの使用領域
|
空き領域
|
|
インタプリタの使用領域
|
JavaVMのヒープに割り当てられた領域
|
[ JavaVM 実行時のマシンのメモリ使用状況]
このため、JavaVM のヒープ領域に余裕があってもシステムの空きメモリ領域がないとこれらのオブジェクトは作成できなくなります。
Windows95 / 98 の場合には、Windows のウィンドウとデバイスコンテキストはシステムリソース上に、ビットマップは GDI
リソース上に確保されます。
使用できるシステムリソースと GDI リソースの量は OS 全体で上限が決められていますので、その上限を超えるとこれらのオブジェクトは作成できなくなります。
( Windows95 / 98 でのリソースの使用状況は OS 添付のリソースメータを用いて確認できます)
