Di seguito è basata sulla risposta da Peter Dolberg e può essere utilizzato nella VisualVM OQL Console:
var counts={};
var alreadyReturned={};
filter(
sort(
map(heap.objects("java.lang.String"),
function(heapString){
if(! counts[heapString.toString()]){
counts[heapString.toString()] = 1;
} else {
counts[heapString.toString()] = counts[heapString.toString()] + 1;
}
return { string:heapString.toString(), count:counts[heapString.toString()]};
}),
'lhs.count < rhs.count'),
function(countObject) {
if(! alreadyReturned[countObject.string]){
alreadyReturned[countObject.string] = true;
return true;
} else {
return false;
}
}
);
Si inizia utilizzando una chiamata map()
su tutte le istanze String e per ogni stringa creazione o l'aggiornamento di un oggetto nell'array counts
. Ogni oggetto ha un campo string
e un count
.
L'array risultante conterrà una voce per ogni istanza String, ciascuna con un valore count
più grande della voce precedente per la stessa stringa. Il risultato viene quindi ordinato sul campo count
e il risultato simile a questa:
{
count = 1028.0,
string = *null*
}
{
count = 1027.0,
string = *null*
}
{
count = 1026.0,
string = *null*
}
...
(nel mio test della stringa "*null*"
è stato il più comune).
L'ultimo passaggio consiste nel filtrare ciò utilizzando una funzione che restituisce true per la prima occorrenza di ciascuna stringa. Usa l'array alreadyReturned
per tenere traccia di quali stringhe sono già state incluse.
fonte
2012-02-27 18:00:40
Grazie che risolve bene il problema. L'oql è in qualche modo scomodo da usare. Tutto deve succedere in una funzione ... – paweloque
wow, non sapevo che jvisualvm è così potente. Ho trovato valori di conteggio elevato per alcune stringhe: il tuo codice esclude la garbage (non le stringhe di riferimento)? – Jan
Usa "heap.objects" per trovare tutti gli oggetti java.lang.String nell'heap. Non esiste alcun filtro per escludere le stringhe senza riferimento. Ma a seconda di come è stato generato il dump dell'heap, la JVM potrebbe aver già eseguito un GC completo, nel qual caso qualsiasi stringa senza riferimento avrebbe dovuto essere già stata rimossa e non inclusa nel dump dell'heap. –