PermGenで最高の処理を行う無料のJVM実装は何ですか?
質問
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スペースを大幅に増やす準備をしてください。
他のヒント
技術的には、「PermGen」メモリプールはSun JVMのものです。他のJVMはそれを呼び出しませんが、それらはすべて1つ以上の非ヒープメモリプールの概念を持っています。
ただし、Sun JVMでpermgenに問題がある場合、別のJVMに移動しても問題が解決することはほとんどありません。別の名前で表示されます。
複数の再デプロイメントが問題を引き起こしている場合は、VMのPermGenを大きな値に上げてください。この非常に問題があるため、しばらく前にJRockitを試しましたが、同じ再デプロイメントの枯渇に苦しんでいます。 SUn JVMに戻りました。
JVMの変更は万能薬ではありません。新しい予期しない問題が発生する可能性があります(たとえば、記事 4つの異なるJVMでのアプリケーションの起動について)。
- クラスリーク(クラスローダー経由など)が発生する可能性があり、ほとんどの場合は再デプロイ時に発生します。率直に言って、Tomcatでホット再デプロイが機能するのを見たことはありません(いつか見たいと思います)。
- JVMパラメータが正しくない場合があります(たとえば、Sun JDK 6 64ビットの場合-XX:+ UseParNewGCスイッチはPermGenのメモリセグメントをリークさせます。追加のスイッチを追加する場合:-XX:+ UseConcMarkSweepGC -XX:+ CMSClassUnloadingEnabled-XX: + CMSPermGenSweepingEnabled状況は解決されます。おかしいですが、Sun JDK 6 32ビットで上記のリークに遭遇したことはありませんでした。 記事へのリンク" Tiving JVM Garbage Collection for Production Deployments" 。
- PermGenチャンクでは、クラスおよび関連情報をロードするのに十分ではない場合があります(実際、Tomcatでの再デプロイ後に最も頻繁に発生し、古いクラスがメモリに残り、新しいクラスがロードされます)
過去の経験から、この種のリークをデバッグすることは、私がこれまで経験した中で最も厄介なデバッグの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がクラッシュせず、さまざまな設定を試すのに忙しくはありませんでした。