CGLIB 動的プロキシ オブジェクト GC のトラブルシューティング | JD Cloud テクニカル チーム

1. 問題が発見された経緯

最近、開発完了後に新システムを立ち上げることになりましたが、システムコールが多いため、まずコアインターフェイスのストレステストが行​​われますが、コアインターフェイスは基本的に純粋なメモリ操作しかないため、コア インターフェイスの圧力テスト QPS は最大数千まで可能です。

圧力試験容器構成:4C8G

まず、同時実行数 10 から開始すると、CPU は 100% まで上昇しますが、コア インターフェイスの QPS は約 200 にすぎません。そこで、jvm のガベージ コレクションを観察すると、 younggc は非常に頻繁に発生していますが、fullGC の数はゼロであることがわかりました。

次に、トラブルシューティングの詳細なプロセス

圧力テストが開始されるとすぐにコンテナーの CPU が 100% に上昇したため、まず CPU 使用率の問題を特定し、CPU 使用率が最も高いプロセスを見つける必要があります。top コマンドを使用してプロセス ID を検索し、それがストレス テストの Java アプリケーション プロセス ID であることを確認してから、Jinchenxi の CPU 使用率が最も高いスレッドを特定し、top -p プロセス ID を使用できます。 -H コマンドを使用して、このプロセス情報の下のスレッドの CPU 使用率を表示します。

top

top -p 进程ID -H

画像の PID 列は、10 進数で表示されたスレッド ID を 16 進数に変換したものです。jstack システム プロセス ID | grep 16 進数スレッド ID コマンドを使用して、対応するスレッド情報を検索すると次のようになります。つまり、スレッドが約半分を占めています。 CPUの。

jstack 系统进程ID | grep 16进制线程ID

現時点では、Finalizer スレッドが存在しますが、このスレッドは何を行うのでしょうか?

このスレッドはループし続け、java.lang.ref.Finalizer.ReferenceQueue 内の新しいオブジェクトを待ち続けることがわかります。Finalizer スレッドは、新しいオブジェクトがキューに出現したことを検出すると、オブジェクトをポップし、その Finalize() メソッドを呼び出し、Finalizer クラスから参照を削除します。これにより、次回 GC が実行されるときに、Finalizer インスタンスとそのインスタンスが削除されます。参照されたオブジェクトはガベージ コレクションできます。このスレッドがノンストップで動作している場合は、ファイナライザーのキュー内に GC を待っているガベージ オブジェクトが多数あることを意味します。この時点で、別のコマンドを使用して、どのガベージ オブジェクトが収集を待っているかを確認できます。

jmap -finalizerinfo 进程ID
Count Class description
-------------------------------------------------------
32221 com.jd.price.deep.exact.entity.coupons.DeepExactCouponVo$$EnhancerByCGLIB$$200e6ee6
14908 com.jd.pricedoor.compute.promotion.MultiplePromotion$$EnhancerByCGLIB$$a59933de
11982 java.util.zip.Deflater
1 java.net.SocksSocketImpl

上記の結果から、多くのビジネス オブジェクトが存在することがわかります。クラス名から、これらのオブジェクトは CGLIB 動的プロキシによって作成され、これらの動的プロキシ クラスはデフォルトで Finalize メソッドを実装していることがわかります。ファイナライズ メソッドを実行するため、ファイナライザーのキューにバックログが記録されます。

3. 問題の解決方法

上記の調査プロセスにより、多数のビジネス オブジェクトが CGLIB を通じて動的プロキシ クラスを作成し、これらのプロキシはシステムがリクエストを処理するときに作成される一時オブジェクトであることがわかりました。リクエストの完了後、これらの一時オブジェクトはガベージ コレクションされる必要があります。結果として、ファイナライザー スレッドの実行により CPU リソースが頻繁に占有されます。

上記の分析結果によれば、次のようないくつかの解決策が考えられます。

1. 頻繁にガベージ コレクションが必要なオブジェクトの動的プロキシの作成には CGLIB を使用しないでください。静的プロキシ クラスは手動で作成できます。

2. オブジェクトを再利用し、一時オブジェクトの生成を最小限に抑えます。

著者: Jingdong Retail 曹志飛

出典: JD Cloud 開発者コミュニティ

MyBatis-Flex の MyBatis-Plus 盗用に関する明確化 Chrome の代替品であると主張する Arc ブラウザ 1.0 が正式にリリース OpenAI が Android バージョンを正式にリリース ChatGPT VS Code で名前の難読化圧縮が最適化され、組み込み JS が 20% 削減されました。 LK-99: 最初の室温常圧超伝導体? マスク氏は「ゼロ元で購入」し、@x Twitter アカウントを強奪したPython 運営委員会は PEP 703 提案を受け入れる予定で、 グローバル インタープリタ ロックをオプションにする . システムのオープンソースで無料のパケット キャプチャ ソフトウェアへのアクセス数Stack Overflow大幅に下落し、マスク氏はLLMに取って代わられたと述べた
{{名前}}
{{名前}}

おすすめ

転載: my.oschina.net/u/4090830/blog/10092153