В настоящее время я смотрю на дамп кучи этого глупого маленького тестового класса (взятого в самом конце метода main
):
public class WeakRefTest {
static final class RefObj1 { int i; }
static final class RefObj2 { int j; }
public static void main(String[] args) {
Set<WeakReference<?>> objects = new HashSet<>();
RefObj1 obj1 = new RefObj1();
RefObj2 obj2 = new RefObj2();
for (int i = 0; i < 1000; i++) {
objects.add(new WeakReference<RefObj1>(obj1));
objects.add(new WeakReference<RefObj2>(obj2));
}
}
}
Теперь я пытаюсь понять, как подсчитать количество ссылок на определенный класс в objects
. Если бы это была база данных SQL, это было бы легко:
select objects.className as referent, count(*) as cnt
from java.lang.ref.WeakReference ref
inner join heapObjects objects on ref.referent = objects.objectId
group by objects.className;
Результат:
referent | cnt
===================
WeakRefTest$RefObj1 | 1000
WeakRefTest$RefObj2 | 1000
После некоторых исследований я решил, что могу создать Eclipse MAT OQL, который дает мне задействованные классы:
select DISTINCT OBJECTS classof(ref.referent) from java.lang.ref.WeakReference ref
Увы, это не включает их количество, и OQL, похоже, не поддерживает предложение GROUP BY
. Любые идеи, как получить эту информацию?
Отредактировано для добавления: На самом деле ни один из объектов, добавленных в Set
(и, очевидно, сама реализация Set
), не находится под моим контролем. Извините, изменение RefObj1
и RefObj2
запрещено.
Edit2: я нашел этот связанный вопрос об использовании OQL в jvisualvm но оказывается, что OQL на самом деле является Javascript, высвобожденным на дампе кучи. Меня бы тоже что-то подобное устроило. Но игра с ним пока не дала результатов для меня. Я обновлю вопрос, если это изменится.