7

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

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

  • IBM JVM
  • JDKを開く
  • ブラックダウン
  • カフェ

...その他?

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

[2009-06-18 01:39:44] [info] Error occurred during initialization of VM [2009-06-18 01:39:44] [info] Could not reserve enough space for object heap [2009-06-18 01:39:44] [395 javajni.c] [error] CreateJavaVM Failed

オブジェクトヒープ用のスペースを予約しようとして失敗するのは不思議ですが、それが「a」ヒープではなく「the」ヒープであるかどうかはわかりません。

初期ヒープが1024MB、最大ヒープが1536MBのJVMを起動します。

答えられたので、この質問を閉じます。「切り替えは役に立たない」と代わりに尋ねるなぜ私のSunJVMはより大きなPermGen設定で失敗するのですか?

4

7 に答える 7

7

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

于 2009-06-17T19:56:32.857 に答える
5

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

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

于 2009-06-17T19:35:14.130 に答える
3

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

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

複数の再デプロイが問題の原因である場合は、VMのPermGenを大きな値までブーストするだけです。この非常に問題があるため、しばらく前にJRockitを試しましたが、同じ再配置の枯渇に悩まされています。SUnJVMに戻りました。

于 2009-06-17T19:44:33.533 に答える
3

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

  • ほとんどの場合、再デプロイ時に発生するクラスリーク(クラスローダーを介したものなど)が発生する可能性があります。率直に言って、Tomcatでホットリデプロイが機能しているのを見たことがありません(いつか見たいと思っています)。
  • 誤ったJVMパラメータが存在する可能性があります(たとえば、Sun JDK 6 64ビット-XX:+ UseParNewGCスイッチはメモリのPermGenセグメントのリークにつながります。スイッチを追加すると:-XX:+ UseConcMarkSweepGC -XX:+ CMSClassUnloadingEnabled-XX:+ CMSPermGenSweepingEnabled状況は解決されます。おかしいですが、Sun JDK632ビットで上記のリークに遭遇したことはありません。記事「本番環境でのJVMガベージコレクションの調整」へのリンク。
  • PermGenチャンクは、クラスと関連情報をロードするのに十分ではない可能性があります(実際には、Tomcatで再デプロイした後に最も頻繁に発生し、古いクラスはメモリに残り、新しいクラスがロードされます)

私の過去の経験から、この種のリークのデバッグは、これまでで最もトリッキーな種類のデバッグの1つです。

[更新しました]

アプリケーションの再デプロイ時にクラスローダーリンクを削除する方法に関する役立つ記事。

于 2009-06-17T20:25:27.540 に答える
0

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

于 2009-06-17T19:56:18.037 に答える
0

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

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

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

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

于 2009-06-18T05:33:36.713 に答える
0

IBM JVMにはpermgenがありません(2009年にはありませんでした)。Java7のデフォルトのGCであるGenerationConcurrentGarbageCollectorの詳細を読むことができます。

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

于 2014-03-10T15:37:47.037 に答える