2016-06-13 9 views
1

私が取り組んでいるアプリケーションは、ヒープメモリの使用量が多いように見えています。オフヒープメモリリークの原因を検出することはできますか?

XmsとXmxを4096mに設定するようにアプリケーションを設定しました。しかし、PIDのトップを実行すると、プロセスがマシンのメモリの9.6%を消費していることがわかります(64GBのマシン→6.14gのアプリケーションフットプリント)。 これは、インスタンスが生存している時間が長くなるにつれて、無限に成長し続けているようです。居住者のサイズは約5.9gです。 jvisualvmを使用してプロセスを検査すると、健全なGCパターンで約1.5GBのヒープ使用量がわかります。私はヒープダンプとスレッドダンプを引っ張ってきたし、異常なものは見ない。

私はプロセスのためのpmapを引っ張った。ヒープサイズは、アプリケーションXmsおよびXmxのパラメータと一致しているように見えます。スタックは約130Kbです。

00000006c0000000 4195968K 1437248K 1437248K 1437248K  0K rw-p [anon] 
00000007c01a0000 1046912K  0K  0K  0K  0K ---p [anon] 
00007ff712acd000 230464K  0K  0K  0K  0K ---p [anon] 
00007ff7077cb000 148452K 10452K 10452K 10452K  0K rw-p [anon] 
00007ff711bdd000 15296K 15224K 15224K 15224K  0K rwxp [anon] 
00007ff7109c6000 14924K 14692K 14692K 14692K  0K rw-p [anon] 

いくつかの例のGCの挙動:

Java HotSpot(TM) 64-Bit Server VM (25.40-b25) for linux-amd64 JRE (1.8.0_40-b25), built on Feb 10 2015 21:29:53 by "java_re" with gcc 4.3.0 20080428 (Red Hat 4.3.0-8) 
Memory: 4k page, physical 65938804k(26225716k free), swap 4200444k(3654604k free) 
CommandLine flags: -XX:InitialHeapSize=4294967296 -XX:+ManagementServer -XX:MaxHeapSize=4294967296 -XX:ParallelGCThreads=2 -XX:+PrintGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseParallelGC 
2016-06-12T17:24:21.451-0400: 1339.579: [GC (Allocation Failure) [PSYoungGen: 1048576K->33662K(1223168K)] 1048576K->33670K(4019712K), 0.0644541 secs] [Times: user=0.12 sys=0.01, real=0.07 secs] 
2016-06-12T18:00:24.301-0400: 3502.429: [GC (Allocation Failure) [PSYoungGen: 1082238K->34800K(1223168K)] 1082246K->34808K(4019712K), 0.0422048 secs] [Times: user=0.08 sys=0.00, real=0.04 secs] 
2016-06-12T18:33:27.654-0400: 5485.782: [GC (Allocation Failure) [PSYoungGen: 1083376K->34960K(1223168K)] 1083384K->34968K(4019712K), 0.0382536 secs] [Times: user=0.07 sys=0.00, real=0.04 secs] 
2016-06-12T19:06:29.536-0400: 7467.664: [GC (Allocation Failure) [PSYoungGen: 1083536K->34903K(1223168K)] 1083544K->34911K(4019712K), 0.0377560 secs] [Times: user=0.07 sys=0.00, real=0.04 secs] 
2016-06-12T19:37:32.785-0400: 9330.912: [GC (Allocation Failure) [PSYoungGen: 1083479K->34512K(1223168K)] 1083487K->34520K(4019712K), 0.0382442 secs] [Times: user=0.07 sys=0.00, real=0.04 secs] 
2016-06-12T20:06:35.474-0400: 11073.602: [GC (Allocation Failure) [PSYoungGen: 1083088K->34624K(1362432K)] 1083096K->34632K(4158976K), 0.0445968 secs] [Times: user=0.07 sys=0.01, real=0.04 secs] 
2016-06-12T20:45:03.191-0400: 13381.318: [GC (Allocation Failure) [PSYoungGen: 1361216K->6579K(1333248K)] 1361224K->36444K(4129792K), 0.0489775 secs] [Times: user=0.08 sys=0.01, real=0.05 secs] 
2016-06-12T21:20:41.637-0400: 15519.764: [GC (Allocation Failure) [PSYoungGen: 1333171K->6080K(1349120K)] 1363036K->36112K(4145664K), 0.0122650 secs] [Times: user=0.01 sys=0.01, real=0.01 secs] 
2016-06-12T21:56:05.197-0400: 17643.325: [GC (Allocation Failure) [PSYoungGen: 1313728K->5728K(1313792K)] 1343760K->36072K(4110336K), 0.0107582 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
2016-06-12T22:32:47.264-0400: 19845.391: [GC (Allocation Failure) [PSYoungGen: 1313376K->5728K(1347584K)] 1343720K->36512K(4144128K), 0.0113968 secs] [Times: user=0.03 sys=0.00, real=0.00 secs] 

アプリケーションは約15のスレッドを持っていると私はアノンメモリを大量に気づきました。 JVMは、Sles 11 sp3マシンのjdk-1.8.0_40です。

私の質問は以下のとおりです。

  1. これは、アプリケーションがオフヒープ大幅に成長している問題であるように思われます。それは私が何かを欠いていると思いますか?

  2. メモリ消費の原因を特定する方法はありますか? Eclipseを使用している場合は

+0

あなたが提示した数字のどれも、無限の成長を示すものではありません。おそらく、ヒープ使用された図形を見るべきではなく、ヒープに割り当てられた図形を見るべきです。 – the8472

+0

はい、http://stackoverflow.com/a/35610063/166062を参照してください。 –

答えて

-1

あなたはメモリ消費量がどこから来ているかを決定するためにMAT(メモリアナライザツール)http://www.eclipse.org/mat/を試すことができます。

+0

私が知る限り、Eclipse MATはヒープ使用量のメモリ消費しか表示しません。 jvisualvmを使ってヒープダ​​ンプをプロファイリングしました。ヒープの成長とgcパターンは正常です。このメモリの使用量はどこか他の場所から来ているので、どこを特定する必要があります。 – ironbatman

関連する問題