- PR -

大量のクラスパス

1
投稿者投稿内容
ken90H
会議室デビュー日: 2003/04/11
投稿数: 5
お住まい・勤務地: 芦屋市
投稿日時: 2005-06-28 12:02
クラスパスについて、ご質問がございます。

純粋なJ2SEアプリケーションにて、Java VMに対して多数のクラスパス(例えば、1000個)を設定した場合、Java VMのスタックエリアは、ヒープエリアのOut Of Memory Errorのようにパンクするものでしょうか。
私の記憶が間違いなければ、Java VMを起動する際、クラスローダー内にクラスパスに設定した全てのパス(jarファイル)を取り込む仕組みになってると思うので、単純に大量のクラスパスを設定した場合、クラスローダー(スタック)の領域がパンクするように思えます。
仮に、パンクするような状況があった場合、それを回避する方法があるのでしょうか。
Webで検索してみましたが、検索方法が下手なのか、うまく見つけ出せませんでした。。。

ご存じの方がいらっしゃいましたら、どうかご教授いただけないでしょうか。
どうぞ宜しくお願いいたしますm(_ _)m
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-06-28 12:10
現在の多くの JVM はVM起動時にすべてのクラスをロードするのではなく、必要に応じて都度ロードしていますのでVM起動時、main メソッド実行前に OOM が発生するようなことはないでしょう。
で、ロードしたクラスは、たとえば Sun の JVM では Permanent 領域という場所に保管されます。
あまりに多くのクラスをロードするとこの領域が枯渇してご認識の通り OutOfMemoryError が発生します。
-verbose:gc にてヒープサイズに余裕があるのに OOM が発生することが確認できれば多くの場合 Permanent領域が足りていないと考えて良いかと思います。この場合は -XX:MaxPermSize オプションにて Permanent 領域を多めに設定すれば Ok です。

他の OutOfMemoryError については BEA のサポートパターンに詳しい切り分け方が書いてあります。
・BEA サポートパターン - メモリ不足とメモリ リークに関する問題の調査
http://www.beasys.co.jp/cs/support_news/product_troubleshooting/Investigating_Out_of_Memory_Memory_Leak_Pattern.html

[ メッセージ編集済み 編集者: インギ 編集日時 2005-06-28 12:13 ]
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-06-28 12:36
クラスのローディングは、アプリケーション側で必要になるたびに必要なクラスだけが行われますので、クラスパス設定が沢山あるだけでメモリ消費が増えることはないですよ。

ただ、無駄にクラスパスが多いと、クラスのルックアップに時間がかかるようになると思いますので、パフォーマンスに影響がでるでしょう。
ken90H
会議室デビュー日: 2003/04/11
投稿数: 5
お住まい・勤務地: 芦屋市
投稿日時: 2005-06-28 15:55
ご丁寧なアドバイス、誠にありがとうございましたm(_ _)m

Java VMは、クラスパスに設定している全てのパスを、一度に取り込む作りになっていないんですね。勉強不足で初歩的な質問をしてしまい、申し訳ありません。。
大変助かりました。

今後もどうぞ宜しくお願いいたします。
1

スキルアップ/キャリアアップ(JOB@IT)