質問

Tomcat6をSunのJRE6で実行しており、すべてのカップルがデプロイするとOutOfMemoryException:PermGenが発生します。 PermGenソリューションのグーグルを行い、多くの修正を試みました。動作しません。 OracleのJRockitとそのPermGen割り当てのサイズをギグする方法(Sunの128Mと比較して)について多くの良いことを読みました。問題を解決することはできませんが、PermGen例外と2の間で100回再デプロイできます今すぐ。

JRockitの問題は、数千ドルかかるWebLogicを購入する必要がある本番環境で使用することです。 PermGen拡張をより寛容にする他の(無料の)オプションは何ですか?この領域では、以下のJVMはどのように機能しますか?

  • IBM JVM
  • JDKを開く
  • ブラックダウン
  • Kaffe

...その他?

更新: PermGenの最大値が128Mであると思う理由を尋ねる人もいます。その理由は、128Mを超えようとすると、JVMの初期化に失敗するためです。

[2009-06-18 01:39:44] [情報] VMの初期化中にエラーが発生しました [2009-06-18 01:39:44] [情報]オブジェクトヒープに十分なスペースを予約できませんでした [2009-06-18 01:39:44] [395 javajni.c] [エラー] CreateJavaVMが失敗しました

オブジェクトのスペースを確保しようとして失敗するのは奇妙ですヒープ 「a」の代わりにヒープヒープ。

初期1024MBおよび最大1536MBのヒープでJVMを起動します。

この質問は回答済みですので閉じます。 「切り替えは役に立たない」代わりに尋ねるなぜPermGenの設定が大きいとSun JVMが失敗しますか?

役に立ちましたか?

解決

PermGenのサイズを増やすことができるという点でMichael Borgwardtに同意しますが、これは主にメモリリークが原因であることに同意しません。 PermGenスペースは、Reflectionを頻繁に使用するアプリケーションによって積極的に消費されます。そのため、TomcatでSpring / Hibernateアプリケーションを実行している場合は、基本的にそのPermGenスペースを大幅に増やす準備をしてください。

他のヒント

SunのJVMは128MのPermGenに制限されているという考えをあなたに与えたのはなぜですか-XX:MaxPermSizeコマンドラインオプションを使用して自由に設定できます。デフォルトは64Mです。

ただし、問題の本当の原因はおそらく、クラスがガベージコレクションを取得できないようにするアプリケーションのメモリリークです。これらは、特にClassLoadersが関係している場合、非常に微妙な場合があります。必要なのは、任意のクラスへの単一の参照であり、どこでもです。 この記事では問題の詳細を説明し、これは修正方法を提案しています。

技術的には、「PermGen」メモリプールはSun JVMのものです。他のJVMはそれを呼び出しませんが、それらはすべて1つ以上の非ヒープメモリプールの概念を持っています。

ただし、Sun JVMでpermgenに問題がある場合、別のJVMに移動しても問題が解決することはほとんどありません。別の名前で表示されます。

複数の再デプロイメントが問題を引き起こしている場合は、VMのPermGenを大きな値に上げてください。この非常に問題があるため、しばらく前にJRockitを試しましたが、同じ再デプロイメントの枯渇に苦しんでいます。 SUn JVMに戻りました。

JVMの変更は万能薬ではありません。新しい予期しない問題が発生する可能性があります(たとえば、記事 4つの異なるJVMでのアプリケーションの起動について)。

過去の経験から、この種のリークをデバッグすることは、私がこれまで経験した中で最も厄介なデバッグの1つです。

[更新済み]

有用な記事アプリケーションの再デプロイ時にクラスローダーリンクを削除する方法

JRockitを使用していますが、メモリを(-XX:MaxPermSizeを介して)バンプしないと、PermGenエラーが発生します。また、これを回避するために機能するものは何もありません(増やすこと以外)。

perm genはおそらく処理するのに最も簡単なメモリです。さまざまなvm実装には大きな違いがあるとは思いません。

本番環境でオフとマークされているすべてのTomcat構成が本番環境でオフになっていることを確認します。

はい、その場で多くのクラスを生成するフレームワークもありますが、それらは自動的にクリーンアップする必要があり、いずれの場合でも、128Mbにいくつかのクラスを収めることができます。

まじめに、perm genが上がり続ける場合は、リークを修正する必要がありますが、修正するのはあなたの問題ではないかもしれません。

IBM JVM はサポートしていません2009)permgenがあります。 Java 7のデフォルトGCであるジェネレーションコンカレントガベージコレクター

お気に入りのプラグインではHotSpot JVMのpermgenが頻繁にいっぱいになるため、特にIBM JVMでEclipse IDEを実行することがあります。確かに、おそらく誰かが修正すべきメモリリークがありましたが、その間はIDEがクラッシュせず、さまざまな設定を試すのに忙しくはありませんでした。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top