2013-03-26 5 views
1

Я использую VisualVm для профилирования веб-приложения, запущенного в Tomcat. Tomcat продолжает сбой с ошибками памяти, поэтому я пытаюсь выяснить, что в моем приложении вызывает его. Когда я запускаю профилировщик памяти из VisualVm, похоже, что большая часть памяти занята String/Char [], но я, если не смогу вычислить контейнеры более высокого уровня этих строк, знание меня очень мало. При проведении исследований я нашел OQL и rsizeof(), поэтому могу, например, SELECT rsizeof(o) FROM instanceof my.package.class o, но я не знаю, какой класс мне нужен, поэтому мне бы очень хотелось, чтобы у меня было что-то вроде SELECT it.name, rsizeof(o) FROM instanceof Filter(Heap.classes(), "/my.package./(it.name)");, но это не работает.в VisualVM/OQL Как получить общий размер всех экземпляров объектов из определенного пакета

Так что же будет с OQL? В идеале я бы хотел ограничить Топ-10 или около того самым большим и отсортировать по размеру.

ответ

1

Я не уверен, что я полностью понял, но ...

OQL использует язык выражений на основе JavaScript, так что вы можете использовать следующее заявление, он найдет все объекты, находящиеся внутри java.util.regex пакета (рекурсивно) и просуммировать размеры их, он будет возвращать один номер:

sum(filter(heap.objects(), "/^java.util.regex./(classof(it).name)"), 'rsizeof(it)') 

Это займет то же время, я испытал лишь только на небольших куч. Обратите внимание на ^ в начале имени пакета.