問題タブ [metaspace]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Wildfly 8.2.1 にデプロイされた Java 8 アプリケーションのメタスペース メモリ消費の問題
問題の説明
Wildfly 8.2.1 で Java8 アプリケーションを 1 つデプロイするたびに、Metaspace メモリ プールから約 30 ~ 40 MB が使用されることに気付きました。それは問題ありませんが、同じアプリを再デプロイすると、メタスペースのメモリ使用量が同じ 30 ~ 40 MB 増加しているのに対し、既に割り当てられている古いメモリは解放されません。
私はそれに気付かないでしょうが、問題は、約 20 個のアプリケーションがあり、時々、同時に最大 10 個のアプリケーションを再デプロイする必要があるということです。その結果、恐ろしい絵が生まれます。
基本的に、示されているのは、10 個までのアプリケーションの 2 回の再デプロイです。
古いクラスに割り当てられたメモリを GC が解放できない理由がわかりません。このサーバーには合計 16 GB の物理メモリがあるため、すべてのアプリを最大 20 ~ 40 回再展開できます。アプリ サーバーが制限に達し、コマンドへの応答を停止します。
したがって、誰かが実際の問題が何であるかを理解するのを手伝ってくれたら、とても感謝しています:
- それはJava8の問題ですか?(jdk 1.8.0_40-b26)
- Wildfly 8.2.1 の問題ですか?
- または、コードベースが原因であるという答えはできるだけ単純ですか? もしそうなら、本当の理由は何か教えていただけませんか?
私のコードベースに関連するいくつかの詳細
1) Wildfly と共に、2 つのスタンドアロン HornetQ サーバーを使用します。各アプリケーションは、それぞれに少なくとも 5 つの同時コンシューマーを持つ最大 5 つのチャネルを使用します。これにより、アプリごとに少なくとも 25 スレッドになり、合計で少なくとも 25*20 = 500 スレッドになります。
2) すべての低レベル JMS 操作には、Spring JMS を使用します。
java - メタスペースとガベージ コレクション
メタスペースがいっぱいになるという問題がいくつかあり、GC がそれに対してどのように機能するかを理解しようとしています。ここで、マイナー GC によってメタスペースの使用量が増加することを読みました。私もそれに関する文献を読んでいますが、適切な結論に達することができませんでした.
GC(マイナーとメジャーの両方)がメタスペースにどのように影響するかについて、誰かがよく説明していますか?
java - OutOfMemoryError: 圧縮されたクラス スペース
このエラーが発生しました:
トリガーが何であるかを理解するまで、圧縮されたクラスポインターを無効にしようとしました
-XX:-UseCompressedClassPointers.
しかし、私はまだこのエラーが発生します。どのように可能ですか?
ありがとう!
hibernate - Java 8で時間の経過とともにクラスのメタスペースが増加するのはなぜですか?
Tomcat アプリケーション (Hibernate + EhCache で構成) を実行しています。多くのクラスを作成するべきではない典型的な ORM webapp です。ただし、ネイティブ メモリ トラッキングでは「いいえ」と表示されます。
過去 24 時間、私の webapp は、Metaspace で平均して 1 時間あたり約 1 つの新しいクラスを作成し、ピークでは 1 時間あたり 11 クラス、ピークでは 4 時間、クラスを作成しませんでした。
それで、7449 クラスから始めて、24 時間後には 7481 クラスになりました。フル GC を誘導した後、クラスの数は 0 ~ 2 減少する可能性がありますが、全体的には同じままです。
そう
クラスが遅延ロードされる場合、ネイティブ メモリに作成されるクラスの総数をどのように推定できますか?
- Hibernate がプロキシ クラスを作成することは知っています。これらのプロキシ クラス数を予測する方法はありますか?
- JVMにすべてのクラスを熱心にロードさせる方法は?
Metaspace にロードされた新しいクラスをログに記録するにはどうすればよいですか?
私の構成:
java - java8 "java.lang.OutOfMemoryError: メタスペース"
Java アプリケーション (Tomcat で実行されるサービス) の JRE を Java 7 から Java 8 に切り替えたjava.lang.OutOfMemoryError: Metaspace
後、トラフィック量が多い状態で数日間実行した後、確認できるようになりました。
ヒープの使用は問題ありませんでした。パフォーマンス テスト中に同じコード フローが実行された後、メタスペースがジャンプします。
メタスペース メモリの問題の考えられる原因は何ですか?
現在の設定は次のとおりです。
また、アプリケーションはリフレクションを多用しています。また、カスタム クラス ローダーを使用します。それらはすべてJava 7で正常に機能していました。
java - Java 8 VM.native_memory
Java 8 メタスペースのメモリ管理に苦労しています。現在、RHEL で jdk 1.8_60 を使用しています。
これは私のTomcatクラスパスです:
を実行するjcmd <PID> VM.native_memory summary.diff
と、クラス用に予約されたメモリ (メタスペース サイズと思われるもの) が 256m を超えていることが示されます (デフォルトの 1g のように見えます)。
動的 WS 呼び出しにcxf動的クライアントを使用しているため、呼び出しごとに大量のクラスが生成されますが、このクラスがメタスペースから削除されることはないようです (ボタンをクリックしても、jvisualvm 内で gc を実行します)。最後にメタスペースがいっぱいになり、アプリケーションはOutOfMemoryException: Metaspaceで終了します
この構成でGC1も使用しまし-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+ParallelRefProcEnabled -XX:+AggressiveOpts
たが、役に立ちませんでした。
jvm にバグがあり、メタスペースのメモリ割り当てが誤って構成されている可能性はありますか (または、メタスペースを管理するためにこの値を使用します)。誰かがメタスペースのクリーンアップの問題を解決する方法を教えてもらえますか?
どうもありがとう
java - Java バージョンを 1.7 から 1.8 にアップグレードした後、CPU 使用率が低下しました
私のアプリケーションでは、最近 Java 1.7 から1.8にアップグレードしました。パフォーマンス テストの結果によると、CPU 使用率が大きな問題であり、71%増加したことが確認されました。
jdk8でjvm引数の下にこれを使用しています:
これらすべてとは別に、私が非常に混乱している最も重要なことは、今選択すべき MaxMetaSpaceSize です。
Jdk1.7の場合、私は使用していました:
MaxPermSize を MaxMetaSpaceSize に変更しただけで、jdk1.8 ですべてを同じに保ちました。
アプリケーションのパフォーマンスを向上させる方法を教えてください。私が欠けているものはありますか-jdk8はネイティブメモリ領域を使用しているため、したがって
- サーバーヘルプのスペースを増やすかどうか。
- MaxMetaspaceSize の値を以前と同じに保ちました。この新しいアーキテクチャでこの値を決定するにはどうすればよいでしょうか。
java - クラスのアンロード (メタスペースのクリーンアップ) / cxf の問題に対する Java 8 セットアップの修正
アプリケーションで動的 CXF クライアントを作成しています。
これは、クライアント作成のコード スニペットです。
さて、このパラメータでテストアプリケーションをセットアップすると
クライアントの作成をループで実行すると、java.lang.OutOfMemoryError: Metaspace exception が発生します。クラスがアンロードされない/メタスペースがクリーンアップされない理由がわかりません。ここで誰かが私を助けることができれば、私のテストプロジェクトです。それをビルド(mvn clean package)して、私と同じようにコマンドラインで実行するだけです。
私はJDK8u77を使用しています。
java - MetaspaceSize を設定するためのガイドライン - Java 8
64 ビット サーバーの MetaspaceSize の既定値は? 公式ドキュメントでは見つかりませんでした。
サーバー JVM プロセスでは、GC の頻度が高くなり、増加し続けることがあります。サービスを数回再起動すると、安定に戻ります。JREのアップグレードによるものだと思います。
JVM ヒープの最大サイズは 6GB に設定されていますが、この問題が発生すると、3GB のヒープしか使用されていません。メタスペースはほとんど増加せず、ほぼ常に満杯です。メタスペースを 1GB に増やしてみたところ、スループットが向上しました。
起こっていることは、メタスペースがデフォルトで非常に低い値に設定されているため、GC が開始されることだと思います。GC が発生するたびに、最高水準点が継続的に (再び非常に低い量で) 増加します。
MetaspaceSize を設定したい (現在の値がわからない)。
Oracle のドキュメントによると、MetaspaceSize を何に設定するかを知るためのガイドラインはありません。しかし、それを設定する正しい値を見つける方法はありますか?
Oracle ドキュメントから得た 1 つのヒントは次のとおりです。
If the committed space available for class metadata as a percentage of the total committed space for class metadata is greater than MaxMetaspaceFreeRatio, then the high-water mark will be lowered. If it is less than MinMetaspaceFreeRatio, then the high-water mark will be raised.
しかし、GC を安定させる方法がまだわかりません。3 つの質問があります。
- 64 ビット サーバーのデフォルトの MetaspaceSize はいくつですか?
- デフォルトの比率: MaxMetaspaceFreeRatio、MinMetaspaceFreeRatio は何に設定されていますか? 答え: Min が 40、Max が 70 であることを示しています
- Metaspacesize 値を決定するにはどうすればよいですか?
jvm - Java8 メタスペース ダンプ (ヒープ ダンプではない) を取得する方法
Java8 ホットスポット VM からメタスペース ダンプを取得できるツールはありますか?