プロジェクトでのJVMの実際の戦闘

ヒープメモリセットの量、新世代のメモリ量、ガベージコレクター、GC頻度など、プロジェクト内のJVM関連のパラメーターを知っているかどうかわからないため、この記事ではJVMについて説明します。実際のパラメータからプロジェクト内。

1.
メモリ分析ツールの準備の準備
IBMのHeapAnalyzer、
ここにあるeclipseのMATなど、多くのメモリ分析ツールがあります。eclipseMATの公式ダウンロードアドレスを使用してください。

常用命令:
top  查看监控整体信息
jps  可以查看部署的Java Pid
jinfo 可以查看jvm相关参数
jstat 可以查看gc相关信息,比如gc次数,新生代,老年代占比等等
jmap  用于查看堆信息,当然也可以导出dump文件

这些都是命令行工具,当然也有可视化工具
jconsole,jvisualvm

2.直接起動します。
本番環境では運用が許可されていないため、テスト環境を使用して運用します。
まず第一に、私たちの若いgcはより頻繁で、約1分に1回であり、完全なgcの数は比較的少ないことがわかりました。若いgcをトリガーする条件は、エデンエリアがいっぱいになることです。そのため、エデンエリアがすぐにいっぱいになる理由を知りたいです。YGC回は1061回であることがわかり
ここに画像の説明を挿入
ます。パラメータ意味を以下に説明します。

①使用トップJPSは、 JavaプロセスのPID検索するコマンド
トップは-b pidの35のJava見つける
ここに画像の説明を挿入
JPS 35
ここに画像の説明を挿入
②使用をJinfoの私たちのJVM情報をチェックし、新しい世代を見ることができ、古い時代、ガベージコレクタのタイプなど
のjinfo -フラグ35
ここに画像の説明を挿入

我们一般用下列参数来初始化jvm参数
-Xms 最小堆内存
-Xmx 最大堆内存
-Xmn 新生代内存=-XX:newSize = -XX:MaxnewSize = -Xmn.也就是说-Xmn会同时设置前面2个参数
-XX:+UseXXGC 表示使用哪种GC
-XX:PermSize 设置永久代最小空间大小。
-XX:MaxPermSize 设置永久代最大空间大小。
-Xss 设置每个线程的堆栈大小。
-XX:NewRatio=n:设置年轻代和年老代的比值。如:3,表示年轻代与年老代比值为13,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=32,一个Survivor区占整个年轻代的1/5

③使用JSTATビューGC情報
35 -gcutil JSTATヒープの割合を示すための情報
ここに画像の説明を挿入

各参数含义:
S0   survivor区
S1   survivor区
E    eden区
O    老年代区
M    jdk1.8是元空间 1.7是P 永久代
CCS  压缩空间
YGC  young gc 次数
YGCT young gc 耗时
FGC  full gc 次数
FGCT full gc 耗时
GCT  gc总耗时

これは参照でき
ます④usejmapスタック情報のエクスポート
jmap-dump:format = b、file = heap.hprof35⑤
ここに画像の説明を挿入
ダウンロードしたばかりのMATツールを開き、ファイルの左上隅にあるファイルをheap.hprofにエクスポートします。
ここに画像の説明を挿入
ここではMATツールに焦点を当てます。リーク容疑者は非常に親密です。メモリリークの可能性を発見しました。クリックして確認してください。
ここに画像の説明を挿入
上記のメモリの26.47%が私のコーディングの対象であることがわかります。このクラスは、インターセプトオブジェクトを生成するために使用される、リンク全体の監視クラスです。リンク全体がJavaプローブによってアクセスされていると推測できます。プロキシと同様に、インターセプターインターセプトを使用してリクエストの前後にリクエスト情報を収集し、リクエストが完了した後、インターセプターオブジェクトをリサイクルできるため、エデンエリアが非常に遅いことがわかります。インターセプターオブジェクトを作成し、ygcによって再度再生されます。
もちろん、実際の調査プロセスはそれほど単純ではありません。通常、隠されたレベルは非常に深く、これは他の機能を使用するためです。

例えば、ドミネーターツリー:あなたはメモリの割合は、オブジェクトによって占有見ることができる、と私たちは、これらの大きなオブジェクトを確認することができます
ここに画像の説明を挿入
最初にあなたが見ることができます。
浅いヒープの意味をとでヒープを保持上図
浅いヒープ:メモリがによって占められオブジェクト参照を含まないオブジェクト自体のサイズ
保持ヒープ:現在のオブジェクト+現在のオブジェクトのサイズは、オブジェクトの合計サイズを直接または間接的に参照できます。(間接参照の意味:A-> B-> C、Cは間接参照です)、GCルートによって直接または間接的に参照されるオブジェクト除外します。
具体的な違いについては、この記事を参照してください:
リンクの説明
追加すると、このオブジェクトはgcによってリリースされたメモリは保持されたヒープです

次に、オブジェクトをクリックして、オブジェクトの着信参照と発信参照のリストをクリックし、着信参照を分析
します。オブジェクトの
発信参照を参照するオブジェクト:オブジェクトが参照するオブジェクト。たとえば
、AとBはCを参照し、CはCを参照します。 D、Eは
Cの観点から、ABはCの着信参照、DEはCの発信参照です。

ここに画像の説明を挿入
発信参照、つまりオブジェクトによって参照されているオブジェクトを調べています。インターセプターオブジェクトでいっぱいの配列があることがわかります。これにより、先ほど述べた
ここに画像の説明を挿入
一般的なプロセスが次のようになっていることが確認できます。検索方法がわからない場合は、もっと試してください。

おすすめ

転載: blog.csdn.net/u010857795/article/details/112943756