この記事では、Javaプログラムのメモリオーバーフローがより詳細になる理由を分析します。あなたの参照のために全員のためにそれを共有してください。詳細は次のとおりです。
java.lang.outofmemoryerror:permgenスペースエラーが報告されたオンラインシステムに遭遇した場合、問題を見つける必要があります。私はこれをずっと前に手に入れましたが、今は本当に覚えていませんが、これは本当に興味深い質問です。まず、最初の反応は、-xx:+printgcdetailsのパラメーターを追加して特定のGCログを見ることですが、プログラムはTomcatによって開始されるため、内部にカプセル化されていることが多すぎるのではないかと心配しています。
次に、このエラーの原因を見てみましょう。
Permgenスペースは、メモリの永続的な保存領域を指しますさまざまなヒープ領域(Garbage Collection)は、ランニングの順序でパーマンスペースをクリーンアップしないため、アプリケーションに非常にクラスがある場合、このエラーはWebサーバーで一般的ですjspに採点する前の場所。 Webアプリの下で多数の3番目のパーティジャーを使用すると、サイズがJVMのデフォルトサイズ(4m)を超えている場合、このエラーメッセージが生成されます。
次に、permgenの初期メモリサイズを増やしましょう。
Catalina.shファイルの先頭にLinuxの先頭に追加:コードコードを次のようにコピーします:java_opts = "-xms1024m -xmx1024m -xx:permsize = 256m -xx:maxpermsize = 256m" "" "" "
さらに、Catalina.batのファイルの先頭でWindows:コードコードをコピーします。次のようにコードをコピーします:java_opts = -xms1024m -xmx1024m -xx:permsize = 256m -xx:maxpermssize = 256m
次に、視覚的なメモリを使用してツールを表示して特定の問題を見つけます。もちろん、JDK6の優先ツールは、より一般的に使用されるJConsoleとJVisualVMです(後者は、豊富なプラグインサポートを備えているため、使用後に強くなります)。今回は、別の奇妙な問題に遭遇しました。つまり、分析ツールが開かれた後にTomcatプロセスが見つかりませんでした(その後JREが開始されたことがわかりました。
ローカルエリアは許可されていないため、JMXを開くだけでリモートで接続できます。
上記のように、Catalina.sh.shまたはcatalina.batファイルのjava_optsの先頭にコピーコードを追加します:-djava.rmi.server.hostname = 192.168.1.101-dcom.management.jmxremote.port.port.port.port = 900 0-- dcom.sun.management.jmxremote.ssl = false -dcom.sun.management.jmxremote.authenticate = false
プログラムを開始した後、ポートが正しく開かれているかどうかを確認して、リモートを接続できることを確認します。
私はここで怠け者で、セットアップする必要があるものをセットアップする方が面倒です。この設定は私のローカルPCで効果的ですが、サーバーではポートにポートを密封していないため、ポートを1000に変更する必要がありました。 jvisualvmを開き、[ファイル] - > [jmx接続を追加]をクリックしてから、localhost:1000を追加して接続します。
以前のプログラムの後、メモリの変更を一定期間観察した後、PERMの状況に焦点を当て、1日走っています。 Permのデフォルトの初期化は16mで、最大値が64mであり、実際の職業量が現在の現象から、この問題は再び発生しないため、Permメモリのサイズが以前に有効になっていない可能性があります。 。さらに問題を見つける必要がある場合は、Btraceを使用して、特定の方法が呼び出される場所を表示することもできます。これにより、特定のメソッドが予想どおりに実行されるかどうかを位置付けることができます。
この記事がすべての人のJavaプログラムのデザインに役立つことが期待されています。