Отслеживание распределения кучи с учетом потоков с помощью JVMTI - PullRequest
3 голосов
/ 16 июня 2011

Написание профилирования Я бы также реализовал типичную задачу профилирования кучи.В частности, я хотел бы отслеживать, какой поток выделил, сколько данных?Используя JVMTI, я подумал, что достаточно подключиться к событиям Распределение объектов VM и Object Free .К сожалению, я прочитал, что первое событие не вызвано из-за вызовов, сделанных на new.

Последняя идея, которую я имел, состояла в том, чтобы проверить событие MethodExit , если его имя <init> и, таким образом,объявить этот вызов как распределение объектов.Однако в этом событии я не могу получить объект и, следовательно, не могу вызвать GetObjectSize.

. Простая итерация по куче не несет никакой информации относительно того, какой объект был выделен какому потоку.У кого-нибудь есть идеи, как это реализовать?

Ответы [ 3 ]

2 голосов
/ 09 сентября 2011

Есть ли причина, по которой вы не можете вызвать GetObjectSize из события MethodEntry для конструктора?

Если вы заинтересованы в выполнении кода перед возвратом метода, вы можете прослушатьMethodEntry событие, и если метод называется <init>, вы можете вызвать NotifyFramePop, чтобы прослушать событие FramePop для текущего кадра.Это событие похоже на событие MethodExit, но происходит до возврата метода, поэтому вы все равно можете получить объект this.

2 голосов
/ 02 декабря 2014

Эта демонстрация heapTracker иллюстрирует, как отслеживать все объекты в куче.Поскольку VMObjectAlloc Event отправляется только тогда, когда происходит отражение, демонстрационная программа использует ByteCodeInstrument для отслеживания выделения нового объекта.


Вы можете использовать функцию getCurrentThread, чтобы узнать, к какому потоку принадлежит объект.
2 голосов
/ 16 июня 2011

Быстрый взгляд на реализацию _new виртуальной машины Hotspot (templateTable_x86_64.cpp), по-видимому, указывает на то, что _new не предлагает никаких хуков для JVMTI (даже в медленном случае, кажется).Так что, если ваш трюк не сработает, я не вижу другой возможности - но я ни в коем случае не эксперт JVMTI.

Полагаю, компиляция вашей собственной виртуальной машины Hotspot с небольшим патчемособенно полезно для тебя?

...