Il più delle volte, nelle applicazioni aziendali l'heap Java fornito è più grande della dimensione ideale di max 12-16 GB. Ho trovato difficile far funzionare il profiler NetBeans direttamente su queste grandi app java.
Ma di solito questo non è necessario. È possibile utilizzare l'utilità jmap fornita con jdk per eseguire un dump dell'heap "live", ovvero jmap eseguirà il dump dell'heap dopo l'esecuzione di GC. Eseguire alcune operazioni sull'applicazione, attendere fino al completamento dell'operazione, quindi eseguire un altro dump dell'heap "live". Usa strumenti come Eclipse MAT per caricare gli heapdump, ordinare l'istogramma, vedere quali oggetti sono aumentati o quali sono i più alti. Questo darebbe un indizio.
su proceeuser
/bin/jmap -dump:live,format=b,file=/tmp/2930javaheap.hrpof 2930(pid of process)
C'è solo un problema con questo approccio; Enormi dump di heap, anche con l'opzione live, potrebbero essere troppo grandi per essere trasferiti al giro di sviluppo e potrebbero aver bisogno di una macchina con memoria / RAM sufficiente per aprire.
È qui che entra in scena l'istogramma della classe. È possibile scaricare un istogramma di classe live con lo strumento jmap. Ciò fornirà solo l'istogramma di classe dell'utilizzo della memoria, in pratica non avrà le informazioni per concatenare il riferimento. Ad esempio, potrebbe mettere l'array char nella parte superiore. E la classe String da qualche parte in basso. Devi disegnare tu stesso la connessione.
jdk/jdk1.6.0_38/bin/jmap -histo:live 60030 > /tmp/60030istolive1330.txt
Invece di prendere due dump dell'heap, prendi due istogrammi di classe, come descritto sopra; Quindi confrontare gli istogrammi di classe e vedere le classi che stanno aumentando. Vedi se riesci a mettere in relazione le classi Java con le tue classi applicative. Questo darà un suggerimento abbastanza buono. Ecco uno script Pythons che può aiutarti a confrontare due dump dell'istogramma jmap. histogramparser.py
Infine, strumenti come JConolse e VisualVm sono essenziali per vedere la crescita della memoria nel tempo e vedere se c'è una perdita di memoria. Infine, a volte il problema potrebbe non essere una perdita di memoria, ma un elevato utilizzo della memoria. Per questo abilitare la registrazione GC; utilizzare un GC di compattazione più avanzato e nuovo come G1GC; e puoi usare strumenti jdk come jstat per vedere dal vivo il comportamento di GC
jstat -gccause pid <optional time interval>
Altri riferimenti a google per -jhat, jmap, GC completo, allocazione Humongous, G1GC