2016-09-21 5 views
10

私は奇妙なメモリリークのトラブルシューティングを行います。これはJava 7に固有のもので、7u79では発生しません。Javaメモリリーク - jmapはクラスを表示しませんが、jstatは

私はJavaコードにアクセスできません。 私はリークがクラ​​ス(ないヒープ)と問題のクラスについて知っている、アクションはリークが発生し、正確にどのユーザーを知っているが、+ TraceClassLoading + TraceClassUnloadingを見つけるのは簡単です:

[Loaded com.mastercard.mcwallet.sdk.xml.allservices.ShoppingCartRequest$JaxbAccessorF_oAuthToken from __JVM_DefineClass__] 
[Loaded com.mastercard.mcwallet.sdk.... thousand similar classes per one user action... ] 

これらのクラスは、増加するように見えますjstat -classによってクラスカウンタ出力:

Loaded Bytes Unloaded Bytes  Time 
14045 26138.8  0  0.0  110.00 << buggy user action 
14675 26754.6  0  0.0  110.05 
15300 27364.9  0  0.0  110.10 
15304 27370.9  0  0.0  110.11 
15304 27370.9  0  0.0  110.11 
15304 27370.9  0  0.0  110.11 
15306 27374.0  0  0.0  110.11 
15306 27374.0  0  0.0  110.11 
15306 27374.0  0  0.0  110.11 
15306 27374.0  0  0.0  110.11 << buggy user action 
15930 27982.2  0  0.0  110.18 
16553 28589.3  0  0.0  110.23 
16553 28589.3  0  0.0  110.23 

事は、これらのクラスは、ガベージコレクションメタスペースから、決して[Unloaded]されることはありません、彼らはjmap -clstatsには表示されませんということです。

class_loader classes bytes parent_loader alive? type 

<bootstrap>  2574 4493256 null   live <internal> 
0x0000000087d016d0  1  1471 0x000000008237f088  dead sun/reflect/[email protected] 
... some lines omitted ... 
0x000000008237f088  6505 12228227  0x0000000080383938  dead org/apache/catalina/loader/[email protected] 
... some lines omitted ... 
total = 600  14002 25351427   N/A   alive=1, dead=599   N/A 

私はプログラマに渡すことができ、このリングに任意の鐘をしていたり​​任意のヒントを提供します:クラスの下の数は、数は増加しないコマンドのレポートは、何も不審なクラスローダはありませんか?彼らは、漏れを見つけることができないと言います。 JVMオプションを使用してこの漏れを止めることはできますか?

+0

「MetaSpace」にのみ問題がありますか? 'ヒープ 'はどう?あなたは 'Java'プロセスメモリ使用量統計も提供できますか? –

+0

メタスペースのみ、ヒープは安定しており、いっぱいではありません。正確な統計は何ですか? – kubanczyk

+0

私は、Javaプロセスのメモリ使用量がどのくらい高速になるのかを意味しますか? –

答えて

2

私はJaxBがガベージコレクションされていないクラスをあなたのメモリにロードしていると推測します。クラスがアンロードされていない場合、メタスペースは空になりません。

JaxB memory issue for Java 8を確認してください。私はあなたが依存性APIのバージョンを交換するか、余分なパラメータを切り替えることでこの例外を取り除くことができると思います:

-Dcom.sun.xml.bind.v2.bytecode.ClassTailor.noOptimize=true 
6

バグのクラスがアンロードに使用できない場合、アプリケーションのどこかにキャッシュされていなければなりません。私は目標がどこにあるのかを見つけ、開発者にこの情報を提供することを理解しています。

ヒープダンプを検査するためにEclipse Memory Analyzer(MAT)を使用すると、バグのあるクラスへのリンクを持つ問題のある領域、クラス、およびインスタンスが表示されることがあります。

関連する問題