Revisamos completamente cada una de las noticias de nuestra web con la meta de enseñarte siempre la información más veraz y actualizada.
Solución:
Lo siguiente se basa en la respuesta de Peter Dolberg y se puede usar en la consola VisualVM OQL:
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;
);
Comienza usando un map()
llame a todas las instancias de String y para cada String creando o actualizando un objeto en el counts
array. Cada objeto tiene un string
y un count
campo.
La resultante array contendrá una entrada para cada instancia de String, cada una con un count
valor uno más grande que la entrada anterior para la misma cadena. A continuación, el resultado se ordena en el count
campo y el resultado se parece a esto:
count = 1028.0,
string = *null*
count = 1027.0,
string = *null*
count = 1026.0,
string = *null*
...
(en mi prueba la cadena "*null*"
era el más común).
El último paso es filtrar esto usando una función que devuelve true para la primera ocurrencia de cada String. utiliza el alreadyReturned
array para realizar un seguimiento de las cadenas que ya se han incluido.
En su lugar, usaría Eclipse Memory Analyzer.
Lamentablemente, no hay un equivalente a "agrupar por" en OQL. Supongo que está hablando del OQL que se usa en jhat y VisualVM.
Sin embargo, hay una alternativa. Si utiliza la sintaxis de JavaScript puro en lugar de la sintaxis "seleccionar x de y", entonces tiene todo el poder de JavaScript para trabajar.
Aun así, la forma alternativa de obtener la información que buscas no es sencilla. Por ejemplo, aquí hay una "consulta" OQL que realizará la misma tarea que su consulta:
var set=;
sum(map(heap.objects("java.lang.String"),function(heapString)
if(set[heapString.toString()])
return 0;
else
set[heapString.toString()]=true;
return 1;
));
En este ejemplo, un objeto JavaScript normal imita un conjunto (colección sin duplicados). A medida que la función de mapa pasa por cada stringel conjunto se utiliza para determinar si el string ya se ha visto. Los duplicados no cuentan para el total (devuelven 0), pero las cadenas nuevas sí (devuelven 1).
Valoraciones y comentarios
Finalizando este artículo puedes encontrar las referencias de otros administradores, tú igualmente puedes insertar el tuyo si lo deseas.