Сборник технических вопросов и ответов (13) Принцип Java Instrument

Java задняя часть JVM Командная строка

1 Что могут инструменты Java? Самый большой эффект?

  1. Это позволяет разработчикам создавать независимый от приложений агент для мониторинга и помощи программам, работающим на JVM, и, что более важно, для замены и изменения определений определенных классов;

  2. Самая большая роль: он может реализовать реализацию АОП, поддерживаемую на уровне виртуальной машины;

2 Какие изменения поддерживает Java Instrument в JDK 1.5 и 1.6?

  1. JDK 1.5: поддержка статического инструмента, то есть для статической установки инструмента перед запуском JVM;

  2. JDK 1.6: поддержка динамического инструмента, то есть динамическая установка инструмента после запуска JVM, поддержка собственного кода инструмента, поддержка динамически изменяющегося пути к классам;

3 На каком механизме JVM основана реализация Java Instrument? Что такое JVMTI и что он может делать?

  1. На основе агента JVMTI;
  2. JVMTI: набор агентных механизмов, набор локальных программных интерфейсов, предоставляемых для инструментов, связанных с JVM;
  3. JVMTI может поддерживать сторонние инструментальные программы для подключения и доступа к JVM через прокси, а также использовать богатый программный интерфейс, предоставляемый JVMTI, для выполнения многих функций, связанных с JVM;

4 Когда время выполнения методов premain и agentmain в Instrument?

  1. Время предварительного выполнения: при запуске JVM функция инициализации eventHandlerVMinit вызовет метод loadClassAndCallPremain класса sun.instrument.instrumentationImpl для выполнения предварительного метода класса, указанного Premain-Class;
  2. Время выполнения Agentmain: после запуска JVM подключите инструмент через VirtualMachine, например: vm.loadAgent(jar), он вызовет метод loadClassAndCallAgentmain класса sun.instrument.instrumentationImpl для выполнения метода agentmain класса, указанного в Agentmain-класс;

5 Что представляют два параметра agentArgs и inst в методах premain и agentmain инструмента? Каков будет эффект каждого?

  1. agentArgs: входной параметр в командной строке программы-агента, который передается вместе с "-javaagent". В отличие от основной функции, этот параметр представляет собой строку, а не массив строк;
  2. inst: экземпляр java.lang.instrument.Instrumentation, который автоматически передается JVM и интегрирует почти все функциональные методы, такие как: операции с классами, операции с путями к классам и т. д.;

6 Что такое java.lang.instrument.ClassFileTransformer и что он делает?

  1. Метод преобразования в ClassFileTransformer может работать и изменять определение класса;
  2. Прежде чем байт-код класса будет загружен в JVM, JVM вызовет метод ClassFileTransformer.transform для изменения определения класса и реализации функции АОП.По сравнению с технологиями реализации АОП, такими как динамический прокси-сервер JDK и CGLIB, новые классы генерироваться не будут. , и новые классы генерироваться не будут.Исходный класс не должен иметь интерфейс;

7 Как динамически подключить агент для выполнения метода agentmain?

Подключите инструмент через VirtualMachine, например: vm.loadAgent(jar);

8 Список параметров META-INF/MAINFEST.MF?

  1. Premain-Class: укажите имя класса, содержащего метод premain;
  2. Agent-Class: укажите имя класса, содержащего метод agentmain;
  3. Boot-Class-Path: указывает список путей, которые ищет загрузчик классов загрузки. После того, как специфичный для платформы механизм поиска классов дает сбой, загрузчик классов начальной загрузки ищет эти пути;
  4. Can-Redefine-Class: можно ли переопределить класс, требуемый этим прокси, по умолчанию — false;
  5. Can-Retransform-Class: может ли класс, требуемый этим прокси, быть повторно преобразован, значение по умолчанию — false;
  6. Can-Set-Native-Method-Prefix: может ли быть установлен собственный префикс метода, требуемый этим прокси, значение по умолчанию — false;

9 Два основных API ClassFileTransformer, Instrumentation?

  1. ClassFileTransformer: определяет класс предварительной обработки перед загрузкой класса;
  2. Инструментарий: Энхансер

(1) добавить/удалитьTransformer: добавить/удалить ClasFileTransformer;

(2) retransformerClasses: укажите, какие классы в случае загрузки повторно преобразовываются, то есть запускают перезагрузку определения класса; для перезагруженных классов старое объявление класса не может быть изменено, например: атрибуты не могут быть добавлены, и методы не могут быть изменены, объявление и т.д.;

(3) redefineClasses: укажите, какие классы запускать перезагрузку определений классов.Отличие от вышеизложенного состоит в том, что обработка преобразования не будет выполняться снова, а байт-код результата обработки будет напрямую передан JVM;

(4) getAllLoadedClasses: получить текущую загруженную коллекцию классов;

(5) getInitiatedClasses: получить определения классов, загруженные определенным загрузчиком классов;

(6) getObjectSize: получить размер пространства, занимаемого объектом;

(7) appendToBootstrapClassLoaderSearch/appentToSystemClassLoaderSearch: увеличьте путь поиска BootstrapClassLoader/SystemClassLoader;

(8) isNativeMethodPrefixSupported/SetNativeMethodPrefix: определите, поддерживает ли JVM перехват собственного метода;

10 Как работает инструмент Java?

  1. Когда JVM запускается, передайте параметр JVM -javaagent, перейдите в jar-файл агента, и загрузится инструментальный агент;
  2. При инициализации агента инструмента регистрируется функция инициализации JVMTI eventHandlerVMinit;
  3. При запуске JVM вызывается функция инициализации eventHandlerVMinit, запускается агент Instrument, а метод loadClassAndCallPremain в классе sun.instrument.instrumentationImpl используется для инициализации метода premain класса, указанного Premain-Class;
  4. Функция инициализации eventHandlerVMinit регистрирует функцию ClassFileLoadHook для анализа класса;
  5. Перед синтаксическим анализом класса JVM вызывает функцию ClassFileLoadHook JVMTI, функция ловушки вызывает метод преобразования в классе sun.instrument.instrumentationImpl и, наконец, вызывает метод преобразования нашего пользовательского класса Transformer через метод преобразования TransformerManager;
  6. Поскольку байт-код изменяется перед синтаксическим анализом класса, поток данных измененного байт-кода используется вместо этого напрямую и, наконец, входит в синтаксический анализ класса, который не влияет на синтаксический анализ всего класса;
  7. Перезагрузите класс и снова выполните шаги 5-6;