Инструментация кода байта - реализовать нативного или Java Agent?
-
27-10-2019 - |
Вопрос
Если я хочу понять профилировщик, использующий байтовый код инструмент, должен ли я написать родной агент с использованием Jvmti или я должен написать Java Agent с использованием java.lang.instrument
упаковка?
Если я хочу использовать библиотеки, как КАК М - Что кажется обязательным, если вы хотите создать серьезный профилировщик - я должен использовать агента Java. Что меня смущает, так как я думал, что родной агент может сделать все, что может сделать агент Java и многое другое. Но для меня кажется легче написать агент Java.
Есть альтернативы? Следует ли использовать агент Java и нативного агента в любом случае объединенным?
Решение
Почти каждый пишет агент Java (с ASM или BCEL), так как они не хотят писать инструмент C/C ++ Bytecode с нуля, поскольку нет публичных.
То, что вы не сможете сделать, это инструмент и профиль/мониторинг изначального JVM, а доступ к нативным функциям требует вызовов JNI. Есть также несколько вызовов JVMTI, которые могут быть недоступны для вас (если память служит).
Я написал свой собственный инструмент в C несколько лет назад, и я в процессе написания нового, который я надеюсь открыть исходный код (в зависимости от моих злых повелителей :-))
Как насчет поллети-дома, отдельного предварительного JVM, на который отправляет ваш родной агент Bytecode. В этом JVM ваш простой писатель, чтобы написать ASM на основе ASM, выполняет тяжелую работу и отправляет полученный байт-код обратно на собственного агента через проволоку. Да, это кажется немного переполненным, но легче писать свою собственную библиотеку BCI.