Saltar al contenido

análisis de montón de java con oql: contar cadenas únicas

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *