Javaプログラムでのperm genスペースエラー

多くの場合、Javaアプリケーションの書き換え中にOutOfMemory:PermGenSpaceエラーが発生します。 それが何であるのか、なぜ起こるのか、どう対処するのかを見てみましょう。



このエラーはどういう意味ですか? Java仮想マシンが実行されている場合、アプリケーションクラスは、永続生成と呼ばれるメモリの特別な領域に格納されます。 クラスは比較的まれにロード/表示されるため、これは意図的に行われます。そのため、ガベージコレクターを頻繁に呼び出す必要はありません。 名前が示すように、そこからクラスがアンロードされないという誤解があります。 クラスがアンロードされるとは限りません。JConsoleユーティリティを使用してjavaプロセスに接続することで確認できます。



これらの問題が発生する理由を見てみましょう。 最も一般的なのは、プログラムのエラーです。 古いバージョンのアプリケーションで実行されているスレッドがハングアウトする可能性があり、何らかの理由で私が殺さない、リスナーが削除されないなどの場合があります。 このような問題との戦いは比較的簡単です。プロファイラーを使用して、古いクラスへのリンクを保持しているユーザーを見つける必要があります。 Eclipse Memory Analyzerはここで特に優れています: www.eclipse.org/mat。ギガバイトのメモリを占有するアプリケーションに簡単に耐えます。



また、Javaには、フックによるクラスリークを引き起こすいくつかのAPIとライブラリがあります。 ここ: opensource.atlassian.com/confluence/spring/display/DISC/Memory+leak+ - +classloader+won't+let+goでは、ソリューションの一般的な問題の原因のリストを見つけることができます。



多くの場合、すべてのトリックにもかかわらず、エラーはとにかくクラッシュし、プロファイラーではすべてが正常に見えます:アプリケーションコードはクラスを参照しませんが、何らかの理由でクラスがコンパイルされません。 ここでは、ほとんどの場合、問題はサーバー仮想マシンの特定の実装にあります。そのため、クラスが組み立てられる前に、ヒープの一部がいっぱいになります。 この問題は長い間知られており、Java Bug Paradeで最も人気のある問題の1つです。bugs.sun.com / bugdatabase / view_bug.do?bug_id = 4957990優先度が低いため、すぐに修正される可能性はほとんどありません。



どのように対処できますか? まず、–clientスイッチを使用して、クライアント仮想マシンでアプリケーションを実行できます。 ただし、この方法は、サーバー仮想マシンのみが存在する64ビットシステムでは機能しません。 別のオプションは、MaxPermSizeの値を実験的に選択することです。



All Articles