El siguiente se basa en la respuesta de Peter Dolberg y se puede utilizar en el VisualVM NCO Consola:
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;
}
}
);
Se inicia mediante una llamada map()
sobre todas las instancias de String y para cada cadena de crear o actualizar una objeto en la matriz counts
. Cada objeto tiene un campo string
y count
.
La matriz resultante contendrá una entrada para cada instancia de Cadena, cada una con un valor count
mayor que la entrada anterior para la misma Cadena. El resultado se ordena a continuación, en el campo count
y el resultado se ve algo como esto:
{
count = 1028.0,
string = *null*
}
{
count = 1027.0,
string = *null*
}
{
count = 1026.0,
string = *null*
}
...
(en mi prueba de la Cadena "*null*"
fue el más común).
El último paso es filtrar esto utilizando una función que devuelve verdadero para la primera aparición de cada cadena. Utiliza la matriz alreadyReturned
para realizar un seguimiento de las cadenas que ya se han incluido.
Gracias que resuelve muy bien el problema. El oql es de alguna manera incómodo de usar. Todo tiene que suceder en una función ... – paweloque
wow, no sabía que jvisualvm es tan poderoso. Encontré valores de recuento altos para algunas cadenas. ¿Su código excluye la basura (cadenas no referenciadas)? – Jan
Utiliza "heap.objects" para buscar todos los objetos java.lang.String en el montón. No hay filtrado para excluir cadenas no referenciadas. Pero dependiendo de cómo se generó el volcado del montón, la JVM puede haber realizado un GC completo antes, en cuyo caso cualquier cadena no referenciada ya debería haber sido eliminada y no incluida en el volcado del heap. –