2010-02-19 2 views
6

Est-il possible d'interroger une collection qui est vidée dans une pile de mémoire? Je peux évidemment parcourir cette collection en utilisant quelque chose comme Eclipse MAT, mais j'aimerais vraiment pouvoir appeler un getter sur l'objet de collection. Cela serait évidemment beaucoup plus clair que de passer par des segments dans un ConcurrentHashMap en essayant de trouver la cartographie dont j'ai besoin.Outils permettant d'interroger des collections dans une mémoire cache

Je suppose que ce que je cherche est un moyen de «réhydrater» l'état sauvegardé d'une collection nommée afin qu'elle puisse ensuite être manipulée en utilisant les API standard.

Est-ce que quelqu'un connaît un de ces utilitaires ou, dans le cas contraire, quelqu'un peut-il fournir un exemple de code ou des pointeurs sur la façon d'y parvenir?

Répondre

6

Vous devriez être en mesure d'interroger toutes les collections ou seule avec Object Query Language (OQL) dans jhat.

Vous ne pouvez pas nécessairement invoquer des méthodes arbitraires, mais vous pouvez écrire des requêtes compliquées en utilisant les fonctions disponibles. A. Sundararajan a quelques articles de blog intéressants sur le sujet qui mettent en valeur ce que vous pouvez faire. Voir here et here.

Par exemple, vous pouvez trouver toutes les instances de java.util.HashMap qui ont un essai clé avec la requête suivante:

select s from java.util.HashMap s where contains(s.table, function(it) { 
    if (it && it.key && it.key.value && it.key.value.toString() == 'test') { 
     return true; 
    } 
    return false; 
}) 

Cela devrait trouver la même clé dans un java.util.concurrent.ConcurrentHashMap:

select s from java.util.concurrent.ConcurrentHashMap s where contains(s.segments, function(it) { 
    if (!it || !it.table) { 
     return false; 
    } 
    var i, e; 
    for (i=0; i < it.table.length; i = i + 1) { 
     e = it.table[i]; 
     if (e) { 
      return e.key && e.key.value && e.key.value.toString() == 'test'; 
     } 
    } 
    return false; 
}) 
+0

Merci - Je n'avais pas vraiment réalisé qu'OQL était si puissant. Peut-être quand j'aurai le temps j'écrirai un outil pour permettre l'interrogation «appropriée» des collections, mais ces requêtes d'OQL feront ce que je veux pour maintenant! – Rich

Questions connexes