33

私のサーバーは CentOS 6.7 で 1.8.0_92 を使用しています。GC パラメータは「-Xms16g -Xmx16g -XX:+UseG1GC」です。したがって、デフォルトの InitiatingHeapOccupancyPercent は 45、G1HeapWastePercent は 5、G1MixedGCLiveThresholdPercent は 85 です。私のサーバーの混合 GC は 7.2GB から開始されますが、クリーニングはますます少なくなり、最終的に古い世代は 7.2GB よりも大きく維持されるため、常に並行マークを実行しようとします。最後に、すべてのヒープが使い果たされ、完全な GC が発生しました。完全な GC の後、使用される古い世代は 500MB 未満です。

古い世代

混合 GC がこれ以上収集できない理由が気になります。ライブ データがそれほど多くないように見えます...

g1 関連の情報を印刷してみましたが、以下のようなメッセージがたくさん見つかりました。私の古い世代には多くのライブ データが含まれているようですが、フル GC でこれほど多くのデータを収集できるのはなぜですか...

G1Ergonomics (Mixed GCs) do not continue mixed GCs, reason: reclaimable percentage not over threshold, candidate old regions: 190 regions, reclaimable: 856223240 bytes (4.98 %),  threshold: 5.00 %

以下のログは、高速化のために InitiatingHeapOccupancyPercent を 15 (2.4GB で同時実行マークを開始) に変更した結果です。

### PHASE Post-Marking
......
### SUMMARY  capacity: 16384.00 MB  used: 2918.42 MB / 17.81 %  prev-live: 2407.92 MB / 14.70 %  next-live: 2395.00 MB / 14.62 %  remset: 56.66 MB  code-roots: 0.91 MB
### PHASE Post-Sorting
....
### SUMMARY  capacity: 1624.00 MB  used: 1624.00 MB / 100.00 %  prev-live: 1123.70 MB / 69.19 %  next-live: 0.00 MB / 0.00 %  remset: 35.90 MB  code-roots: 0.89 MB

編集:

混合GCの後にフルGCをトリガーしようとしましたが、それでも4xx MBに減少する可能性があるため、古い世代ではより多くのデータを収集できるようです。

ここに画像の説明を入力

