Инструменты для запроса коллекций в дамп кучи - PullRequest
8 голосов
/ 19 февраля 2010

Можно ли запросить коллекцию, которая помещается в дамп кучи?Очевидно, что я могу просматривать эту коллекцию, используя что-то вроде Eclipse MAT, но очень хотел бы иметь возможность вызывать метод получения объекта коллекции.Это, очевидно, было бы намного понятнее, чем проходить сегменты в ConcurrentHashMap, пытаясь найти нужное отображение.

Полагаю, что я ищу, так это какой-то способ «повторно гидратировать» состояние сбросаименованную коллекцию, чтобы затем ее можно было обрабатывать с помощью стандартных API.

Кто-нибудь знает о каких-либо таких утилитах, или, если нет, может кто-нибудь предоставить пример кода или указатели о том, как этого добиться?

1 Ответ

6 голосов
/ 19 февраля 2010

Вы должны иметь возможность запрашивать все коллекции или одну с помощью языка объектных запросов (OQL) в jhat .

Вы не можете обязательно вызывать произвольные методы, но вы можете написать несколько сложных запросов, используя доступные функции.

A. У Sundararajan есть несколько интересных постов в блоге на эту тему, которые демонстрируют, что вы можете сделать. См. здесь и здесь .

Например, вы можете найти все экземпляры java.util.HashMap, имеющие ключ test со следующим запросом:

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;
})

Это должно найти тот же ключ в 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;
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...