2009-09-25 16 views
23

Ich versuche herauszufinden, wo mein Speicher für einen Java-Prozess in Linux ausgeführt wurde. Jemand schlug vor, pmaap -x zu verwenden, um genau zu sehen, was der Speicher macht.Versuchen, ein Leck zu finden! Was bedeutet Anonym für Pmap?

Der Ausgang ist wirklich lang, aber im Grunde ein guter Teil davon ist eine Wiederholung dieses:

00007fbf75f6a000 1016  -  -  - rwx-- [ anon ] 
00007fbf76068000  12  -  -  - ----- [ anon ] 

Was genau bedeutet das? Warum habe ich so viele Einträge davon (4000+)?

Antwort

28

Anonblöcke sind "große" Blöcke, die über malloc oder mmap zugewiesen werden - siehe die Hilfeseiten. Als solche haben sie nichts mit dem Java-Heap zu tun (abgesehen von der Tatsache, dass der gesamte Heap in einem solchen Block gespeichert werden sollte).

Meiner Erfahrung nach verwenden Thread-Stacks auch Anon-Blöcke. Wenn Sie eine Menge von Anon-Blöcken sehen, die alle die gleiche Größe haben, und diese Größe 512k bis 4Mb ist (das unten stehende Beispiel wird für ein Tomcat-Verfahren, das ich ausgeführt habe, über ein Dutzend Mal wiederholt), ist das wahrscheinlich die Ursache. Je nach Programm können Sie bis zu ein paar Dutzend haben; Wenn Sie Tausende sehen, bedeutet das, dass Sie ein Problem mit dem Threading haben.

b089f000 504K rwx-- [ anon ] 
b091d000  12K ----- [ anon ] 
b0920000 504K rwx-- [ anon ] 
b099e000  12K ----- [ anon ] 
b09a1000 504K rwx-- [ anon ] 
b0a1f000  12K ----- [ anon ] 

Aber das läßt eine Frage: Warum verwenden Sie pmap ein Java-Speicherproblem zu diagnostizieren?

+0

> Warum verwenden Sie pmap, um ein Java-Speicherproblem zu diagnostizieren? Wir haben einen Java-Prozess mit Heap auf maximal 256 MB, aber es ist RSS-Speicher ist 8.9GB. Mit welchem ​​anderen Werkzeug können wir das diagnostizieren? – Opher

+1

@Opher - sicher, macht Sinn für Sie. Aber bist du der OP? (Und wenn ja, warum kommst du 8 Jahre später dazu?). Von der ursprünglichen Frage war nicht klar, ob das OP wusste, wonach es suchte. – kdgregory

+1

Und als Vorschlag: Wenn Sie eine solche Diskrepanz zwischen konfigurierter Heap-Größe und RSS sehen, suchen Sie nach Memory-Mapped-Dateien oder direkten Puffern. Ein solches Verhalten wird beispielsweise von einem Kafka- oder SOLR-Server angezeigt, und das ist normal. – kdgregory

3

Siehe this partthis part von System Performance Tuning für anonymen Speicher.

+0

Das sagt Ihnen, wie anonyme Zuordnungen verwaltet werden, nicht was es ist. Obwohl die Verbindung insgesamt ziemlich gut ist. – kdgregory

2

Verwenden Sie Eclipse MAT (wenn Sie OutOfMemoryExceptions im Java-Heap nicht den nativen Heap erhalten).

0

Ich habe dieses Muster zuvor in einem Thread-Leck gesehen. Wenn Sie Code haben, der versucht, Threads zu sammeln, aber irgendwie versagt und einen Thread leckt, erhalten Sie ein Muster wie das in pmap.

Ich denke, jedes Bit Speicher ist die minimale Stack-Größe für den Thread, sicherlich hatte es in unserem Fall nichts mit Haufen zu tun.
Wir haben immer noch OutOfMemoryErrors, wenn wir OS-Grenzen erreichen, sogar wenn wir den Heap analysieren, ist es nicht überlastet.

Wenn wir ein Problem wie dieses pmap [pid] | grep -c 12K hatten, stellte sich heraus, dass die Anzahl der verwendeten Threads ist.