フル GC の前に、混合 GC ログは

 32654.979: [G1Ergonomics (Mixed GCs) start mixed GCs, reason: candidate old regions available, candidate old regions: 457 regions, reclaimable: 2956666176 bytes (17.21 %), threshold: 5.00 %], 0.1106810 secs]
 ....
 [Eden: 6680.0M(6680.0M)->0.0B(536.0M) Survivors: 344.0M->280.0M Heap: 14.0G(16.0G)->7606.6M(16.0G)]
 [Times: user=2.31 sys=0.01, real=0.11 secs]
 ...
 [GC pause (G1 Evacuation Pause) (mixed)
 ...
 32656.876: [G1Ergonomics (CSet Construction) finish adding old regions to CSet, reason: old CSet region num reached max, old: 205 regions, max: 205 regions]
 32656.876: [G1Ergonomics (CSet Construction) finish choosing CSet, eden: 67 regions, survivors: 35 regions, old: 205 regions, predicted pause time: 173.84 ms, target pause time: 200.00 ms]
 32656.992: [G1Ergonomics (Mixed GCs) continue mixed GCs, reason: candidate old regions available, candidate old regions: 252 regions, reclaimable: 1321193600 bytes (7.69 %), threshold: 5.00 %]
 [Eden: 536.0M(536.0M)->0.0B(720.0M) Survivors: 280.0M->96.0M Heap: 8142.6M(16.0G)->6029.9M(16.0G)]
 [Times: user=2.49 sys=0.01, real=0.12 secs]
 ...
 [GC pause (G1 Evacuation Pause) (mixed)
 ...
 32659.727: [G1Ergonomics (CSet Construction) finish adding old regions to CSet, reason: reclaimable percentage not over threshold, old: 66 regions, max: 205 regions, reclaimable: 857822432 bytes (4.99 %), threshold: 5.00 %]
 32659.727: [G1Ergonomics (CSet Construction) finish choosing CSet, eden: 90 regions, survivors: 12 regions, old: 66 regions, predicted pause time: 120.51 ms, target pause time: 200.00 ms]
 32659.785: [G1Ergonomics (Mixed GCs) do not continue mixed GCs, reason: reclaimable percentage not over threshold, candidate old regions: 186 regions, reclaimable: 857822432 bytes (4.99 %), threshold: 5.00 %]
 [Eden: 720.0M(720.0M)->0.0B(9064.0M) Survivors: 96.0M->64.0M Heap: 6749.9M(16.0G)->5572.0M(16.0G)]
 [Times: user=1.20 sys=0.00, real=0.06 secs]

編集: 2016/12/11

で別のマシンからヒープをダンプしました-Xmx4G

レタスを redis クライアントとして使用しましたが、LatencyUtils を使用した追跡機能があります。これにより、LatencyStats ( long[]3000 近くの要素を持つものを含む) インスタンスが 10 分ごとに弱く参照されます (公開後のレイテンシーのリセットはデフォルトで true、https://github.com/mp911de/lettuce/wiki/Command-Latency-Metrics )。そのため、久しぶりに LatencyStats の弱い参照をたくさん作成します。

フル GC の前。 afterFullGc

afterFullGc

afterFullGc

フル GC 後。 afterFullGc

現在、レタスからの追跡は必要ないので、無効にするだけで完全な GC がなくなります。しかし、混合 gc がそれらをクリアしない理由がわかりません。

4

1 に答える 1

1

まあ、設定したすべての引数について言及したわけではありませんが、

あなたは設定しようとすることができます

-XX:+ScavengeBeforeFullGC

また、自分のライフサイクルについても考える必要がありObjectます。アプリケーションObjectの存続期間とそのサイズObject

それについて考えて、次の議論を見てください

-XX:NewRatio=n              old/new ration (default 2)
-XX:SurvivorRatio=n         eden/survivor ratio (default 8)
-XX:MaxTenuringThreshold=n  number of times, objects are moved from survivor one to survivor two and vice versa before objects are moved to old-gen (default 15)

デフォルト値では、Xms と Xmx は 32gb に設定されています -> 古い世代 = 16gb と新しい世代 16gb -> eden 14gb -> 生存者 2gb (2 つあり、それぞれのサイズは 1gb です)

eden には、Objectによってインスタンス化されたすべての が含まれますnew Object

1 つの生存者 (to-survivor) は常に空です。他のもの (from-survivor) にObjectは、マイナー gc を生き延びた s が含まれています

ObjectEden および from-survivor からの存続するs は、マイナー gc で to-survivor に入ります

この「デフォルト構成」の 1 GB の標準サイズを超える場合、Objects は旧世代に入ります

超えない場合は、15 回のマイナー gc ( -XX:MaxTenuringThresholds デフォルト値) の後、Objects は old-gen に入ります

これらの値を微調整することにより、old-gen は new-gen と同じかそれよりも大きくなければならないことに常に注意してください。gc によって new-gen 全体が old-gen になる可能性があるためです。

編集

最初の「old gen: used」写真のタイムラインが参考になります

old gen が超えなくなるまでフル GC を実行する必要はないことに注意してください。フル GC を実行すると、「ワールド」全体が一定期間停止します。

この特定のケースでは、私はあなたができると言います

  1. 減らし-Xms-Xmx8GBに
  2. -XX:SurvivorRatios 値を 2 に設定/減少
  3. -XX:MaxTenuringThreshold50に設定/増加

そして、それぞれのサイズが 4 GB の古い世代と新しい世代を取得します。

2GBのサイズのエデン、

2 つの生存者、それぞれのサイズは 1GB、

および約 50 のマイナー gc が、Objects が古い世代に入る前に

于 2019-06-22T19:43:09.100 に答える