Eine Anwendung, an der ich gearbeitet habe, hat große Mengen an Daten angezeigt, die anscheinend nicht im Speicher abgelegt sind.Ist es möglich, die Quelle eines Off-Heap-Speicherlecks zu erkennen?
Ich habe die Anwendung für die Verwendung eines Xms und Xmx von 4096m konfiguriert. Wenn Sie jedoch oben auf der PID ausführen, zeigt dies, dass der Prozess 9,6% des Arbeitsspeichers der Maschine verbraucht (64-Gb-Maschine -> 6,14 g Anwendungs-Footprint). Dies scheint weiter zu wachsen, je länger die Instanz lebt. Die Bewohnergröße beträgt ca. 5,9 g. Überprüfen des Prozesses mit jvisualvm Ich sehe eine Heap-Nutzung von ca. 1,5 GB mit gesunden GC-Mustern. Ich habe Heap Dumps und Thread Dumps gemacht und sehe nichts abnormales.
Ich zog eine PMAP für den Prozess. Die Heap-Größe erscheint konsistent mit den Xms- und Xmx-Parametern der Anwendung. Der Stack beträgt ungefähr 130 KB. und ich bemerkte, große Mengen von Anon Speicher:
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]
Einige Beispiele gc Verhalten:
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]
Die Anwendung verfügt über etwa 15 Threads. Die JVM ist jdk-1.8.0_40 auf einer Sles 11 sp3-Maschine.
Meine Fragen sind:
Dies scheint ein Problem zu sein, wo die Anwendung deutlich ab Haufen wächst. Ist das sicher anzunehmen, oder fehlt mir etwas?
Gibt es eine Möglichkeit festzustellen, woher der Speicherverbrauch stammt?
Keine der von Ihnen angegebenen Zahlen weist auf unbegrenztes Wachstum hin. Sie sollten wahrscheinlich nicht auf Heap-verwendete Zahlen, sondern auf Heap-allokierte Zahlen schauen. – the8472
Ja, siehe http://stackoverflow.com/a/35610063/166062 –