JVM: добавить хук в доступ к куче
Я надеюсь провести профилирующий анализ моего Java-проекта. Чтобы получить результаты, я хочу добавить "ловушку" в JVM, чтобы каждый раз, когда происходит доступ к куче, вызывался "ловушка" и выполнялась некоторая трассировка. Я изучал JVMTI, но это не дает мне того, чего я ожидаю.
У меня есть несколько вопросов:
- Можно ли добавить такой крючок?
- Если возможно, какие правильные инструменты / интерфейсы мне следует использовать?
- Если нет существующих инструментов, которые делают это, могу ли я добиться этого, изменив кодовую базу JVM?
Благодарю.
1 ответ
Я хочу добавить "крючок" в JVM, чтобы каждый раз, когда происходит доступ к куче
Вы не можете сделать это в Java, так как сам ловушка будет обращаться к куче и вызывать себя. Даже если вы обойдете это, это сделает программу невероятно медленной.
То, что вы можете сделать, это использовать интерфейс отладки для точки останова после каждой инструкции, осмотреть инструкцию и посмотреть, получил ли он доступ к куче или нет. Это будет возможно в 10000 раз медленнее, чем обычно.
Альтернативой является перевод байт-кода с помощью Instrumentation
отслеживать каждый доступ к памяти. Это может быть только в несколько сотен раз медленнее.
Чтобы сделать то, что вы предлагаете эффективно, вы можете использовать https://software.intel.com/en-us/articles/intel-performance-counter-monitor который используется такими инструментами, как perf
в линуксе Это требует глубокого знания процессора, который вы используете