2016-09-13 1 views
0

Мне удалось позвонить ObjectHeap.iterateObjectsOfKlass (с помощью SA), чтобы получить все объекты, принадлежащие определенному классу. Результат - именно то, что я ожидал, но производительность - нет.HotSpot Serviceability Agent iterateObjectsOfKlass() слишком медленный

Мне потребовалось> 800 секунд, чтобы получить мой результат, в течение которого целевая виртуальная машина приостановлена. Целевая куча VM составляет около 2 ГБ. Я знаю, iterateObjectsOfKlass позвонит iterateExact.

Мой вопрос: выполняют ли эти методы итерацию/перемещение всей кучи только для получения объектов для 1 класса? Я разочарован, так как я ожидаю, что с одним классом результат должен вернуться в течение 10 секунд.

+1

Хороший вопрос. Однако это было не совсем ясно в форме происхождения (особенно для людей, не знакомых с агентом Serviceability Agent). – apangin

+0

Конечно, он должен отсканировать всю кучу, чтобы найти все объекты любого типа. Тип фильтра не влияет на этот факт. Как вы ожидали, что это сработает? – Holger

+0

Я не ожидал сканирования всей кучи. Я думал, что, поскольку класс был указан, iterateObjectsOfKlass будет хирургическим в своем поиске объекта. - Маттиас. Спасибо @Holger –

ответ

4

HotSpot Serviceability Agent - действительно мощная технология, но очень медленная. Я объяснил, как это работает в this answer.

JVM не имеет средств для быстрого поиска всех экземпляров конкретного класса. Итак, да, он должен сканировать всю кучу. Более того, для того, чтобы читать память о внешнем процессе, SA использует системный вызов ptrace для каждого слова. Вот почему это так медленно.

У вас есть несколько вариантов для сканирования кучи быстрее:

  1. Создать CoreDump иностранного процесса, а затем запустить SA инструмент против CoreDump. Это намного быстрее, чем читать память о приостановленном процессе. См. related question.
  2. Внесите агент JVMTI в рабочий процесс, используя Dynamic Attach mechanism. Агент может сканировать кучу локальной JVM с помощью функции IterateOverInstancesOfClass. Это будет значительно быстрее по сравнению с SA, потому что это будет просто чтение из одного и того же процесса без каких-либо системных вызовов или чего-то еще. Я считаю, что для кучи 2 ГБ потребуется всего несколько секунд.
+1

Спасибо за ваш хороший ответ! @apangin –

Смежные вопросы