Spec-Zone .ru
спецификации, руководства, описания, API

Интерфейс Инструмента JVMTM

Версия 1.2


Каков Интерфейс Инструмента JVM?

Интерфейс Инструмента JVMTM ( виртуальная машина ТМ JVM (VM).

JVM 

 Виртуальная машина ТМ JVM.

  Агент JVM, может быть уведомлен относительно интересных возникновений через события. Функции JVM, или в ответ на события или независимый от них.

Агенты, выполненные в том же самом процессе с и, связываются непосредственно с виртуальной машиной, выполняющей исследуемое приложение. Эта передача через собственный интерфейс (JVM 

Архитектура

Инструменты могут быть записаны непосредственно   веб-сайту Архитектуры Отладчика Платформы Java JVM.

Запись Агентов

Агенты могут быть записаны на любом родном языке, который поддерживает соглашения о вызовах языка C и определения C++ или C.

Функция, событие, тип данных, и постоянные определения необходимы для того, чтобы использовать JVM jvmti.h. Чтобы использовать эти определения добавляют, что J2SETM включают каталог в Ваш включать путь и добавить
#include <jvmti.h>
    
к Вашему исходному коду.

Развертывание Агентов

Агент развертывается в платформе определенный способ, но обычно является платформой, эквивалентной из динамической библиотеки. На операционной системе WindowsTM, например, библиотекой агента является "Динамически подключаемая библиотека" (DLL). На Операционной среде SolarisTM библиотека агента является совместно используемым объектом (.so файл).

Агент может быть запущен при запуске VM, определяя имя библиотеки агента, используя параметр командной строки. Некоторые реализации могут поддерживать механизм, чтобы запустить агенты в живой фазе. Детали того, как это инициируется, являются определенной реализацией.

Параметры командной строки агента

Термин "параметр командной строки" используется ниже, чтобы означать опции, предоставленные в JavaVMInitArgs параметр JNI_CreateJavaVM функция API Вызова JNI.

Один из двух после параметров командной строки используется на запуске VM, чтобы должным образом загрузить и выполнить агенты. Эти параметры идентифицируют библиотеку, содержащую агент так же как строку опций, которую передадут в при запуске.
-agentlib:<имя lib агента>=<опции>
Имя после -agentlib: имя библиотеки, чтобы загрузиться. Поиск библиотеки, и ее полное имя и расположение, продолжается специфичным для платформы способом. Как правило, <имя lib агента> расширяется до операционной системы определенное имя файла. <Опции> будет передан к агенту на запуске. Например, если опция -agentlib:foo=opt1,opt2 определяется, VM попытается загрузить совместно используемую библиотеку foo.dll от системы PATH под WindowsTM или libfoo.so от LD_LIBRARY_PATH под операционной средой SolarisTM.
-agentpath:<путь к агенту>=<опции>
Путь после -agentpath: абсолютный путь, из которого можно загрузить библиотеку. Никакое расширение имени библиотеки не произойдет. <Опции> будет передан к агенту на запуске. Например, если опция -agentpath:c:\myLibs\foo.dll=opt1,opt2 определяется, VM попытается загрузить совместно используемую библиотеку c:\myLibs\foo.dll.
Подпрограмма запуска Agent_OnLoad в библиотеке будет вызван.

Библиотеки загружались с -agentlib: или -agentpath: будет искаться JNI собственные реализации метода, чтобы облегчить использование кода языка программирования Java в инструментах, как необходим для инструментария байт-кода.

Библиотеки агента будут искаться после того, как все другие библиотеки искались (агенты, желающие переопределять или прерывать собственные реализации метода методов неагента, могут использовать событие NativeMethodBind).

Эти переключатели делают вышеупомянутое и ничто более - они не изменяют состояние   возможностей JVM или VM.

Запуск агента

VM запускает каждый агент, вызывая функцию запуска. Если агент запускается в OnLoad поэтапно осуществите функцию Agent_OnLoad будет вызван. Если агент запускается в живой фазе функция Agent_OnAttach будет вызван. Точно один звонок в функцию запуска делается на агент.

Запуск агента (фаза OnLoad)

Если агент запускается во время OnLoad фаза тогда ее библиотека агента должна экспортировать функцию запуска со следующим прототипом:
JNIEXPORT jint JNICALL 
Agent_OnLoad(JavaVM *vm, char *options, void *reserved)
VM запустит агент, вызывая эту функцию. Это вызовут достаточно рано в инициализации VM что:

VM вызовет Agent_OnLoad функция с <опциями> как второй параметр - то есть, используя примеры параметра командной строки, "opt1,opt2" будет передан к char *options параметр Agent_OnLoad. options параметр кодируется как измененная строка UTF-8. Если = <опции> не определяется, к нулевой строке длины передают options. Продолжительность жизни options строка Agent_OnLoad вызвать. Если нужно вне этого времени строка или части строки должны быть скопированы. Период, между когда Agent_OnLoad вызывается и когда это возвращается, вызывается фазой OnLoad. Так как VM не инициализируется во время фазы OnLoad, набора позволенных операций внутри Agent_OnLoad ограничивается (см. функциональные описания для функциональности, доступной в это время). Агент может безопасно обработать опции и установить обратные вызовы события с SetEventCallbacks. Как только событие инициализации VM получается (то есть, обратный вызов VMInit вызывается), агент может завершить свою инициализацию.

Объяснение: Ранний запуск требуется так, чтобы агенты могли установить требуемые возможности, многие из которых должны быть установлены прежде, чем VM инициализируется. В JVMDI,-Xdebug параметр командной строки, обеспеченный очень крупномодульное управление возможностей. Реализации JVMPI используют различные приемы, чтобы обеспечить единственный переключатель "JVMPI on". Никакой разумный параметр командной строки не мог обеспечить мелкий модуль управления, требуемого сбалансировать необходимые возможности по сравнению с воздействием производительности. Ранний запуск также необходим так, чтобы агенты могли управлять средой выполнения - изменение файловой системы и системных свойств, чтобы установить их функциональность.

Возвращаемое значение от Agent_OnLoad используется, чтобы указать на ошибку. Любое значение кроме нуля указывает на ошибку и вызывает завершение VM.

Запуск агента (Живая фаза)

VM может поддерживать механизм, который позволяет агентам быть запущенными в VM во время живой фазы. Детали того, как это поддерживается, являются определенной реализацией. Например, инструмент может использовать некоторую платформу определенный механизм, или реализация определенный API, чтобы присоединить к выполнению VM, и запросить, чтобы это запустило данный агент.

Если агент запускается во время живой фазы тогда, ее библиотека агента должна экспортировать функцию запуска со следующим прототипом:
JNIEXPORT jint JNICALL 
Agent_OnAttach(JavaVM* vm, char *options, void *reserved)

VM запустит агент, вызывая эту функцию. Это вызовут в контексте потока, который присоединен к VM. Первым параметром <vm> является Java VM. <Опции> параметр возможности запуска, предоставленные к агенту. <опции> кодируются как измененная строка UTF-8. Если возможности запуска не были предоставлены, к нулевой строке длины передают options. Продолжительность жизни options строка Agent_OnAttach вызвать. Если нужно вне этого времени строка или части строки должны быть скопированы.

Отметьте, что некоторые возможности, возможно, не доступны в живой фазе.

Agent_OnAttach функция инициализирует агент и возвращает значение VM, чтобы указать, произошла ли ошибка. Любое значение кроме нуля указывает на ошибку. Ошибка не заставляет VM завершаться. Вместо этого VM игнорирует ошибку, или берет некоторую реализацию определенное действие - например это могло бы напечатать ошибку к стандартной ошибке, или записать ошибку в системном журнале.

Завершение работы агента

Библиотека может дополнительно экспортировать функцию завершения работы со следующим прототипом:
JNIEXPORT void JNICALL 
Agent_OnUnload(JavaVM *vm)
Эта функция будет вызвана VM, когда библиотека соберется быть разгруженной. Библиотека будет разгружена, и эта функция будет вызвана, если некоторая платформа, определенный механизм вызывает разгружение (разгрузить механизм не определяется в этом документе) или библиотека будут (в действительности) разгружены завершением VM ли через нормальное завершение или отказ VM, включая отказ запуска. Безудержное завершение работы, couse, исключения к этому правилу. Отметьте различие между этой функцией и событием VM Death: для события VM Death, которое будет отправлено, VM, должно быть, работал, по крайней мере, на грани инициализации и допустимой JVM Agent_OnUnload и эта функция также вызывается, если библиотека разгружается по другим причинам. В случае, который отправляется событие VM Death, оно будет отправлено прежде, чем эта функция вызывается (предполагающий, что эта функция вызывается из-за завершения VM). Эта функция может привыкнуть к ресурсам уборки, выделенным агентом.

JAVA_TOOL_OPTIONS

Так как к командной строке нельзя всегда получать доступ или изменяться, например во встроенном VMs или просто VMs, запущенном глубоко в пределах сценариев, a JAVA_TOOL_OPTIONS переменная обеспечивается так, чтобы агенты могли быть запущены в этих случаях.

Платформы, которые поддерживают переменные окружения или другие именованные строки, могут поддерживать JAVA_TOOL_OPTIONS переменная. Эта переменная будет повреждена в опции на пробельных границах. Пробельные символы включают пространство, вкладку, возврат каретки, новую строку, вертикальную вкладку, и перевод формата. Последовательности пробельных символов считают эквивалентными единственному пробельному символу. Никакой пробел не включается в опции если не заключено в кавычки. Заключение в кавычки следующие: JNI_CreateJavaVM (в API Вызова JNI), будет предварительно ожидать эти опции к опциям, предоставленным в JavaVMInitArgs параметр. Платформы могут отключить эту опцию в случаях, где безопасность является беспокойством; например, Ссылочная Реализация отключает эту опцию на системах Unix, когда эффективный пользовательский или групповой ID отличается от реального ID. Эта функция предназначается, чтобы поддерживать инициализацию инструментов - определенно включая запуск собственных или агентов языка программирования Java. Многократные инструменты могут хотеть использовать эту функцию, таким образом, переменная не должна быть перезаписана, вместо этого, опции должны быть добавлены к переменной. Отметьте, что, так как переменная обрабатывается во время API Вызова JNI, создают вызов VM, опции, обработанные средством запуска (например, опции выбора VM), не будут обработаны.

Среды

JVM      Хотя их JVM  

Агент создает JVM  GetEnv. См. JVM Доступа для большего количества деталей о создании и использовании JVM  GetEnv от Agent_OnLoad.

Инструментарий байт-кода

Этот интерфейс не включает некоторые события, которые можно было бы ожидать в интерфейсе с профилированием поддержки. Некоторые примеры включают объектные события выделения, и метод максимальной скорости вводят и выходят из событий. Интерфейс вместо этого оказывает поддержку для инструментария байт-кода, возможность изменить инструкции байт-кода виртуальной машины Java, которые включают целевую программу. Как правило, эти изменения должны добавить "события" к коду метода - например, чтобы добавить, в начале метода, звонка MyProfiler.methodEntered(). Так как изменения являются просто дополнением, они не изменяют состояние приложения или поведение. Поскольку вставленный код агента является стандартными байт-кодами, VM может работать на максимальной скорости, оптимизируя не только целевая программа, но также и инструментарий. Если инструментарий не включает переключение с выполнения байт-кода, никакие дорогие изменения состояния не необходимы. Результатом являются высокопроизводительные события. Этот подход также обеспечивает полный контроль для агента: инструментарий может быть ограничен "интересным" частям кода (например, кода конечного пользователя) и может быть условным выражением. Инструментарий может работать полностью в коде языка программирования Java или может вызвать в собственный агент. Инструментарий может просто поддержать счетчики или может статистически выбрать события.

Инструментарий может быть вставлен одним из трех способов:

Функциональность модификации class, обеспеченная в этом интерфейсе, предназначается, чтобы обеспечить механизм для инструментария ( ClassFileLoadHook событие и RetransformClasses функция) и, во время разработки, для отладки фиксировать-и-продолжать ( RedefineClasses функция).

Забота должна быть проявлена, чтобы избежать тревожить зависимости, особенно инструментуя базовые классы. Например, подход к получению уведомления о каждом объектном выделении должен инструментовать конструктора на Object. Предполагая, что конструктор первоначально пуст, конструктор мог быть изменен на:
      public Object() {
        MyProfiler.allocationTracker(this);
      }
    
Однако, если это изменение было произведено, используя ClassFileLoadHook событие тогда это могло бы воздействовать на типичный VM следующим образом: первый создаваемый объект вызовет конструктора, вызывающего загрузку class MyProfiler; который тогда вызовет объектное создание, и с тех пор MyProfiler еще не загружается, бесконечная рекурсия; приведение к переполнению стека. Усовершенствование этого должно было бы задержать вызов метода отслеживания до безопасного времени. Например, trackAllocations мог быть установлен в обработчике для VMInit событие.
      static boolean trackAllocations = false;

      public Object() {
        if (trackAllocations) {
          MyProfiler.allocationTracker(this);
        }
      }
    

SetNativeMethodPrefix позволяет собственным методам быть инструментованными при помощи методов обертки.

Измененное Строковое Кодирование UTF-8

JVM Измененный Строковый раздел UTF-8 спецификации JNI для деталей.

Контекст спецификации

Так как этот интерфейс обеспечивает доступ к состоянию приложений, работающих в виртуальной машине Java; терминология обращается к платформе Java а не собственной платформе (если не утверждено иначе). Например:

Sun, Sun Microsystems, логотип Sun, Java, и JVM являются торговыми марками или зарегистрированными торговыми марками Oracle и/или его филиалов в США и других странах.


Функции

Доступ к Функциям

   К Java JVM доступов собственного кода Собственный Интерфейс (JNI) функции получают доступ. Указатель среды JVM.

Указатель среды является указателем на среду и имеет тип jvmtiEnv*. У среды есть информация о ее JVM  

Когда использующийся с языка C: двойная косвенность используется, чтобы получить доступ к функциям; указатель среды обеспечивает контекст и является первым параметром каждого вызова функции; например:
jvmtiEnv *jvmti;
...
jvmtiError err = (*jvmti)->GetLoadedClasses(jvmti, &class_count, &classes);
    

Когда использующийся с языка C++: к функциям получают доступ как функции членства jvmtiEnv; указатель среды не передают к вызову функции; например:
jvmtiEnv *jvmti;
...
jvmtiError err = jvmti->GetLoadedClasses(&class_count, &classes);
    
Если иначе не утверждено, все примеры и объявления в этой спецификации используют язык C.

JVM GetEnv функция:
jvmtiEnv *jvmti;
...
(*jvm)->GetEnv(jvm, &jvmti, JVMTI_VERSION_1_0);
    
Каждый звонок GetEnv создает новую JVM  version параметр GetEnv должна быть JVM GetEnv возвратится JNI_EVERSION если совместимая версия не доступна, если JVM   требуемые события, функции обработки событий, и возможности). Среда выпускается с DisposeEnvironment. Таким образом, в отличие от JNI, у которого есть одна среда на поток, JVM 

Функциональные Возвращаемые значения

 Код ошибки JVM через jvmtiError функциональное возвращаемое значение. Некоторые функции могут возвратить дополнительные значения через указатели, обеспеченные функцией вызова. В некоторых случаях, JVM  NULL.

Когда JVM JVMTI_ERROR_NONE) значения памяти, на которую ссылаются указатели параметра, неопределены, но никакая память не будет выделена, и никакие глобальные ссылки не будут выделены. Если ошибка происходит из-за недопустимого ввода, никакое действие не произойдет.

Управление Ссылками на объект JNI

JVM jobject и jclass) и их производные (jthread и jthreadGroup). Ссылки, которые передают к JVM   Документация JNI). Когда возврат потоков из собственного кода все локальные ссылки освобождается. Отметьте, что некоторые потоки, включая типичные потоки агента, никогда не будут возвращаться из собственного кода. Поток обеспечивается возможность создать шестнадцать локальных ссылок без потребности в любом явном управлении. Для потоков, выполняющих ограниченное количество JVM PushLocalFrame и PopLocalFrame. Наоборот, чтобы сохранить ссылки вне возврата из собственного кода, они должны быть преобразованы в глобальные ссылки. Эти правила не применяются к jmethodID и jfieldID поскольку они не jobjects.

Необходимое как условие государство для Вызывания Функций

Если функция явно не утверждает, что агент должен принести поток или VM к определенному состоянию (например, приостановленный), JVM 

Исключения и Функции

 Возвращаемое значение функции JVM. Любое существующее состояние исключения сохраняется через звонок в раздел Исключений Java JVM спецификации JNI для информации об обработке исключений.

Функция Индексирует


Управление памятью

Функции управления памятью: Эти функции предусматривают выделение и освобождение памяти, используемой JVM  


Выделить

jvmtiError
Allocate(jvmtiEnv* env,
            jlong size,
            unsigned char** mem_ptr)
Выделите область памяти через JVM Deallocate.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Эта функция может быть вызвана от обратных вызовов до итеративных функций "Кучи", или от обработчиков событий для GarbageCollectionStart, GarbageCollectionFinish, и ObjectFree события. 461.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
sizejlong Число байтов, чтобы выделить.

Объяснение: jlong используется для совместимости с JVMDI.

mem_ptrunsigned char** По возврату, указателю на начало выделенной памяти. Если size нуль, NULL возвращается.

Агент передает указатель на a unsigned char*. По возврату, unsigned char* точки недавно выделенному массиву размера size. Массив должен быть освобожден с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_OUT_OF_MEMORY Запрос памяти нельзя соблюдать.
JVMTI_ERROR_ILLEGAL_ARGUMENT size меньше чем нуль.
JVMTI_ERROR_NULL_POINTER mem_ptr NULL.

Освободить

jvmtiError
Deallocate(jvmtiEnv* env,
            unsigned char* mem)
Освободить mem использование JVM  Allocate). Вся выделенная память должна быть освобождена, или память не может быть исправлена.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Эта функция может быть вызвана от обратных вызовов до итеративных функций "Кучи", или от обработчиков событий для GarbageCollectionStart, GarbageCollectionFinish, и ObjectFree события. 471.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
mem unsigned char * Указатель на начало выделенной памяти. Пожалуйста, проигнорируйте "По возврату, элементы устанавливаются."

Агент передает массив unsigned char. Входящие значения элементов массива игнорируются. По возврату устанавливаются элементы. Если mem NULL, вызов игнорируется.

Ошибки
Эта функция возвращает универсальную ошибку


Поток

Функции потока: Типы функции потока: Типы потока: Флаги потока и константы:


Получите Состояние потока

jvmtiError
GetThreadState(jvmtiEnv* env,
            jthread thread,
            jint* thread_state_ptr)
Получите состояние потока. Состояние потока представляется ответами на иерархический ряд вопросов ниже:

Ответы представляются следующим битовый вектором.
Флаги Состояния потока
Постоянный Значение Описание
JVMTI_THREAD_STATE_ALIVE0x0001 Поток жив. Нуль, если поток нов (не запускался) или завершался.
JVMTI_THREAD_STATE_TERMINATED0x0002 Поток завершил выполнение.
JVMTI_THREAD_STATE_RUNNABLE0x0004 Поток выполним.
JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER0x0400 Поток ожидает, чтобы ввести блок/метод синхронизации или, после Object.wait(), ожидание, чтобы повторно войти в блок/метод синхронизации.
JVMTI_THREAD_STATE_WAITING0x0080 Поток ожидает.
JVMTI_THREAD_STATE_WAITING_INDEFINITELY0x0010 Поток ожидает без тайм-аута. Например, Object.wait().
JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT0x0020 Поток ожидает с максимальным временем, чтобы ожидать определенный. Например, Object.wait(long).
JVMTI_THREAD_STATE_SLEEPING0x0040 Поток спит- Thread.sleep(long).
JVMTI_THREAD_STATE_IN_OBJECT_WAIT0x0100 Поток ожидает на объектном мониторе- Object.wait.
JVMTI_THREAD_STATE_PARKED0x0200 Поток паркуется, например: LockSupport.park, LockSupport.parkUtil и LockSupport.parkNanos.
JVMTI_THREAD_STATE_SUSPENDED0x100000 Поток приостанавливается. java.lang.Thread.suspend() или JVM SuspendThread) был вызван на потоке. Если этот бит устанавливается, другие биты обращаются к состоянию потока перед приостановкой.
JVMTI_THREAD_STATE_INTERRUPTED0x200000 Поток был прерван.
JVMTI_THREAD_STATE_IN_NATIVE0x400000 Поток находится в собственном коде - то есть, собственный метод работает, который не перезвонил в VM или код языка программирования Java.

Этот флаг не устанавливается, выполняя VM скомпилированный код языка программирования Java, и при этом это не устанавливается, выполняя код VM или код поддержки VM. Собственные функции интерфейса VM, такие как JNI и JVM 
JVMTI_THREAD_STATE_VENDOR_10x10000000 Определенный поставщиком VM.
JVMTI_THREAD_STATE_VENDOR_20x20000000 Определенный поставщиком VM.
JVMTI_THREAD_STATE_VENDOR_30x40000000 Определенный поставщиком VM.
Следующие определения используются, чтобы преобразовать JVM java.lang.Thread.State состояния стиля.
java.lang. Поток. Государственные Маски Преобразования
Постоянный Значение Описание
JVMTI_JAVA_LANG_THREAD_STATE_MASKJVMTI_THREAD_STATE_TERMINATED | JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT Замаскируйте состояние с этим перед сравнением
JVMTI_JAVA_LANG_THREAD_STATE_NEW0 java.lang.Thread.State.NEW
JVMTI_JAVA_LANG_THREAD_STATE_TERMINATEDJVMTI_THREAD_STATE_TERMINATED java.lang.Thread.State.TERMINATED
JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLEJVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE java.lang.Thread.State.RUNNABLE
JVMTI_JAVA_LANG_THREAD_STATE_BLOCKEDJVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER java.lang.Thread.State.BLOCKED
JVMTI_JAVA_LANG_THREAD_STATE_WAITINGJVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY java.lang.Thread.State.WAITING
JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITINGJVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT java.lang.Thread.State.TIMED_WAITING
Правила

Может быть не больше, чем один ответ на вопрос, хотя не может быть никакого ответа (потому что ответ неизвестен, не применяется, или ни один из ответов не корректен). Ответ устанавливается только, когда включение отвечает на соответствие. Таким образом, не больше, чем один из может быть установлен (совместимая реализация J2SETM будет всегда устанавливать один из них если JVMTI_THREAD_STATE_ALIVE устанавливается). И если какой-либо из них устанавливается, ответ включения JVMTI_THREAD_STATE_ALIVE устанавливается. Не больше, чем один из может быть установлен (совместимая реализация J2SETM будет всегда устанавливать один из них если JVMTI_THREAD_STATE_WAITING устанавливается). И если любой устанавливается, ответы включения JVMTI_THREAD_STATE_ALIVE и JVMTI_THREAD_STATE_WAITING устанавливаются. Не больше, чем один из может быть установлен. И если какой-либо из них устанавливается, ответы включения JVMTI_THREAD_STATE_ALIVE и JVMTI_THREAD_STATE_WAITING устанавливаются. Кроме того, если JVMTI_THREAD_STATE_SLEEPING устанавливается, тогда JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT устанавливается. Если состояние A реализуется, используя механизм состояния B тогда, это - состояние, который возвращается этой функцией. Например, если Thread.sleep(long) реализуется, используя Object.wait(long) тогда это все еще JVMTI_THREAD_STATE_SLEEPING который возвращается. Больше чем один из может быть установлен, но если кто-либо устанавливается, JVMTI_THREAD_STATE_ALIVE устанавливается.

И наконец, JVMTI_THREAD_STATE_TERMINATED не может быть установлен если JVMTI_THREAD_STATE_ALIVE не устанавливается.

Представление состояния потока разрабатывается для расширения в будущих версиях спецификации; значения состояния потока должны использоваться соответственно, который является, они не должны использоваться в качестве ординалов. Большинство запросов может быть сделано, тестируя единственный бит, если использование в операторе переключения требуется, биты состояния должны быть замаскированы с интересными битами. Все биты, не определенные выше, резервируются для будущего использования. VM, совместимый к текущей спецификации, должен обнулить зарезервированные биты. Агент должен проигнорировать зарезервированные биты - они, как должно предполагаться, не являются нулем и таким образом не должны быть включены в сравнения.

Примеры

Отметьте, что значения ниже исключают зарезервированный и биты поставщика.

Состояние потока блокируется в a synchronized- оператор был бы:
            JVMTI_THREAD_STATE_ALIVE + JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER
        
Состояние потока, который не запустился еще, было бы:
            0
        
Состояние потока в a Object.wait(3000) был бы:
            JVMTI_THREAD_STATE_ALIVE + JVMTI_THREAD_STATE_WAITING + 
                JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT + 
                JVMTI_THREAD_STATE_MONITOR_WAITING
        
Состояние потока, приостановленного в то время как выполнимый, было бы:
            JVMTI_THREAD_STATE_ALIVE + JVMTI_THREAD_STATE_RUNNABLE + JVMTI_THREAD_STATE_SUSPENDED
        

Тестирование государства

В большинстве случаев состояние потока может быть определено, тестируя один бит, соответствующий тому вопросу. Например, код, чтобы протестировать, если поток спит:
	jint state;
	jvmtiError err;

	err = (*jvmti)->GetThreadState(jvmti, thread, &state);
	if (err == JVMTI_ERROR_NONE) {
	   if (state & JVMTI_THREAD_STATE_SLEEPING) {  ...
        

Для того, чтобы ожидать (то есть, в Object.wait, паркуемый, или спящий), это было бы:
	   if (state & JVMTI_THREAD_STATE_WAITING) {  ...
        
Для некоторых состояний должен будет быть протестирован больше чем один бит, как имеет место, тестируя, если поток еще не был запущен:
	   if ((state & (JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_TERMINATED)) == 0)  {  ...
        
Различать синхронизированный от несинхронизированного Object.wait:
	   if (state & JVMTI_THREAD_STATE_IN_OBJECT_WAIT)  {  
             if (state & JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT)  {
               printf("in Object.wait(long timeout)\n");
             } else {
               printf("in Object.wait()\n");
             }
           }
        

Отношение к java.lang.Thread.State

Состояние потока, представленное java.lang.Thread.State возвращенный из java.lang.Thread.getState() подмножество информации, возвращенной из этой функции. Соответствие java.lang.Thread.State может быть определен при использовании обеспеченных масок преобразования. Например, это возвращает имя java.lang.Thread.State состояние потока:
	    err = (*jvmti)->GetThreadState(jvmti, thread, &state);
	    abortOnError(err);
            switch (state & JVMTI_JAVA_LANG_THREAD_STATE_MASK) {
            case JVMTI_JAVA_LANG_THREAD_STATE_NEW:
              return "NEW";
            case JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED:
              return "TERMINATED";
            case JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE:
              return "RUNNABLE";
            case JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED:
              return "BLOCKED";
            case JVMTI_JAVA_LANG_THREAD_STATE_WAITING:
              return "WAITING";
            case JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING:
              return "TIMED_WAITING";
            }
        

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 171.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
threadjthread Поток, чтобы запросить. Если thread NULL, текущий поток используется.
thread_state_ptrjint* По возврату, точки, чтобы утвердить флаги, как определено Флагами Состояния потока.

Агент передает указатель на a jint. По возврату, jint был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_NULL_POINTER thread_state_ptr NULL.

Получите Текущий поток

jvmtiError
GetCurrentThread(jvmtiEnv* env,
            jthread* thread_ptr)
Получите текущий поток. Текущий поток является потоком языка программирования Java, который вызвал функцию.

Отметьте что большинство JVM NULL означать текущий поток.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 181.1

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
thread_ptrjthread* По возврату, точкам к текущему потоку.

Агент передает указатель на a jthread. По возврату, jthread был установлен. Объект, возвращенный thread_ptr JNI локальная ссылка и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER thread_ptr NULL.

Получите Все Потоки

jvmtiError
GetAllThreads(jvmtiEnv* env,
            jint* threads_count_ptr,
            jthread** threads_ptr)
Получите все живые потоки. Потоки являются потоками языка программирования Java; то есть, потоки, которые присоединены к VM. Поток жив если java.lang.Thread.isAlive() возвратился бы true, то есть, поток был запущен и еще не умер. Вселенная потоков определяется контекстом JVM  RunAgentThread).

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 41.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
threads_count_ptrjint* По возврату, точкам к числу выполнения потоков.

Агент передает указатель на a jint. По возврату, jint был установлен.
threads_ptrjthread** По возврату, точкам массиву ссылок, один для каждого рабочего потока.

Агент передает указатель на a jthread*. По возврату, jthread* точки недавно выделенному массиву размера *threads_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные threads_ptr JNI локальные ссылки и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER threads_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER threads_ptr NULL.

Приостановите Поток

jvmtiError
SuspendThread(jvmtiEnv* env,
            jthread thread)
Приостановите указанный поток. Если вызывающий поток будет определен, то эта функция не будет возвращаться до некоторых других вызовов потока ResumeThread. Если поток в настоящий момент приостанавливается, эта функция ничего не делает и возвращает ошибку.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 51.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_suspend Может приостановить и возобновить потоки

Параметры
Имя Ввести Описание
threadjthread Поток, чтобы приостановить. Если thread NULL, текущий поток используется.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_suspend. Использовать AddCapabilities.
JVMTI_ERROR_THREAD_SUSPENDED Поток уже приостанавливается.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).

Приостановите Список Потока

jvmtiError
SuspendThreadList(jvmtiEnv* env,
            jint request_count,
            const jthread* request_list,
            jvmtiError* results)
Приостановите request_count потоки, определенные в request_list массив. Потоки могут быть возобновлены с ResumeThreadList или ResumeThread. Если вызывающий поток определяется в request_list массив, эта функция не будет возвращаться, пока некоторый другой поток не возобновляет это. Ошибки, с которыми встречаются в приостановке потока, возвращаются в results массив, не в возвращаемом значении этой функции. Потоки, которые в настоящий момент приостанавливаются, не изменяют состояние.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 921.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_suspend Может приостановить и возобновить потоки

Параметры
Имя Ввести Описание
request_countjint Число потоков, чтобы приостановить.
request_listconst jthread* Список потоков, чтобы приостановить.

Агент передает в массиве request_count элементы jthread.
resultsjvmtiError* Агент предоставленный массив request_count элементы. По возврату, заполненному кодом ошибки для приостанавливания соответствующего потока. Код ошибки будет JVMTI_ERROR_NONE если поток был приостановлен этим вызовом. Возможные коды ошибки - определенные для SuspendThread.

Агент передает массив, достаточно многочисленный, чтобы содержать request_count элементы jvmtiError. Входящие значения элементов массива игнорируются. По возврату устанавливаются элементы.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_suspend. Использовать AddCapabilities.
JVMTI_ERROR_ILLEGAL_ARGUMENT request_count меньше чем 0.
JVMTI_ERROR_NULL_POINTER request_list NULL.
JVMTI_ERROR_NULL_POINTER results NULL.

Поток резюме

jvmtiError
ResumeThread(jvmtiEnv* env,
            jthread thread)
Возобновите приостановленный поток. Любые потоки в настоящий момент приостанавливаются через JVM SuspendThread) или java.lang.Thread.suspend() возобновит выполнение; все другие потоки незатронуты.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 61.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_suspend Может приостановить и возобновить потоки

Параметры
Имя Ввести Описание
threadjthread Поток, чтобы возобновиться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_suspend. Использовать AddCapabilities.
JVMTI_ERROR_THREAD_NOT_SUSPENDED Поток не был приостановлен.
JVMTI_ERROR_INVALID_TYPESTATE Состояние потока было изменено, и теперь непоследовательно.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).

Список Потока резюме

jvmtiError
ResumeThreadList(jvmtiEnv* env,
            jint request_count,
            const jthread* request_list,
            jvmtiError* results)
Возобновитесь request_count потоки, определенные в request_list массив. Любой поток приостанавливается через JVM SuspendThreadList) или java.lang.Thread.suspend() возобновит выполнение.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 931.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_suspend Может приостановить и возобновить потоки

Параметры
Имя Ввести Описание
request_countjint Число потоков, чтобы возобновиться.
request_listconst jthread* Потоки, чтобы возобновиться.

Агент передает в массиве request_count элементы jthread.
resultsjvmtiError* Агент предоставленный массив request_count элементы. По возврату, заполненному кодом ошибки для резюме о соответствующем потоке. Код ошибки будет JVMTI_ERROR_NONE если поток был приостановлен этим вызовом. Возможные коды ошибки - определенные для ResumeThread.

Агент передает массив, достаточно многочисленный, чтобы содержать request_count элементы jvmtiError. Входящие значения элементов массива игнорируются. По возврату устанавливаются элементы.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_suspend. Использовать AddCapabilities.
JVMTI_ERROR_ILLEGAL_ARGUMENT request_count меньше чем 0.
JVMTI_ERROR_NULL_POINTER request_list NULL.
JVMTI_ERROR_NULL_POINTER results NULL.

Остановите Поток

jvmtiError
StopThread(jvmtiEnv* env,
            jthread thread,
            jobject exception)
Отправьте указанное асинхронное исключение указанному потоку (подобный java.lang.Thread.stop). Обычно, эта функция используется, чтобы уничтожить указанный поток с экземпляром исключения ThreadDeath.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 71.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_signal_thread Может отправить остановку или прерывание к потокам

Параметры
Имя Ввести Описание
threadjthread Поток, чтобы остановиться.
exceptionjobject Асинхронный объект исключения.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_signal_thread. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_INVALID_OBJECT exception не объект.

Поток прерывания

jvmtiError
InterruptThread(jvmtiEnv* env,
            jthread thread)
Прервите указанный поток (подобный java.lang.Thread.interrupt).

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 81.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_signal_thread Может отправить остановку или прерывание к потокам

Параметры
Имя Ввести Описание
threadjthread Поток, чтобы прервать.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_signal_thread. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).

Получите Информацию Потока

typedef struct {
    char* name;
    jint priority;
    jboolean is_daemon;
    jthreadGroup thread_group;
    jobject context_class_loader;
} jvmtiThreadInfo;
jvmtiError
GetThreadInfo(jvmtiEnv* env,
            jthread thread,
            jvmtiThreadInfo* info_ptr)
Получите информацию потока. Поля jvmtiThreadInfo структура заполнена в деталями указанного потока.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 91.0

Возможности
Необходимая Функциональность

jvmtiThreadInfo - Распараллельте информационную структуру
Поле Ввести Описание
namechar* Имя потока, закодированное как измененная строка UTF-8.
priorityjint Приоритет потока. См. приоритетные константы потока: jvmtiThreadPriority.
is_daemonjboolean Действительно ли это - поток демона?
thread_groupjthreadGroup Группа потока, которой принадлежит этот поток. NULL если поток умер.
context_class_loaderjobject Контекст загрузчик class связался с этим потоком.

Параметры
Имя Ввести Описание
threadjthread Поток, чтобы запросить. Если thread NULL, текущий поток используется.
info_ptrjvmtiThreadInfo* По возврату, заполненному информацией, описывающей указанный поток.

Для JDK 1.1 реализации, которые не распознают контекст загрузчики class, context_class_loader поле будет НУЛЕМ.

Агент передает указатель на a jvmtiThreadInfo. По возврату, jvmtiThreadInfo был установлен. Указатель возвратился в поле name из jvmtiThreadInfo недавно выделенный массив. Массив должен быть освобожден с Deallocate. Объект возвратился в поле thread_group из jvmtiThreadInfo JNI локальная ссылка и должен управляться. Объект возвратился в поле context_class_loader из jvmtiThreadInfo JNI локальная ссылка и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_NULL_POINTER info_ptr NULL.

Получите Находящуюся в собственности Информацию Монитора

jvmtiError
GetOwnedMonitorInfo(jvmtiEnv* env,
            jthread thread,
            jint* owned_monitor_count_ptr,
            jobject** owned_monitors_ptr)
Получите информацию о мониторах, принадлежавших указанному потоку.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 101.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_get_owned_monitor_info Может получить информацию о владении мониторов - GetOwnedMonitorInfo

Параметры
Имя Ввести Описание
threadjthread Поток, чтобы запросить. Если thread NULL, текущий поток используется.
owned_monitor_count_ptrjint* Число мониторов возвратилось.

Агент передает указатель на a jint. По возврату, jint был установлен.
owned_monitors_ptrjobject** Массив находящихся в собственности мониторов.

Агент передает указатель на a jobject*. По возврату, jobject* точки недавно выделенному массиву размера *owned_monitor_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные owned_monitors_ptr JNI локальные ссылки и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_get_owned_monitor_info. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_NULL_POINTER owned_monitor_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER owned_monitors_ptr NULL.

Получите Находящуюся в собственности Информацию Глубины Стека Монитора

typedef struct {
    jobject monitor;
    jint stack_depth;
} jvmtiMonitorStackDepthInfo;
jvmtiError
GetOwnedMonitorStackDepthInfo(jvmtiEnv* env,
            jthread thread,
            jint* monitor_info_count_ptr,
            jvmtiMonitorStackDepthInfo** monitor_info_ptr)
Получите информацию о мониторах, принадлежавших указанному потоку и глубине стекового фрейма, который заблокировал их.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1531.1

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_get_owned_monitor_stack_depth_info Может получить информацию о находящихся в собственности мониторах с глубиной стека - GetOwnedMonitorStackDepthInfo

jvmtiMonitorStackDepthInfo - Информационная структура глубины стека монитора
Поле Ввести Описание
monitorjobject Находящийся в собственности монитор.
stack_depthjint Глубина стека. Соответствует глубине стека, используемой в функциях Стекового фрейма. Таким образом, нуль является текущим фреймом, каждый - фрейм который названный текущим фреймом. И это - отрицательный, если реализация не может определить глубину стека (например, для мониторов, полученных JNI MonitorEnter).

Параметры
Имя Ввести Описание
threadjthread Поток, чтобы запросить. Если thread NULL, текущий поток используется.
monitor_info_count_ptrjint* Число мониторов возвратилось.

Агент передает указатель на a jint. По возврату, jint был установлен.
monitor_info_ptr jvmtiMonitorStackDepthInfo ** Массив находящейся в собственности информации о глубине монитора.

Агент передает указатель на a jvmtiMonitorStackDepthInfo*. По возврату, jvmtiMonitorStackDepthInfo* точки недавно выделенному массиву размера *owned_monitor_depth_count_ptr. Массив должен быть освобожден с Deallocate. Объекты возвратились в поле monitor из jvmtiMonitorStackDepthInfo JNI локальные ссылки и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_get_owned_monitor_stack_depth_info. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_NULL_POINTER monitor_info_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER monitor_info_ptr NULL.

Станьте Текущими, Спорил Монитор

jvmtiError
GetCurrentContendedMonitor(jvmtiEnv* env,
            jthread thread,
            jobject* monitor_ptr)
Получите объект, если таковые вообще имеются, чей монитор указанный поток ожидает, чтобы ввести или ожидает, чтобы возвратить через java.lang.Object.wait.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 111.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_get_current_contended_monitor Может GetCurrentContendedMonitor

Параметры
Имя Ввести Описание
threadjthread Поток, чтобы запросить. Если thread NULL, текущий поток используется.
monitor_ptrjobject* По возврату, заполненному током, спорил монитор, или НУЛЬ, если нет ни одного.

Агент передает указатель на a jobject. По возврату, jobject был установлен. Объект, возвращенный monitor_ptr JNI локальная ссылка и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_get_current_contended_monitor. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_NULL_POINTER monitor_ptr NULL.

Агент Запускает Функцию

typedef void (JNICALL *jvmtiStartFunction)
    (jvmtiEnv* jvmti_env, 
     JNIEnv* jni_env, 
     void* arg);
Агент предоставленная функция обратного вызова. Эта функция является точкой входа для потока агента, запущенного с RunAgentThread.

Параметры
Имя Ввести Описание
jvmti_env jvmtiEnv * JVM 
jni_env JNIEnv * Среда JNI.
arg void * arg параметр, к которому передают RunAgentThread.

Выполненный Поток Агента

jvmtiError
RunAgentThread(jvmtiEnv* env,
            jthread thread,
            jvmtiStartFunction proc,
            const void* arg,
            jint priority)
Запускает выполнение потока агента. с указанной собственной функцией. Параметр arg передается на функции запуска (определенный с proc) как его единственный параметр. Эта функция позволяет создание потоков агента для того, чтобы обработать передачу с другим процессом или для того, чтобы обработать события без потребности загрузить специальный подкласс java.lang.Thread или разработчик java.lang.Runnable. Вместо этого создаваемый поток может работать полностью в собственном коде. Однако, создаваемый поток действительно требует недавно создаваемого экземпляра java.lang.Thread (ссылаемый параметром thread) с которым это будет связано. Объект потока может быть создан с вызовами JNI.

Следующие приоритеты общей нити обеспечиваются для Вашего удобства:
Приоритетные Константы потока
Постоянный Значение Описание
JVMTI_THREAD_MIN_PRIORITY1 Минимальный возможный приоритет потока
JVMTI_THREAD_NORM_PRIORITY5 Нормальный приоритет потока
JVMTI_THREAD_MAX_PRIORITY10 Максимальный возможный приоритет потока

Новая дискуссия начинается как поток демона с указанным priority. Если включено, a ThreadStart событие будет отправлено.

Так как поток был запущен, поток будет жив, когда эта функция возвратится, если поток сразу не умер.

Группа потока потока игнорируется - определенно, поток не добавляется к группе потока, и поток не замечается на запросах группы потока или в языке программирования Java или в JVM 

Поток не видим к запросам языка программирования Java, но включается в JVM GetAllThreads и GetAllStackTraces).

После выполнения proc, новый поток будет присоединен к VM - см. документацию JNI относительно Присоединения к VM.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 121.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
threadjthread Поток, чтобы работать.
proc jvmtiStartFunction Функция запуска.

argconst void * Параметр функции запуска.

Агент передает в указателе. Если arg NULL, NULL передается к функции запуска.
priorityjint Приоритет запущенного потока. Любой приоритет потока, позволенный java.lang.Thread.setPriority может использоваться включая тех в jvmtiThreadPriority.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_PRIORITY priority меньше чем JVMTI_THREAD_MIN_PRIORITY или больше чем JVMTI_THREAD_MAX_PRIORITY
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_NULL_POINTER proc NULL.

Установите Локальную память потока

jvmtiError
SetThreadLocalStorage(jvmtiEnv* env,
            jthread thread,
            const void* data)
VM хранит значение указателя, связанное каждой парой потока среды. Это значение указателя вызывают локальной памятью потока. Это значение NULL если не установлено с этой функцией. Агенты могут выделить память, в которой они хранят поток определенная информация. Устанавливая локальную память потока с этим можно тогда получить доступ GetThreadLocalStorage.

Эта функция вызывается агентом, чтобы установить значение JVM  

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 1031.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
threadjthread Хранилище к этому потоку. Если thread NULL, текущий поток используется.
dataconst void * Значение, которое будет введено в локальную память потока.

Агент передает в указателе. Если data NULL, значение устанавливается в NULL.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).

Получите Локальную память потока

jvmtiError
GetThreadLocalStorage(jvmtiEnv* env,
            jthread thread,
            void** data_ptr)
Вызванный агентом, чтобы получить значение JVM 

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 1021.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
threadjthread Получите от этого потока. Если thread NULL, текущий поток используется.
data_ptrvoid** Указатель, через который возвращается значение локальной памяти потока. Если локальная память потока не была установлена с SetThreadLocalStorage возвращенный указатель NULL.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_NULL_POINTER data_ptr NULL.


Thread Group

Функции Thread Group: Типы Thread Group:


Get Top Thread Groups

jvmtiError
GetTopThreadGroups(jvmtiEnv* env,
            jint* group_count_ptr,
            jthreadGroup** groups_ptr)
Возвратите весь верхний уровень (parentless) группы потока в VM.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 131.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
group_count_ptrjint* По возврату, точкам к числу высокоуровневых групп потока.

Агент передает указатель на a jint. По возврату, jint был установлен.
groups_ptrjthreadGroup** По возврату, обращается к указателю на высокоуровневый групповой массив потока.

Агент передает указатель на a jthreadGroup*. По возврату, jthreadGroup* точки недавно выделенному массиву размера *group_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные groups_ptr JNI локальные ссылки и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER group_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER groups_ptr NULL.

Информация Get Thread Group

typedef struct {
    jthreadGroup parent;
    char* name;
    jint max_priority;
    jboolean is_daemon;
} jvmtiThreadGroupInfo;
jvmtiError
GetThreadGroupInfo(jvmtiEnv* env,
            jthreadGroup group,
            jvmtiThreadGroupInfo* info_ptr)
Получите информацию о группе потока. Поля jvmtiThreadGroupInfo структура заполнена в деталями указанной группы потока.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 141.0

Возможности
Необходимая Функциональность

jvmtiThreadGroupInfo - Групповая информационная структура потока
Поле Ввести Описание
parentjthreadGroup Родительская группа потока.
namechar* Групповое имя потока, закодированное как измененная строка UTF-8.
max_priorityjint Максимальный приоритет для этой группы потока.
is_daemonjboolean Действительно ли это - группа потока демона?

Параметры
Имя Ввести Описание
groupjthreadGroup Группа потока, чтобы запросить.
info_ptrjvmtiThreadGroupInfo* По возврату, заполненному информацией, описывающей указанную группу потока.

Агент передает указатель на a jvmtiThreadGroupInfo. По возврату, jvmtiThreadGroupInfo был установлен. Объект возвратился в поле parent из jvmtiThreadGroupInfo JNI локальная ссылка и должен управляться. Указатель возвратился в поле name из jvmtiThreadGroupInfo недавно выделенный массив. Массив должен быть освобожден с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_THREAD_GROUP group не групповой объект потока.
JVMTI_ERROR_NULL_POINTER info_ptr NULL.

Дочерние элементы Get Thread Group

jvmtiError
GetThreadGroupChildren(jvmtiEnv* env,
            jthreadGroup group,
            jint* thread_count_ptr,
            jthread** threads_ptr,
            jint* group_count_ptr,
            jthreadGroup** groups_ptr)
Получите живые потоки и активные подгруппы в этой группе потока.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 151.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
groupjthreadGroup Группа, чтобы запросить.
thread_count_ptrjint* По возврату, точкам к числу живых потоков в этой группе потока.

Агент передает указатель на a jint. По возврату, jint был установлен.
threads_ptrjthread** По возврату, точкам массиву живых потоков в этой группе потока.

Агент передает указатель на a jthread*. По возврату, jthread* точки недавно выделенному массиву размера *thread_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные threads_ptr JNI локальные ссылки и должен управляться.
group_count_ptrjint* По возврату, точкам к числу активных дочерних групп потока

Агент передает указатель на a jint. По возврату, jint был установлен.
groups_ptrjthreadGroup** По возврату, точкам массиву активных дочерних групп потока.

Агент передает указатель на a jthreadGroup*. По возврату, jthreadGroup* точки недавно выделенному массиву размера *group_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные groups_ptr JNI локальные ссылки и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_THREAD_GROUP group не групповой объект потока.
JVMTI_ERROR_NULL_POINTER thread_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER threads_ptr NULL.
JVMTI_ERROR_NULL_POINTER group_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER groups_ptr NULL.


Стековый фрейм

Функции Стекового фрейма: Типы Стекового фрейма: Эти функции предоставляют информацию о стеке потока. На стековые фреймы ссылается глубина. Фрейм в нуле глубины является текущим фреймом.

Стековые фреймы как описываются в Спецификации Виртуальной машины Java™, Главе 3.6, таким образом, они соответствуют вызовам метода (включая собственные методы), но не соответствуют платформе собственные или внутренние рамки VM.

JVM main() и run(). Однако это представление должно быть непротиворечивым через всю JVM 

Информационная структура стекового фрейма

Информация о стековом фрейме возвращается в этой структуре.

typedef struct {
    jmethodID method;
    jlocation location;
} jvmtiFrameInfo;
jvmtiFrameInfo - Информационная структура стекового фрейма
Поле Ввести Описание
methodjmethodID Метод, выполняющийся в этом фрейме.
locationjlocation Индексирование инструкции, выполняющейся в этом фрейме. -1 если фрейм выполняет собственный метод.

Сложите информационную структуру

Информация о ряде стековых фреймов возвращается в этой структуре.

typedef struct {
    jthread thread;
    jint state;
    jvmtiFrameInfo* frame_buffer;
    jint frame_count;
} jvmtiStackInfo;
jvmtiStackInfo - Сложите информационную структуру
Поле Ввести Описание
threadjthread По возврату прослеживается поток.
statejint По возврату, состоянию потока. См. GetThreadState.
frame_buffer jvmtiFrameInfo * По возврату этот агент выделенный буфер заполнен информацией о стековом фрейме.
frame_countjint По возврату, числу записей, заполненных в frame_buffer. Это будет минутой (max_frame_count, stackDepth).


Получите Трассировку Стека

jvmtiError
GetStackTrace(jvmtiEnv* env,
            jthread thread,
            jint start_depth,
            jint max_frame_count,
            jvmtiFrameInfo* frame_buffer,
            jint* count_ptr)
Получите информацию о стеке потока. Если max_frame_count меньше чем глубина стека, max_frame_count самые верхние фреймы возвращаются, иначе весь стек возвращается. Самые верхние фреймы, последний раз вызванные, в начале возвращенного буфера.

Следующий пример заставляет до пяти из самых верхних фреймов быть возвращенными и (если есть какие-либо фреймы), в настоящий момент выполняющееся имя метода, которое будет напечатано.
jvmtiFrameInfo frames[5];
jint count;
jvmtiError err;

err = (*jvmti)->GetStackTrace(jvmti, aThread, 0, 5, 
                               frames, &count);
if (err == JVMTI_ERROR_NONE && count >= 1) {
   char *methodName;
   err = (*jvmti)->GetMethodName(jvmti, frames[0].method, 
                       &methodName, NULL, NULL);
   if (err == JVMTI_ERROR_NONE) {
      printf("Executing method: %s", methodName);
   }
}
        

thread не должен быть приостановлен, чтобы вызвать эту функцию.

GetLineNumberTable функция может использоваться, чтобы отобразить расположения на номера строки. Отметьте, что это отображение может быть сделано лениво.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1041.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
threadjthread Выберите трассировку стека этого потока. Если thread NULL, текущий поток используется.
start_depthjint Начните получать фреймы в этой глубине. Если неотрицательный, количество от текущего фрейма, первый полученный фрейм в глубине start_depth. Например, если нуль, запустите с текущего фрейма; если один, запустите с вызывающей стороны текущего фрейма; если два, запустите с вызывающей стороны вызывающей стороны текущего фрейма; и так далее. Если отрицание, количество от ниже самого старого фрейма, первый полученный фрейм в глубине stackDepth + start_depth, где stackDepth является количеством фреймов на стеке. Например, если отрицательный, только самый старый фрейм получается; если отрицательные два, запустите с фрейма, вызванного самым старым фреймом.
max_frame_countjint Максимальное количество jvmtiFrameInfo записи, чтобы получить.
frame_buffer jvmtiFrameInfo * По возврату этот агент выделенный буфер заполнен информацией о стековом фрейме.

Агент передает массив, достаточно многочисленный, чтобы содержать max_frame_count элементы jvmtiFrameInfo. Входящие значения элементов массива игнорируются. По возврату, *count_ptr из элементов устанавливаются.
count_ptrjint* По возврату, точкам к числу заполненных записей. Для неотрицательного start_depth, это будет минутой (max_frame_count, stackDepth - start_depth). Для отрицательного start_depth, это будет минутой (max_frame_count, -start_depth).

Агент передает указатель на a jint. По возврату, jint был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_ILLEGAL_ARGUMENT start_depth положительно и больше чем или равен stackDepth. Или start_depth отрицательно и меньше чем-stackDepth.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_ILLEGAL_ARGUMENT max_frame_count меньше чем 0.
JVMTI_ERROR_NULL_POINTER frame_buffer NULL.
JVMTI_ERROR_NULL_POINTER count_ptr NULL.

Получите Все Трассировки Стека

jvmtiError
GetAllStackTraces(jvmtiEnv* env,
            jint max_frame_count,
            jvmtiStackInfo** stack_info_ptr,
            jint* thread_count_ptr)
Получите информацию о стеках всех живых потоков (включая потоки агента). Если max_frame_count меньше чем глубина стека, max_frame_count самые верхние фреймы возвращаются для того потока, иначе весь стек возвращается. Самые верхние фреймы, последний раз вызванные, в начале возвращенного буфера.

Все стеки собираются одновременно, то есть, никакие изменения не произойдут с состоянием потока или стеками между выборкой одного потока и следующим. Потоки не должны быть приостановлены.
jvmtiStackInfo *stack_info;
jint thread_count;
int ti;
jvmtiError err;

err = (*jvmti)->GetAllStackTraces(jvmti, MAX_FRAMES, &stack_info, &thread_count); 
if (err != JVMTI_ERROR_NONE) {
   ...   
}
for (ti = 0; ti < thread_count; ++ti) {
   jvmtiStackInfo *infop = &stack_info[ti];
   jthread thread = infop->thread;
   jint state = infop->state;
   jvmtiFrameInfo *frames = infop->frame_buffer;
   int fi;

   myThreadAndStatePrinter(thread, state);
   for (fi = 0; fi < infop->frame_count; fi++) {
      myFramePrinter(frames[fi].method, frames[fi].location);
   }
}
/* this one Deallocate call frees all data allocated by GetAllStackTraces */
err = (*jvmti)->Deallocate(jvmti, stack_info); 
        

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1001.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
max_frame_countjint Максимальное количество jvmtiFrameInfo записи, чтобы получить на поток.
stack_info_ptr jvmtiStackInfo ** По возврату этот буфер заполнен информацией о стеке для каждого потока. Число jvmtiStackInfo записи определяются thread_count_ptr.

Отметьте, что этот буфер выделяется, чтобы включать jvmtiFrameInfo буферы, которыми указывают jvmtiStackInfo.frame_buffer. Эти буферы не должны быть отдельно освобождены.

Агент передает указатель на a jvmtiStackInfo*. По возврату, jvmtiStackInfo* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Объекты возвратились в поле thread из jvmtiStackInfo JNI локальные ссылки и должен управляться.
thread_count_ptrjint* Число потоков прослеживается.

Агент передает указатель на a jint. По возврату, jint был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_ILLEGAL_ARGUMENT max_frame_count меньше чем 0.
JVMTI_ERROR_NULL_POINTER stack_info_ptr NULL.
JVMTI_ERROR_NULL_POINTER thread_count_ptr NULL.

Получите Трассировки Стека Списка Потока

jvmtiError
GetThreadListStackTraces(jvmtiEnv* env,
            jint thread_count,
            const jthread* thread_list,
            jint max_frame_count,
            jvmtiStackInfo** stack_info_ptr)
Получите информацию о стеках предоставленных потоков. Если max_frame_count меньше чем глубина стека, max_frame_count самые верхние фреймы возвращаются для того потока, иначе весь стек возвращается. Самые верхние фреймы, последний раз вызванные, в начале возвращенного буфера.

Все стеки собираются одновременно, то есть, никакие изменения не произойдут с состоянием потока или стеками между выбирающим потоком и следующим. Потоки не должны быть приостановлены.

Если поток еще не запустился или завершается прежде, чем информация стека собирается, нулевой стек длины (jvmtiStackInfo.frame_count будет нуль), будет возвращен и поток jvmtiStackInfo.state может быть проверен.

См. пример для подобной функции GetAllStackTraces.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1011.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
thread_countjint Число потоков, чтобы проследить.
thread_listconst jthread* Список потоков, чтобы проследить.

Агент передает в массиве thread_count элементы jthread.
max_frame_countjint Максимальное количество jvmtiFrameInfo записи, чтобы получить на поток.
stack_info_ptr jvmtiStackInfo ** По возврату этот буфер заполнен информацией о стеке для каждого потока. Число jvmtiStackInfo записи определяются thread_count.

Отметьте, что этот буфер выделяется, чтобы включать jvmtiFrameInfo буферы, которыми указывают jvmtiStackInfo.frame_buffer. Эти буферы не должны быть отдельно освобождены.

Агент передает указатель на a jvmtiStackInfo*. По возврату, jvmtiStackInfo* точки недавно выделенному массиву размера *thread_count. Массив должен быть освобожден с Deallocate. Объекты возвратились в поле thread из jvmtiStackInfo JNI локальные ссылки и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_THREAD Элемент в thread_list не объект потока.
JVMTI_ERROR_ILLEGAL_ARGUMENT thread_count меньше чем 0.
JVMTI_ERROR_NULL_POINTER thread_list NULL.
JVMTI_ERROR_ILLEGAL_ARGUMENT max_frame_count меньше чем 0.
JVMTI_ERROR_NULL_POINTER stack_info_ptr NULL.

Получите Фрейм граф

jvmtiError
GetFrameCount(jvmtiEnv* env,
            jthread thread,
            jint* count_ptr)
Получите число фреймов в настоящий момент в стеке вызовов указанного потока.

Если эта функция вызывается для потока, активно выполняющего байт-коды (например, не текущий поток, и не приостанавливается), возвращенной информацией является переходный процесс.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 161.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
threadjthread Поток, чтобы запросить. Если thread NULL, текущий поток используется.
count_ptrjint* По возврату, точкам к числу фреймов в стеке вызовов.

Агент передает указатель на a jint. По возврату, jint был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_NULL_POINTER count_ptr NULL.

Вытолкайте Фрейм

jvmtiError
PopFrame(jvmtiEnv* env,
            jthread thread)
Вытолкайте текущий фрейм thread's стек. Выталкивание фрейма берет Вас к предыдущему фрейму. Когда поток возобновляется, режим выполнения потока сразу сбрасывается к состоянию прежде, чем вызванный метод был вызван. Это (использование терминологии Спецификации Виртуальной машины Java™): Отметьте однако, что любые изменения к параметрам, которые произошли в вызванном методе, остаются; когда выполнение будет продолжаться, первая инструкция, которая выполнит, будет вызыванием.

Между вызовом PopFrame и возобновляя поток состояние стека неопределено. Чтобы вытолкать фреймы вне первого, эти три шага должны быть повторены:

Блокировка, полученная, вызывая вызванный метод (если это - a synchronized метод), и блокировки получаются, входя synchronized блоки в пределах вызванного метода выпускаются. Отметьте: это не применяется к собственным блокировкам или java.util.concurrent.locks блокировки.

Наконец блоки не выполняются.

Изменения к глобальному состоянию не адресуются и таким образом остаются измененными.

Указанный поток должен быть приостановлен (который подразумевает, что это не может быть текущий поток).

И вызванный метод и метод вызова должны быть несобственными методами языка программирования Java.

Никакая JVM 

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 801.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_pop_frame Может вытолкать фреймы от стека - PopFrame

Параметры
Имя Ввести Описание
threadjthread Поток, текущий фрейм которого должен быть вытолкан.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_pop_frame. Использовать AddCapabilities.
JVMTI_ERROR_OPAQUE_FRAME Вызванный или вызывающий метод собственный метод. Реализация неспособна вытолкать этот фрейм.
JVMTI_ERROR_THREAD_NOT_SUSPENDED Поток не был приостановлен.
JVMTI_ERROR_NO_MORE_FRAMES На стеке вызовов есть меньше чем два стековых фрейма.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).

Получите Расположение Фрейма

jvmtiError
GetFrameLocation(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jmethodID* method_ptr,
            jlocation* location_ptr)

Для фрейма языка программирования Java возвратите расположение инструкции, в настоящий момент выполняющейся.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 191.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
threadjthread Поток фрейма, чтобы запросить. Если thread NULL, текущий поток используется.
depthjint Глубина фрейма, чтобы запросить.
method_ptrjmethodID* По возврату, точкам к методу для текущего расположения.

Агент передает указатель на a jmethodID. По возврату, jmethodID был установлен.
location_ptrjlocation* По возврату, точкам к индексированию в настоящий момент выполняющейся инструкции. Устанавливается в -1 если фрейм выполняет собственный метод.

Агент передает указатель на a jlocation. По возврату, jlocation был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth меньше чем нуль.
JVMTI_ERROR_NO_MORE_FRAMES Нет никаких стековых фреймов в указанном depth.
JVMTI_ERROR_NULL_POINTER method_ptr NULL.
JVMTI_ERROR_NULL_POINTER location_ptr NULL.

Уведомьте, что Фрейм Появляется

jvmtiError
NotifyFramePop(jvmtiEnv* env,
            jthread thread,
            jint depth)
Когда фрейм, который является в настоящий момент в depth выталкивается от стека, генерируйте a FramePop событие. См. FramePop событие для деталей. Только фреймы, соответствующие несобственным методам языка программирования Java, могут получить уведомление.

Указанный поток должен или быть текущим потоком или потоком, должен быть приостановлен.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 201.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_generate_frame_pop_events Может установить и таким образом добраться FramePop события

Параметры
Имя Ввести Описание
threadjthread Поток фрейма, для которого фрейм выталкивают событие, будет сгенерирован. Если thread NULL, текущий поток используется.
depthjint Глубина фрейма, для которого фрейм выталкивают событие, будет сгенерирована.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_generate_frame_pop_events. Использовать AddCapabilities.
JVMTI_ERROR_OPAQUE_FRAME Фрейм в depth выполняет собственный метод.
JVMTI_ERROR_THREAD_NOT_SUSPENDED Поток не был приостановлен и не был текущим потоком.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth меньше чем нуль.
JVMTI_ERROR_NO_MORE_FRAMES Нет никаких стековых фреймов в указанном depth.


Вызовите Ранний Возврат

Вызовите Ранние функции Возврата: Эти функции позволяют агенту вынуждать метод возвратиться в любой точке во время ее выполнения. Метод, который возвратится рано, упоминается как вызванный метод. Вызванный метод является текущим методом (как определено Спецификацией Виртуальной машины Java™, Главой 3.6) для указанного потока в то время, когда функция вызывается.

Указанный поток должен быть приостановлен или должен быть текущим потоком. Возврат происходит, когда выполнение кода языка программирования Java возобновляется на этом потоке. Между вызовом одной из этих функций и возобновлением выполнения потока, состояние стека неопределено.

Никакие дальнейшие инструкции не выполняются в вызванном методе. Определенно, наконец блоки не выполняются. Отметьте: это может вызвать непоследовательные состояния в приложении.

Блокировка, полученная, вызывая вызванный метод (если это - a synchronized метод), и блокировки получаются, входя synchronized блоки в пределах вызванного метода выпускаются. Отметьте: это не применяется к собственным блокировкам или java.util.concurrent.locks блокировки.

События, такой как MethodExit, сгенерированы, как они были бы в нормальном возврате.

Вызванный метод должен быть несобственным методом языка программирования Java. Принуждение возврата на потоке только с одним фреймом на стеке заставляет поток выходить когда возобновлено.


Вызовите Ранний Возврат - Объект

jvmtiError
ForceEarlyReturnObject(jvmtiEnv* env,
            jthread thread,
            jobject value)
Эта функция может использоваться, чтобы возвратиться из метода, тип результата которого Object или подкласс Object.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 811.1

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_force_early_return Может возвратиться рано из метода, как описано в Силе Ранняя категория Возврата.

Параметры
Имя Ввести Описание
threadjthread Поток, текущий фрейм которого должен возвратиться рано. Если thread NULL, текущий поток используется.
valuejobject Возвращаемое значение для вызванного фрейма. Объект или NULL.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_force_early_return. Использовать AddCapabilities.
JVMTI_ERROR_OPAQUE_FRAME Предпринятый, чтобы возвратиться рано из фрейма, соответствующего собственному методу. Или реализация неспособна обеспечить эту функциональность на этом фрейме.
JVMTI_ERROR_TYPE_MISMATCH Тип результата вызванного метода не Object или подкласс Object.
JVMTI_ERROR_TYPE_MISMATCH Предоставленный value не является совместимым с типом результата вызванного метода.
JVMTI_ERROR_THREAD_NOT_SUSPENDED Поток не был текущим потоком и не был приостановлен.
JVMTI_ERROR_NO_MORE_FRAMES На стеке вызовов нет больше фреймов.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_INVALID_OBJECT value не объект.

Вызовите Ранний Возврат - Интервал

jvmtiError
ForceEarlyReturnInt(jvmtiEnv* env,
            jthread thread,
            jint value)
Эта функция может использоваться, чтобы возвратиться из метода, тип результата которого int, short, char, byte, или boolean.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 821.1

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_force_early_return Может возвратиться рано из метода, как описано в Силе Ранняя категория Возврата.

Параметры
Имя Ввести Описание
threadjthread Поток, текущий фрейм которого должен возвратиться рано. Если thread NULL, текущий поток используется.
valuejint Возвращаемое значение для вызванного фрейма.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_force_early_return. Использовать AddCapabilities.
JVMTI_ERROR_OPAQUE_FRAME Предпринятый, чтобы возвратиться рано из фрейма, соответствующего собственному методу. Или реализация неспособна обеспечить эту функциональность на этом фрейме.
JVMTI_ERROR_TYPE_MISMATCH Тип результата вызванного метода не int, short, char, byte, или boolean.
JVMTI_ERROR_THREAD_NOT_SUSPENDED Поток не был текущим потоком и не был приостановлен.
JVMTI_ERROR_NO_MORE_FRAMES На стеке вызовов нет никаких фреймов.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).

Вызовите Ранний Возврат - Долго

jvmtiError
ForceEarlyReturnLong(jvmtiEnv* env,
            jthread thread,
            jlong value)
Эта функция может использоваться, чтобы возвратиться из метода, тип результата которого long.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 831.1

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_force_early_return Может возвратиться рано из метода, как описано в Силе Ранняя категория Возврата.

Параметры
Имя Ввести Описание
threadjthread Поток, текущий фрейм которого должен возвратиться рано. Если thread NULL, текущий поток используется.
valuejlong Возвращаемое значение для вызванного фрейма.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_force_early_return. Использовать AddCapabilities.
JVMTI_ERROR_OPAQUE_FRAME Предпринятый, чтобы возвратиться рано из фрейма, соответствующего собственному методу. Или реализация неспособна обеспечить эту функциональность на этом фрейме.
JVMTI_ERROR_TYPE_MISMATCH Тип результата вызванного метода не long.
JVMTI_ERROR_THREAD_NOT_SUSPENDED Поток не был текущим потоком и не был приостановлен.
JVMTI_ERROR_NO_MORE_FRAMES На стеке вызовов нет никаких фреймов.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).

Вызовите Ранний Возврат - Плавание

jvmtiError
ForceEarlyReturnFloat(jvmtiEnv* env,
            jthread thread,
            jfloat value)
Эта функция может использоваться, чтобы возвратиться из метода, тип результата которого float.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 841.1

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_force_early_return Может возвратиться рано из метода, как описано в Силе Ранняя категория Возврата.

Параметры
Имя Ввести Описание
threadjthread Поток, текущий фрейм которого должен возвратиться рано. Если thread NULL, текущий поток используется.
valuejfloat Возвращаемое значение для вызванного фрейма.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_force_early_return. Использовать AddCapabilities.
JVMTI_ERROR_OPAQUE_FRAME Предпринятый, чтобы возвратиться рано из фрейма, соответствующего собственному методу. Или реализация неспособна обеспечить эту функциональность на этом фрейме.
JVMTI_ERROR_TYPE_MISMATCH Тип результата вызванного метода не float.
JVMTI_ERROR_THREAD_NOT_SUSPENDED Поток не был текущим потоком и не был приостановлен.
JVMTI_ERROR_NO_MORE_FRAMES На стеке вызовов нет никаких фреймов.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).

Вызовите Ранний Возврат - Двойной

jvmtiError
ForceEarlyReturnDouble(jvmtiEnv* env,
            jthread thread,
            jdouble value)
Эта функция может использоваться, чтобы возвратиться из метода, тип результата которого double.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 851.1

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_force_early_return Может возвратиться рано из метода, как описано в Силе Ранняя категория Возврата.

Параметры
Имя Ввести Описание
threadjthread Поток, текущий фрейм которого должен возвратиться рано. Если thread NULL, текущий поток используется.
valuejdouble Возвращаемое значение для вызванного фрейма.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_force_early_return. Использовать AddCapabilities.
JVMTI_ERROR_OPAQUE_FRAME Предпринятый, чтобы возвратиться рано из фрейма, соответствующего собственному методу. Или реализация неспособна обеспечить эту функциональность на этом фрейме.
JVMTI_ERROR_TYPE_MISMATCH Тип результата вызванного метода не double.
JVMTI_ERROR_THREAD_NOT_SUSPENDED Поток не был текущим потоком и не был приостановлен.
JVMTI_ERROR_NO_MORE_FRAMES На стеке вызовов нет никаких фреймов.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).

Вызовите Ранний Возврат - Пусто

jvmtiError
ForceEarlyReturnVoid(jvmtiEnv* env,
            jthread thread)
Эта функция может использоваться, чтобы возвратиться из метода без типа результата. Таким образом, вызванный метод должен быть объявлен void.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 861.1

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_force_early_return Может возвратиться рано из метода, как описано в Силе Ранняя категория Возврата.

Параметры
Имя Ввести Описание
threadjthread Поток, текущий фрейм которого должен возвратиться рано. Если thread NULL, текущий поток используется.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_force_early_return. Использовать AddCapabilities.
JVMTI_ERROR_OPAQUE_FRAME Предпринятый, чтобы возвратиться рано из фрейма, соответствующего собственному методу. Или реализация неспособна обеспечить эту функциональность на этом фрейме.
JVMTI_ERROR_TYPE_MISMATCH У вызванного метода есть тип результата.
JVMTI_ERROR_THREAD_NOT_SUSPENDED Поток не был текущим потоком и не был приостановлен.
JVMTI_ERROR_NO_MORE_FRAMES На стеке вызовов нет никаких фреймов.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).


"Куча"

Функции "кучи": Типы функции "кучи": Типы "кучи": Флаги "кучи" и константы: Эти функции используются, чтобы проанализировать "кучу". Функциональность включает возможность просмотреть объекты в "куче" и тегировать эти объекты.

Объектные Теги

Тег является значением, связанным с объектом. Теги явно устанавливаются агентом, используя SetTag функционируйте или функциями обратного вызова такой как jvmtiHeapIterationCallback.

Теги локальны для среды; то есть, теги одной среды не видимы в другом.

Теги jlong значения, которые могут использоваться просто, чтобы отметить объект или сохранить указатель на более подробную информацию. У объектов, которые не были тегированы, есть тег нуля. Обнуление тега делает объект нетеговым.

Функции обратного вызова "кучи"

Функции "кучи", которые выполняют итерации через "кучу" и рекурсивно следуют за ссылками на объект, используют агент предоставленные функции обратного вызова, чтобы поставить информацию.

Эти функции обратного вызова "кучи" должны придерживаться следующих ограничений - Эти обратные вызовы не должны использовать функции JNI. Эти обратные вызовы не должны использовать обратный вызов JVM безопасные функции, которые определенно позволяют такое использование (см. необработанный монитор, управление памятью, и среду локальные функции хранения).

Реализация может вызвать обратный вызов на внутренний поток или поток, который вызывал итеративную функцию. Обратные вызовы "кучи" являются единственными, распараллеливал - не больше, чем, один обратный вызов будет вызван за один раз.

Флаги Фильтра "Кучи" могут использоваться, чтобы предотвратить создание отчетов, основанное на состоянии тега объекта или его class. Если никакие флаги не устанавливаются ( jint нуль), объекты не будут отфильтрованы.
Флаги Фильтра "кучи"
Постоянный Значение Описание
JVMTI_HEAP_FILTER_TAGGED0x4 Отфильтруйте теговые объекты. Объекты, которые тегируются, не включаются.
JVMTI_HEAP_FILTER_UNTAGGED0x8 Отфильтруйте нетеговые объекты. Объекты, которые не тегируются, не включаются.
JVMTI_HEAP_FILTER_CLASS_TAGGED0x10 Отфильтруйте объекты с теговыми классами. Объекты, class которых тегируется, не включаются.
JVMTI_HEAP_FILTER_CLASS_UNTAGGED0x20 Отфильтруйте объекты с нетеговыми классами. Объекты, class которых не тегируется, не включаются.

Флаги Управления Посещением "Кучи" возвращаются обратными вызовами "кучи" и могут использоваться, чтобы прервать итерацию. Для Ссылочного Обратного вызова "Кучи" это может также использоваться, чтобы сократить график пересеченных ссылок (JVMTI_VISIT_OBJECTS не устанавливается).
Флаги Управления Посещением "кучи"
Постоянный Значение Описание
JVMTI_VISIT_OBJECTS0x100 Если мы посещаем объект и если этот обратный вызов инициировался FollowReferences, пересеките ссылки этого объекта. Иначе проигнорированный.
JVMTI_VISIT_ABORT0x8000 Прервите итерацию. Проигнорируйте все другие биты.

Ссылочное Перечисление "Кучи" обеспечивается Ссылочным Обратным вызовом "Кучи" и Примитивным Полевым Обратным вызовом, чтобы описать вид ссылки, о которой сообщают.
Ссылочное Перечисление "кучи" (jvmtiHeapReferenceKind)
Постоянный Значение Описание
JVMTI_HEAP_REFERENCE_CLASS1 Ссылка от объекта до его class.
JVMTI_HEAP_REFERENCE_FIELD2 Ссылка от объекта до значения одного из его полей экземпляра.
JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT3 Ссылка от массива к одному из его элементов.
JVMTI_HEAP_REFERENCE_CLASS_LOADER4 Ссылка от class до его загрузчика class.
JVMTI_HEAP_REFERENCE_SIGNERS5 Ссылка от class до его массива подписывающих лиц.
JVMTI_HEAP_REFERENCE_PROTECTION_DOMAIN6 Ссылка от class до его домена защиты.
JVMTI_HEAP_REFERENCE_INTERFACE7 Ссылка от class до одного из его интерфейсов. Отметьте: интерфейсы определяются через постоянную ссылку пула, таким образом, об интерфейсах, на которые ссылаются, можно также сообщить с a JVMTI_HEAP_REFERENCE_CONSTANT_POOL ссылочный вид.
JVMTI_HEAP_REFERENCE_STATIC_FIELD8 Ссылка от class до значения одного из его статических полей.
JVMTI_HEAP_REFERENCE_CONSTANT_POOL9 Ссылка от class до разрешенной записи в постоянном пуле.
JVMTI_HEAP_REFERENCE_SUPERCLASS10 Ссылка от class до его суперкласса. Обратный вызов является роботом, отправленным, если суперкласс java.lang.Object. Отметьте: загруженные классы определяют суперклассы через постоянную ссылку пула, таким образом, о суперклассе, на который ссылаются, можно также сообщить с a JVMTI_HEAP_REFERENCE_CONSTANT_POOL ссылочный вид.
JVMTI_HEAP_REFERENCE_JNI_GLOBAL21 Корневая ссылка "кучи": глобальная ссылка JNI.
JVMTI_HEAP_REFERENCE_SYSTEM_CLASS22 Корневая ссылка "кучи": Система class.
JVMTI_HEAP_REFERENCE_MONITOR23 Корневая ссылка "кучи": монитор.
JVMTI_HEAP_REFERENCE_STACK_LOCAL24 Корневая ссылка "кучи": локальная переменная на стеке.
JVMTI_HEAP_REFERENCE_JNI_LOCAL25 Корневая ссылка "кучи": JNI локальная ссылка.
JVMTI_HEAP_REFERENCE_THREAD26 Корневая ссылка "кучи": Поток.
JVMTI_HEAP_REFERENCE_OTHER27 Корневая ссылка "кучи": другая корневая ссылка "кучи".

Определения для единственных дескрипторов символьного типа типов примитивов.
Перечисление Типа примитива (jvmtiPrimitiveType)
Постоянный Значение Описание
JVMTI_PRIMITIVE_TYPE_BOOLEAN90 'Z' - язык программирования Java boolean - JNI jboolean
JVMTI_PRIMITIVE_TYPE_BYTE66 'B' - язык программирования Java byte - JNI jbyte
JVMTI_PRIMITIVE_TYPE_CHAR67 'C' - язык программирования Java char - JNI jchar
JVMTI_PRIMITIVE_TYPE_SHORT83 'S' - язык программирования Java short - JNI jshort
JVMTI_PRIMITIVE_TYPE_INT73 'Я' - язык программирования Java int - JNI jint
JVMTI_PRIMITIVE_TYPE_LONG74 'J' - язык программирования Java long - JNI jlong
JVMTI_PRIMITIVE_TYPE_FLOAT70 'F' - язык программирования Java float - JNI jfloat
JVMTI_PRIMITIVE_TYPE_DOUBLE68 'D' - язык программирования Java double - JNI jdouble

Ссылочная информационная структура для Полевых ссылок

Информация о ссылке, возвращенная для JVMTI_HEAP_REFERENCE_FIELD и JVMTI_HEAP_REFERENCE_STATIC_FIELD ссылки.

typedef struct {
    jint index;
} jvmtiHeapReferenceInfoField;
jvmtiHeapReferenceInfoField - Ссылочная информационная структура для Полевых ссылок
Поле Ввести Описание
indexjint Для JVMTI_HEAP_REFERENCE_FIELD, объектом referrer не является class или inteface. В этом случае, index индексирование поля в class объекта referrer. Этот class упоминается ниже как C.

Для JVMTI_HEAP_REFERENCE_STATIC_FIELD, объектом referrer является class (упомянутый ниже как C) или интерфейс (упомянутый ниже как I). В этом случае, index индексирование поля в том class или интерфейсе.

Если объект referrer не является интерфейсом, то полевые индексы определяются следующим образом:
  • составьте список всех полей в C и его суперклассах, запускающихся со всех полей в java.lang.Object и окончание всеми полями в C.
  • В пределах этого списка, помещенного поля для данного class в порядке, возвращенном GetClassFields.
  • Присвойте поля в этом списке индексы n, n+1..., в порядке, где n является количеством полей во всех интерфейсах, реализованных К. Ноутом, что C реализует все интерфейсы, непосредственно реализованные его суперклассами; так же как все суперинтерфейсы этих интерфейсов.
Если объект referrer является интерфейсом, то полевые индексы определяются следующим образом:
  • составьте список полей, непосредственно объявленных во мне.
  • В пределах этого списка, помещенного поля в порядок, возвращенный GetClassFields.
  • Присвойте поля в этом списке индексы n, n+1..., в порядке, где n является количеством полей во всех суперинтерфейсах меня.
Все поля включаются в это вычисление, независимо от полевого модификатора (статичный, общедоступный, частный, и т.д.).

Например, учитывая следующие классы и интерфейсы:
interface I0 {
    int p = 0;
}

interface I1 extends I0 {
    int x = 1;
}

interface I2 extends I0 {
    int y = 2;
}

class C1 implements I1 {
    public static int a = 3;
    private int b = 4;
}

class C2 extends C1 implements I2 {
    static int q = 5;
    final int r = 6;
}
            
Примите это GetClassFields обращенный C1 возвращает поля C1 в порядке: a, b; и что поля C2 возвращаются в порядке: q, r. Экземпляр class C1 будет иметь следующие полевые индексы:
a 2 Количество полей в интерфейсах, реализованных C1 два (n=2): p из I0 и x из I1.
b 3 последующие индексируют.
class C1 будет иметь те же самые полевые индексы.

Экземпляр class C2 будет иметь следующие полевые индексы:
a 3 Количество полей в интерфейсах, реализованных C2 три (n=3): p из I0, x из I1 и y из I2 (интерфейс C2). Отметьте что поле p из I0 только включается однажды.
b 4 последующие индексируют к "a".
q 5 последующие индексируют к "b".
r 6 последующие индексируют к "q".
class C2 будет иметь те же самые полевые индексы. Отметьте, что у поля может быть различное, индексируют в зависимости от объекта, который просматривает его - например поле "a" выше. Отметьте также: не все полевые индексы могут быть видимыми от обратных вызовов, но все индексы показывают в иллюстративных целях.

Интерфейс I1 будет иметь следующие полевые индексы:
x 1 Количество полей в суперинтерфейсах I1 один (n=1): p из I0.

Ссылочная информационная структура для ссылок Массива

Информация о ссылке, возвращенная для JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT ссылки.

typedef struct {
    jint index;
} jvmtiHeapReferenceInfoArray;
jvmtiHeapReferenceInfoArray - Ссылочная информационная структура для ссылок Массива
Поле Ввести Описание
indexjint Массив индексирует.

Ссылочная информационная структура для Постоянных ссылок Пула

Информация о ссылке, возвращенная для JVMTI_HEAP_REFERENCE_CONSTANT_POOL ссылки.

typedef struct {
    jint index;
} jvmtiHeapReferenceInfoConstantPool;
jvmtiHeapReferenceInfoConstantPool - Ссылочная информационная структура для Постоянных ссылок Пула
Поле Ввести Описание
indexjint Индексирование в постоянный пул class. См. описание в Спецификации Виртуальной машины Java™, Главу 4.4.

Ссылочная информационная структура для ссылок Локальной переменной

Информация о ссылке, возвращенная для JVMTI_HEAP_REFERENCE_STACK_LOCAL ссылки.

typedef struct {
    jlong thread_tag;
    jlong thread_id;
    jint depth;
    jmethodID method;
    jlocation location;
    jint slot;
} jvmtiHeapReferenceInfoStackLocal;
jvmtiHeapReferenceInfoStackLocal - Ссылочная информационная структура для ссылок Локальной переменной
Поле Ввести Описание
thread_tagjlong Тег потока, соответствующего этому стеку, обнулите если не теговый.
thread_idjlong Уникальный ID потока потока, соответствующего этому стеку.
depthjint Глубина фрейма.
methodjmethodID Метод, выполняющийся в этом фрейме.
locationjlocation В настоящий момент выполняющееся расположение в этом фрейме.
slotjint Число слота локальной переменной.

Ссылочная информационная структура для JNI локальные ссылки

Информация о ссылке, возвращенная для JVMTI_HEAP_REFERENCE_JNI_LOCAL ссылки.

typedef struct {
    jlong thread_tag;
    jlong thread_id;
    jint depth;
    jmethodID method;
} jvmtiHeapReferenceInfoJniLocal;
jvmtiHeapReferenceInfoJniLocal - Ссылочная информационная структура для JNI локальные ссылки
Поле Ввести Описание
thread_tagjlong Тег потока, соответствующего этому стеку, обнулите если не теговый.
thread_idjlong Уникальный ID потока потока, соответствующего этому стеку.
depthjint Глубина фрейма.
methodjmethodID Метод, выполняющийся в этом фрейме.

Ссылочная информационная структура для Других ссылок

Информация о ссылке возвратилась для других ссылок.

typedef struct {
    jlong reserved1;
    jlong reserved2;
    jlong reserved3;
    jlong reserved4;
    jlong reserved5;
    jlong reserved6;
    jlong reserved7;
    jlong reserved8;
} jvmtiHeapReferenceInfoReserved;
jvmtiHeapReferenceInfoReserved - Ссылочная информационная структура для Других ссылок
Поле Ввести Описание
reserved1jlong зарезервированный для будущего использования.
reserved2jlong зарезервированный для будущего использования.
reserved3jlong зарезервированный для будущего использования.
reserved4jlong зарезервированный для будущего использования.
reserved5jlong зарезервированный для будущего использования.
reserved6jlong зарезервированный для будущего использования.
reserved7jlong зарезервированный для будущего использования.
reserved8jlong зарезервированный для будущего использования.

Ссылочная информационная структура

Информация возвратилась о referrers. Представленный как объединение различных видов информации о ссылке.

typedef union {
    jvmtiHeapReferenceInfoField field;
    jvmtiHeapReferenceInfoArray array;
    jvmtiHeapReferenceInfoConstantPool constant_pool;
    jvmtiHeapReferenceInfoStackLocal stack_local;
    jvmtiHeapReferenceInfoJniLocal jni_local;
    jvmtiHeapReferenceInfoReserved other;
} jvmtiHeapReferenceInfo;
jvmtiHeapReferenceInfo - Ссылочная информационная структура
Поле Ввести Описание
fieldjvmtiHeapReferenceInfoField referrer информация для JVMTI_HEAP_REFERENCE_FIELD и JVMTI_HEAP_REFERENCE_STATIC_FIELD ссылки.
arrayjvmtiHeapReferenceInfoArray referrer информация для Для JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT ссылки.
constant_pooljvmtiHeapReferenceInfoConstantPool referrer информация для Для JVMTI_HEAP_REFERENCE_CONSTANT_POOL ссылки.
stack_localjvmtiHeapReferenceInfoStackLocal referrer информация для Для JVMTI_HEAP_REFERENCE_STACK_LOCAL ссылки.
jni_localjvmtiHeapReferenceInfoJniLocal referrer информация для Для JVMTI_HEAP_REFERENCE_JNI_LOCAL ссылки.
otherjvmtiHeapReferenceInfoReserved зарезервированный для будущего использования.

Структура функции обратного вызова "кучи"

typedef struct {
    jvmtiHeapIterationCallback heap_iteration_callback;
    jvmtiHeapReferenceCallback heap_reference_callback;
    jvmtiPrimitiveFieldCallback primitive_field_callback;
    jvmtiArrayPrimitiveValueCallback array_primitive_value_callback;
    jvmtiStringPrimitiveValueCallback string_primitive_value_callback;
    jvmtiReservedCallback reserved5;
    jvmtiReservedCallback reserved6;
    jvmtiReservedCallback reserved7;
    jvmtiReservedCallback reserved8;
    jvmtiReservedCallback reserved9;
    jvmtiReservedCallback reserved10;
    jvmtiReservedCallback reserved11;
    jvmtiReservedCallback reserved12;
    jvmtiReservedCallback reserved13;
    jvmtiReservedCallback reserved14;
    jvmtiReservedCallback reserved15;
} jvmtiHeapCallbacks;
jvmtiHeapCallbacks - Структура функции обратного вызова "кучи"
Поле Ввести Описание
heap_iteration_callback jvmtiHeapIterationCallback Обратный вызов, который вызовут, чтобы описать объект в "куче". Используемый IterateThroughHeap функция, проигнорированная FollowReferences функция.
heap_reference_callback jvmtiHeapReferenceCallback Обратный вызов, который вызовут, чтобы описать ссылку на объект. Используемый FollowReferences функция, проигнорированная IterateThroughHeap функция.
primitive_field_callback jvmtiPrimitiveFieldCallback Обратный вызов, который вызовут, чтобы описать примитивное поле.
array_primitive_value_callback jvmtiArrayPrimitiveValueCallback Обратный вызов, который вызовут, чтобы описать массив примитивных значений.
string_primitive_value_callback jvmtiStringPrimitiveValueCallback Обратный вызов, который вызовут, чтобы описать Строковое значение.
reserved5 jvmtiReservedCallback Зарезервированный для будущего использования..
reserved6 jvmtiReservedCallback Зарезервированный для будущего использования..
reserved7 jvmtiReservedCallback Зарезервированный для будущего использования..
reserved8 jvmtiReservedCallback Зарезервированный для будущего использования..
reserved9 jvmtiReservedCallback Зарезервированный для будущего использования..
reserved10 jvmtiReservedCallback Зарезервированный для будущего использования..
reserved11 jvmtiReservedCallback Зарезервированный для будущего использования..
reserved12 jvmtiReservedCallback Зарезервированный для будущего использования..
reserved13 jvmtiReservedCallback Зарезервированный для будущего использования..
reserved14 jvmtiReservedCallback Зарезервированный для будущего использования..
reserved15 jvmtiReservedCallback Зарезервированный для будущего использования..

Объяснение: функциональность дампа "кучи" (ниже) использует обратный вызов для каждого объекта. В то время как казалось бы, что буферизованный подход обеспечит лучшую пропускную способность, тесты не показывают это, чтобы иметь место - возможно из-за местоположения ссылки памяти или издержек доступа массива.


Итеративный Обратный вызов "кучи"

typedef jint (JNICALL *jvmtiHeapIterationCallback)
    (jlong class_tag, 
     jlong size, 
     jlong* tag_ptr, 
     jint length, 
     void* user_data);
Агент предоставленная функция обратного вызова. Описывает (но не передает в), объект в "куче".

Эта функция должна возвратить немного вектора требуемых флагов управления посещением. Это определит, должна ли вся итерация быть прервана ( JVMTI_VISIT_OBJECTS флаг игнорируется).

См. ограничения функции обратного вызова "кучи".

Параметры
Имя Ввести Описание
class_tagjlong Тег class объекта (обнуляют, если class не тегируется). Если объект представляет время выполнения class, class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
sizejlong Размер объекта (в байтах). См. GetObjectSize.
tag_ptrjlong* Объектное значение тега, или нуль, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
lengthjint Если этот объект является массивом, длиной массива. Иначе отрицательный один (-1).
user_datavoid* Данные пользователя, которыми снабжают, которые передали в итеративную функцию.

Ссылочный Обратный вызов "кучи"

typedef jint (JNICALL *jvmtiHeapReferenceCallback)
    (jvmtiHeapReferenceKind reference_kind, 
     const jvmtiHeapReferenceInfo* reference_info, 
     jlong class_tag, 
     jlong referrer_class_tag, 
     jlong size, 
     jlong* tag_ptr, 
     jlong* referrer_tag_ptr, 
     jint length, 
     void* user_data);
Агент предоставленная функция обратного вызова. Описывает ссылку от объекта или VM (referrer) к другому объекту (referree) или корень "кучи" к referree.

Эта функция должна возвратить немного вектора требуемых флагов управления посещением. Это определит, нужно ли объекты, на которые ссылается referree, посетить или если вся итерация должна быть прервана.

См. ограничения функции обратного вызова "кучи".

Параметры
Имя Ввести Описание
reference_kindjvmtiHeapReferenceKind Вид ссылки.
reference_infoconst jvmtiHeapReferenceInfo * Детали о ссылке. Набор, когда reference_kind JVMTI_HEAP_REFERENCE_FIELD, JVMTI_HEAP_REFERENCE_STATIC_FIELD, JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT, JVMTI_HEAP_REFERENCE_CONSTANT_POOL, JVMTI_HEAP_REFERENCE_STACK_LOCAL, или JVMTI_HEAP_REFERENCE_JNI_LOCAL. Иначе NULL.
class_tagjlong Тег class объекта referree (обнуляют, если class не тегируется). Если объект referree представляет время выполнения class, class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
referrer_class_tagjlong Тег class объекта referrer (обнуляют, если class не тегируется или referree, является корнем "кучи"). Если объект referrer представляет время выполнения class, referrer_class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
sizejlong Размер объекта referree (в байтах). См. GetObjectSize.
tag_ptrjlong* Точки к referree возражают значению тега, или нулю, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
referrer_tag_ptrjlong* Точки к тегу объекта referrer, или точки к нулю, если объект referrer не тегируется. NULL если referrer в не объект (то есть, этот обратный вызов сообщает о корне "кучи"). Чтобы установить значение тега, которое будет связано с referrer, возражают, что агент устанавливает jlong указанный параметром. Если этот обратный вызов сообщает о ссылке от объекта до себя, referrer_tag_ptr == tag_ptr.
lengthjint Если этот объект является массивом, длиной массива. Иначе отрицательный один (-1).
user_datavoid* Данные пользователя, которыми снабжают, которые передали в итеративную функцию.

Примитивный Полевой Обратный вызов

typedef jint (JNICALL *jvmtiPrimitiveFieldCallback)
    (jvmtiHeapReferenceKind kind, 
     const jvmtiHeapReferenceInfo* info, 
     jlong object_class_tag, 
     jlong* object_tag_ptr, 
     jvalue value, 
     jvmtiPrimitiveType value_type, 
     void* user_data);
Предоставленная функция обратного вызова агента, которая описывает примитивное поле объекта (объект). Примитивное поле является полем, тип которого является типом примитива. Этот обратный вызов опишет статическое поле, если объект будет class, и иначе опишет поле экземпляра.

Эта функция должна возвратить немного вектора требуемых флагов управления посещением. Это определит, должна ли вся итерация быть прервана ( JVMTI_VISIT_OBJECTS флаг игнорируется).

См. ограничения функции обратного вызова "кучи".

Параметры
Имя Ввести Описание
kindjvmtiHeapReferenceKind Вид поля - экземпляр или статичный (JVMTI_HEAP_REFERENCE_FIELD или JVMTI_HEAP_REFERENCE_STATIC_FIELD).
infoconst jvmtiHeapReferenceInfo * Какое поле (поле индексируют).
object_class_tagjlong Тег class объекта (обнуляют, если class не тегируется). Если объект представляет время выполнения class, object_class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
object_tag_ptrjlong* Точки к тегу объекта, или нуль, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
valuejvalue Значение поля.
value_typejvmtiPrimitiveType Тип поля.
user_datavoid* Данные пользователя, которыми снабжают, которые передали в итеративную функцию.

Выстройте Примитивный Обратный вызов Значения

typedef jint (JNICALL *jvmtiArrayPrimitiveValueCallback)
    (jlong class_tag, 
     jlong size, 
     jlong* tag_ptr, 
     jint element_count, 
     jvmtiPrimitiveType element_type, 
     const void* elements, 
     void* user_data);
Агент предоставленная функция обратного вызова. Описывает значения в массиве типа примитива.

Эта функция должна возвратить немного вектора требуемых флагов управления посещением. Это определит, должна ли вся итерация быть прервана ( JVMTI_VISIT_OBJECTS флаг игнорируется).

См. ограничения функции обратного вызова "кучи".

Параметры
Имя Ввести Описание
class_tagjlong Тег class объекта массива (обнуляют, если class не тегируется).
sizejlong Размер массива (в байтах). См. GetObjectSize.
tag_ptrjlong* Точки к тегу объекта массива, или нуль, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
element_countjint Длина примитивного массива.
element_typejvmtiPrimitiveType Тип элементов массива.
elementsconst void* Элементы массива в упакованном массиве element_count элементы element_type размер каждый.
user_datavoid* Данные пользователя, которыми снабжают, которые передали в итеративную функцию.

Представьте Примитивный Обратный вызов Значения в виде строки

typedef jint (JNICALL *jvmtiStringPrimitiveValueCallback)
    (jlong class_tag, 
     jlong size, 
     jlong* tag_ptr, 
     const jchar* value, 
     jint value_length, 
     void* user_data);
Агент предоставленная функция обратного вызова. Описывает значение java.lang. Строка.

Эта функция должна возвратить немного вектора требуемых флагов управления посещением. Это определит, должна ли вся итерация быть прервана ( JVMTI_VISIT_OBJECTS флаг игнорируется).

См. ограничения функции обратного вызова "кучи".

Параметры
Имя Ввести Описание
class_tagjlong Тег class Строки class (обнуляют, если class не тегируется).
sizejlong Размер строки (в байтах). См. GetObjectSize.
tag_ptrjlong* Точки к тегу Строкового объекта, или нуль, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
valueconst jchar* Значение Строки, закодированной как строка Unicode.
value_lengthjint Длина строки. Длина равна числу 16-разрядных символов Unicode в строке.
user_datavoid* Данные пользователя, которыми снабжают, которые передали в итеративную функцию.

зарезервированный для будущего Обратного вызова использования

typedef jint (JNICALL *jvmtiReservedCallback)
    ();
Заполнитель - зарезервированный для будущего использования.

Параметры
Имя Ввести Описание

Следуйте за Ссылками

jvmtiError
FollowReferences(jvmtiEnv* env,
            jint heap_filter,
            jclass klass,
            jobject initial_object,
            const jvmtiHeapCallbacks* callbacks,
            const void* user_data)
Эта функция инициирует обход по объектам, которые являются непосредственно и косвенно достижимы от указанного объекта или, если initial_object не определяется, все объекты, достижимые от корней "кучи". Корень "кучи" является набором системных классов, глобальных переменных JNI, ссылок от стеков потока, и других объектов, используемых, как поддерживает цели сборки "мусора".

Эта функция работает, пересекая ссылочный график. Позвольте A, B... представьте объекты. Когда ссылка от до B пересекается, когда ссылка от корня "кучи" до B пересекается, или когда B определяется как initial_object, тогда B, как говорят, посещают. Ссылка от до B не пересекается, пока A не посещают. О ссылках сообщают в том же самом порядке, что ссылки пересекаются. О ссылках на объект сообщают, вызывая агент предоставленная функция обратного вызова jvmtiHeapReferenceCallback. В ссылке от до B, A известен как referrer и B как referree. Обратный вызов вызывается точно однажды для каждой ссылки от referrer; это - истина, даже если есть ссылочные циклы или разнообразные пути к referrer. Может быть больше чем одна ссылка между referrer и referree, о каждой ссылке сообщают. Эти ссылки можно отличить, исследуя reference_kind и reference_info параметры jvmtiHeapReferenceCallback обратный вызов.

Эта функция сообщает о представлении языка программирования Java ссылок на объект, не представлении реализации виртуальной машины. О следующих ссылках на объект сообщают, когда они - ненуль:

Эта функция может также использоваться, чтобы исследовать примитивные (необъектные) значения. О примитивном значении массива или Строки сообщают после того, как объект посетили; об этом сообщают, вызывая агент предоставленная функция обратного вызова jvmtiArrayPrimitiveValueCallback или jvmtiStringPrimitiveValueCallback. О примитивном поле сообщают после того, как объект с тем полем посещают; об этом сообщают, вызывая агент предоставленная функция обратного вызова jvmtiPrimitiveFieldCallback.

Обеспечивается ли обратный вызов или NULL только определяет, будет ли обратный вызов вызван, он не влияет, какие объекты посещают, ни делает он влияет, будут ли другие обратные вызовы вызваны. Однако, флаги управления посещением, возвращенные jvmtiHeapReferenceCallback действительно определите если объекты, на которые ссылается текущий объект как посещающийся. Флаги фильтра "кучи" и klass если, поскольку параметры к этой функции не управляют, какие объекты посещают, но они действительно управляют, о каких объектах и примитивных значениях сообщают обратные вызовы. Например, если единственный обратный вызов, который был установлен, array_primitive_value_callback и klass устанавливается в массив байтов class, тогда только о массивах байта сообщат. Таблица ниже суммирует это:

Объекты средств управления посещают Объекты средств управления сообщили Примитивы средств управления сообщили
Флаги Управления Посещением "Кучи", возвращенные jvmtiHeapReferenceCallback Да Да, так как посещениями управляют Да, так как посещениями управляют
array_primitive_value_callback в callbacks набор Нет Да Нет
heap_filter Нет Да Да
klass Нет Да Да

Во время выполнения этой функции не изменяется состояние "кучи": никакие объекты не выделяются, никакие объекты не собираются "мусор", и состояние объектов (включая сохраненные значения) не изменяется. В результате потоки, выполняющие код языка программирования Java, потоки, пытающиеся возобновлять выполнение кода языка программирования Java, и потоки, пытающиеся выполнить функции JNI, обычно останавливаются.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1151.1

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_tag_objects Может установить и получить теги, как описано в категории "Кучи".

Параметры
Имя Ввести Описание
heap_filterjint Этот битовый вектор "кучи" фильтрует флаги. ограничивает объекты, для которых вызывают функцию обратного вызова. Это применяется к и объектным и примитивным обратным вызовам.
klass jclass Об обратных вызовах только сообщают, когда объект является экземпляром этого class. Объекты, которые являются экземплярами подкласса klass не сообщаются. Если klass интерфейс, ни о каких объектах не сообщают. Это применяется к и объектным и примитивным обратным вызовам.

Если klass NULL, обратные вызовы не ограничиваются экземплярами определенного class.
initial_object jobject Объект следовать

Если initial_object NULL, ссылки сопровождаются от корней "кучи".
callbacksconst jvmtiHeapCallbacks * Структура, определяющая набор функций обратного вызова.

Агент передает в указателе на jvmtiHeapCallbacks.
user_dataconst void * Пользователь данные, которыми снабжают, которые передадут к обратному вызову.

Агент передает в указателе. Если user_data NULL, NULL передается как пользователь данные, которыми снабжают.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_tag_objects. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_CLASS klass не допустимый class.
JVMTI_ERROR_INVALID_OBJECT initial_object не допустимый объект.
JVMTI_ERROR_NULL_POINTER callbacks NULL.

Выполните итерации Через "Кучу"

jvmtiError
IterateThroughHeap(jvmtiEnv* env,
            jint heap_filter,
            jclass klass,
            const jvmtiHeapCallbacks* callbacks,
            const void* user_data)
Инициируйте итерацию по всем объектам в "куче". Это включает и достижимые и недостижимые объекты. Объекты посещают без определенного порядка.

Об объектах "кучи" сообщают, вызывая агент предоставленная функция обратного вызова jvmtiHeapIterationCallback. О ссылках между объектами не сообщают. Если только достижимые объекты требуются, или если информация о ссылке на объект необходима, использовать FollowReferences.

Эта функция может также использоваться, чтобы исследовать примитивные (необъектные) значения. О примитивном значении массива или Строки сообщают после того, как объект посетили; об этом сообщают, вызывая агент предоставленная функция обратного вызова jvmtiArrayPrimitiveValueCallback или jvmtiStringPrimitiveValueCallback. О примитивном поле сообщают после того, как объект с тем полем посещают; об этом сообщают, вызывая агент предоставленная функция обратного вызова jvmtiPrimitiveFieldCallback.

Если итерация не прерывается Флагами Управления Посещением "Кучи", возвращенными обратным вызовом, все объекты в "куче" посещают. Обеспечивается ли обратный вызов или NULL только определяет, будет ли обратный вызов вызван, он не влияет, какие объекты посещают, ни делает он влияет, будут ли другие обратные вызовы вызваны. Флаги фильтра "кучи" и klass если, поскольку параметры к этой функции не управляют, какие объекты посещают, но они действительно управляют, о каких объектах и примитивных значениях сообщают обратные вызовы. Например, если единственный обратный вызов, который был установлен, array_primitive_value_callback и klass устанавливается в массив байтов class, тогда только о массивах байта сообщат. Таблица ниже суммирует, это (противопоставьте это с FollowReferences):

Объекты средств управления посещают Объекты средств управления сообщили Примитивы средств управления сообщили
Флаги Управления Посещением "Кучи", возвращенные jvmtiHeapIterationCallback Нет
(если они не прерывают итерацию),
Нет
(если они не прерывают итерацию),
Нет
(если они не прерывают итерацию),
array_primitive_value_callback в callbacks набор Нет Да Нет
heap_filter Нет Да Да
klass Нет Да Да

Во время выполнения этой функции не изменяется состояние "кучи": никакие объекты не выделяются, никакие объекты не собираются "мусор", и состояние объектов (включая сохраненные значения) не изменяется. В результате потоки, выполняющие код языка программирования Java, потоки, пытающиеся возобновлять выполнение кода языка программирования Java, и потоки, пытающиеся выполнить функции JNI, обычно останавливаются.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1161.1

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_tag_objects Может установить и получить теги, как описано в категории "Кучи".

Параметры
Имя Ввести Описание
heap_filterjint Этот битовый вектор "кучи" фильтрует флаги. ограничивает объекты, для которых вызывают функцию обратного вызова. Это применяется к и объектным и примитивным обратным вызовам.
klass jclass Об обратных вызовах только сообщают, когда объект является экземпляром этого class. Объекты, которые являются экземплярами подкласса klass не сообщаются. Если klass интерфейс, ни о каких объектах не сообщают. Это применяется к и объектным и примитивным обратным вызовам.

Если klass NULL, обратные вызовы не ограничиваются экземплярами определенного class.
callbacksconst jvmtiHeapCallbacks * Структура, определяющая функции обратного вызова набора.

Агент передает в указателе на jvmtiHeapCallbacks.
user_dataconst void * Пользователь данные, которыми снабжают, которые передадут к обратному вызову.

Агент передает в указателе. Если user_data NULL, NULL передается как пользователь данные, которыми снабжают.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_tag_objects. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_CLASS klass не допустимый class.
JVMTI_ERROR_NULL_POINTER callbacks NULL.

Получите Тег

jvmtiError
GetTag(jvmtiEnv* env,
            jobject object,
            jlong* tag_ptr)
Получите тег, связанный с объектом. Тег является длинным значением, обычно используемым, чтобы сохранить уникальный идентификатор или указатель, чтобы возразить информации. Тег устанавливается с SetTag. Объекты, для которых не были установлены никакие теги, возвращают значение тега нуля.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 1061.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_tag_objects Может установить и получить теги, как описано в категории "Кучи".

Параметры
Имя Ввести Описание
objectjobject Объект, тег которого должен быть получен.
tag_ptrjlong* По возврату длинное, на которое ссылаются, устанавливается в значение тега.

Агент передает указатель на a jlong. По возврату, jlong был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_tag_objects. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_OBJECT object не объект.
JVMTI_ERROR_NULL_POINTER tag_ptr NULL.

Тег набора

jvmtiError
SetTag(jvmtiEnv* env,
            jobject object,
            jlong tag)
Установите тег, связанный с объектом. Тег является длинным значением, обычно используемым, чтобы сохранить уникальный идентификатор или указатель, чтобы возразить информации. Тег видим с GetTag.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 1071.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_tag_objects Может установить и получить теги, как описано в категории "Кучи".

Параметры
Имя Ввести Описание
objectjobject Объект, тег которого должен быть установлен.
tagjlong Новое значение тега.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_tag_objects. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_OBJECT object не объект.

Получите Объекты С Тегами

jvmtiError
GetObjectsWithTags(jvmtiEnv* env,
            jint tag_count,
            const jlong* tags,
            jint* count_ptr,
            jobject** object_result_ptr,
            jlong** tag_result_ptr)
Возвратите объекты в "куче" с указанными тегами. Формат является параллельными массивами объектов и тегов.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1141.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_tag_objects Может установить и получить теги, как описано в категории "Кучи".

Параметры
Имя Ввести Описание
tag_countjint Число тегов, чтобы отсканировать для.
tagsconst jlong * Сканирование для объектов с этими тегами. Нуль не разрешается в этом массиве.

Агент передает в массиве tag_count элементы jlong.
count_ptr jint * Возвратите число объектов с любым из тегов в tags.

Агент передает указатель на a jint. По возврату, jint был установлен.
object_result_ptr jobject ** Возвращает массив объектов с любым из тегов в tags.

Агент передает указатель на a jobject*. По возврату, jobject* точки недавно выделенному массиву размера *count_ptr. Массив должен быть освобожден с Deallocate. Если object_result_ptr NULL, эта информация не возвращается. Объекты, возвращенные object_result_ptr JNI локальные ссылки и должен управляться.
tag_result_ptr jlong ** Для каждого объекта в object_result_ptr, возвратитесь тег при соответствии индексируют.

Агент передает указатель на a jlong*. По возврату, jlong* точки недавно выделенному массиву размера *count_ptr. Массив должен быть освобожден с Deallocate. Если tag_result_ptr NULL, эта информация не возвращается.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_tag_objects. Использовать AddCapabilities.
JVMTI_ERROR_ILLEGAL_ARGUMENT Нуль присутствует в tags.
JVMTI_ERROR_ILLEGAL_ARGUMENT tag_count меньше чем 0.
JVMTI_ERROR_NULL_POINTER tags NULL.
JVMTI_ERROR_NULL_POINTER count_ptr NULL.

Вызовите Сборку "мусора"

jvmtiError
ForceGarbageCollection(jvmtiEnv* env)
Вынудите VM выполнить сборку "мусора". Сборка "мусора" столь же полна насколько возможно. Эта функция не заставляет финализаторы быть выполненными. Эта функция не возвращается, пока сборка "мусора" не заканчивается.

Хотя сборка "мусора" столь же полна насколько возможно нет никакой гарантии что все ObjectFree события будут отправлены к тому времени, когда эта функция возвращается. В частности объекту можно препятствовать быть освобожденным, потому что он ждет завершения.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1081.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание

Ошибки
Эта функция возвращает универсальную ошибку


"Куча" (1.0)

"Куча" (1.0) функции: "Куча" (1.0) функциональные типы: "Куча" (1.0) типы: Эти функции и типы данных были представлены в исходной JVM  мощные и гибкие версии который:

Пожалуйста, используйте текущие функции "Кучи".

Объект "кучи" Фильтрует Перечисление (jvmtiHeapObjectFilter)
Постоянный Значение Описание
JVMTI_HEAP_OBJECT_TAGGED1 Теговые объекты только.
JVMTI_HEAP_OBJECT_UNTAGGED2 Нетеговые объекты только.
JVMTI_HEAP_OBJECT_EITHER3 Или теговые или нетеговые объекты.
Корень "кучи" Доброе Перечисление (jvmtiHeapRootKind)
Постоянный Значение Описание
JVMTI_HEAP_ROOT_JNI_GLOBAL1 Глобальная ссылка JNI.
JVMTI_HEAP_ROOT_SYSTEM_CLASS2 Система class.
JVMTI_HEAP_ROOT_MONITOR3 Монитор.
JVMTI_HEAP_ROOT_STACK_LOCAL4 Локальный стек.
JVMTI_HEAP_ROOT_JNI_LOCAL5 JNI локальная ссылка.
JVMTI_HEAP_ROOT_THREAD6 Поток.
JVMTI_HEAP_ROOT_OTHER7 Другой.
Перечисление Ссылки на объект (jvmtiObjectReferenceKind)
Постоянный Значение Описание
JVMTI_REFERENCE_CLASS1 Ссылка от объекта до его class.
JVMTI_REFERENCE_FIELD2 Ссылка от объекта до значения одного из его полей экземпляра. Для ссылок этого вида referrer_index параметр к jvmtiObjectReferenceCallback является индексированием поле экземпляра. Индексирование основано на порядке полей всего объекта. Это включает все поля непосредственно объявленных статических и полей экземпляра в class, и включает все поля (и общественные и частные) поля, объявленные в суперклассах и суперинтерфейсах. Индексирование таким образом вычисляется, суммируя индексирование поля в непосредственно объявленном class (см. GetClassFields), с общим количеством полей (и общественных и частных) объявленный во всех суперклассах и суперинтерфейсах. Индексирование запускается в нуле.
JVMTI_REFERENCE_ARRAY_ELEMENT3 Ссылка от массива к одному из его элементов. Для ссылок этого вида referrer_index параметр к jvmtiObjectReferenceCallback является массивом, индексируют.
JVMTI_REFERENCE_CLASS_LOADER4 Ссылка от class до его загрузчика class.
JVMTI_REFERENCE_SIGNERS5 Ссылка от class до его массива подписывающих лиц.
JVMTI_REFERENCE_PROTECTION_DOMAIN6 Ссылка от class до его домена защиты.
JVMTI_REFERENCE_INTERFACE7 Ссылка от class до одного из его интерфейсов.
JVMTI_REFERENCE_STATIC_FIELD8 Ссылка от class до значения одного из его статических полей. Для ссылок этого вида referrer_index параметр к jvmtiObjectReferenceCallback является индексированием статическое поле. Индексирование основано на порядке полей всего объекта. Это включает все поля непосредственно объявленных статических и полей экземпляра в class, и включает все поля (и общественные и частные) поля, объявленные в суперклассах и суперинтерфейсах. Индексирование таким образом вычисляется, суммируя индексирование поля в непосредственно объявленном class (см. GetClassFields), с общим количеством полей (и общественных и частных) объявленный во всех суперклассах и суперинтерфейсах. Индексирование запускается в нуле. Отметьте: это определение отличается от этого в JVM 

Объяснение: Никакие известные реализации, используемые 1.0 определения.

JVMTI_REFERENCE_CONSTANT_POOL9 Ссылка от class до разрешенной записи в постоянном пуле. Для ссылок этого вида referrer_index параметр к jvmtiObjectReferenceCallback является индексированием в постоянный бильярдный стол для пула class, запускающегося в 1. См. Спецификацию Виртуальной машины Java™, Главу 4.4.
Итеративное Перечисление Управления (jvmtiIterationControl)
Постоянный Значение Описание
JVMTI_ITERATION_CONTINUE1 Продолжайте итерацию. Если это - ссылочная итерация, следуйте за ссылками этого объекта.
JVMTI_ITERATION_IGNORE2 Продолжайте итерацию. Если это - ссылочная итерация, проигнорируйте ссылки этого объекта.
JVMTI_ITERATION_ABORT0 Прервите итерацию.


Обратный вызов Объекта "кучи"

typedef jvmtiIterationControl (JNICALL *jvmtiHeapObjectCallback)
    (jlong class_tag, 
     jlong size, 
     jlong* tag_ptr, 
     void* user_data);
Агент предоставленная функция обратного вызова. Описывает (но не передает в), объект в "куче".

Возвращаемое значение должно быть JVMTI_ITERATION_CONTINUE продолжать итерацию, или JVMTI_ITERATION_ABORT остановить итерацию.

См. ограничения функции обратного вызова "кучи".

Параметры
Имя Ввести Описание
class_tagjlong Тег class объекта (обнуляют, если class не тегируется). Если объект представляет время выполнения class, class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
sizejlong Размер объекта (в байтах). См. GetObjectSize.
tag_ptrjlong* Объектное значение тега, или нуль, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
user_datavoid* Данные пользователя, которыми снабжают, которые передали в итеративную функцию.

Корень "кучи" Возражает Обратному вызову

typedef jvmtiIterationControl (JNICALL *jvmtiHeapRootCallback)
    (jvmtiHeapRootKind root_kind, 
     jlong class_tag, 
     jlong size, 
     jlong* tag_ptr, 
     void* user_data);
Агент предоставленная функция обратного вызова. Описывает (но не передает в), объект, который является корнем в целях сборки "мусора".

Возвращаемое значение должно быть JVMTI_ITERATION_CONTINUE продолжать итерацию, JVMTI_ITERATION_IGNORE чтобы продолжать итерацию, не преследуя ссылки от referree возражают или JVMTI_ITERATION_ABORT остановить итерацию.

См. ограничения функции обратного вызова "кучи".

Параметры
Имя Ввести Описание
root_kindjvmtiHeapRootKind Вид корня "кучи".
class_tagjlong Тег class объекта (обнуляют, если class не тегируется). Если объект представляет время выполнения class, class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
sizejlong Размер объекта (в байтах). См. GetObjectSize.
tag_ptrjlong* Объектное значение тега, или нуль, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
user_datavoid* Данные пользователя, которыми снабжают, которые передали в итеративную функцию.

Ссылочный Обратный вызов Объекта стека

typedef jvmtiIterationControl (JNICALL *jvmtiStackReferenceCallback)
    (jvmtiHeapRootKind root_kind, 
     jlong class_tag, 
     jlong size, 
     jlong* tag_ptr, 
     jlong thread_tag, 
     jint depth, 
     jmethodID method, 
     jint slot, 
     void* user_data);
Агент предоставленная функция обратного вызова. Описывает (но не передает в), объект на стеке, который является корнем в целях сборки "мусора".

Возвращаемое значение должно быть JVMTI_ITERATION_CONTINUE продолжать итерацию, JVMTI_ITERATION_IGNORE чтобы продолжать итерацию, не преследуя ссылки от referree возражают или JVMTI_ITERATION_ABORT остановить итерацию.

См. ограничения функции обратного вызова "кучи".

Параметры
Имя Ввести Описание
root_kindjvmtiHeapRootKind Вид корня (также JVMTI_HEAP_ROOT_STACK_LOCAL или JVMTI_HEAP_ROOT_JNI_LOCAL).
class_tagjlong Тег class объекта (обнуляют, если class не тегируется). Если объект представляет время выполнения class, class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
sizejlong Размер объекта (в байтах). См. GetObjectSize.
tag_ptrjlong* Объектное значение тега, или нуль, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
thread_tagjlong Тег потока, соответствующего этому стеку, обнулите если не теговый.
depthjint Глубина фрейма.
methodjmethodID Метод, выполняющийся в этом фрейме.
slotjint Число слота.
user_datavoid* Данные пользователя, которыми снабжают, которые передали в итеративную функцию.

Обратный вызов Ссылки на объект

typedef jvmtiIterationControl (JNICALL *jvmtiObjectReferenceCallback)
    (jvmtiObjectReferenceKind reference_kind, 
     jlong class_tag, 
     jlong size, 
     jlong* tag_ptr, 
     jlong referrer_tag, 
     jint referrer_index, 
     void* user_data);
Агент предоставленная функция обратного вызова. Описывает ссылку от объекта (referrer) к другому объекту (referree).

Возвращаемое значение должно быть JVMTI_ITERATION_CONTINUE продолжать итерацию, JVMTI_ITERATION_IGNORE чтобы продолжать итерацию, не преследуя ссылки от referree возражают или JVMTI_ITERATION_ABORT остановить итерацию.

См. ограничения функции обратного вызова "кучи".

Параметры
Имя Ввести Описание
reference_kindjvmtiObjectReferenceKind Тип ссылки.
class_tagjlong Тег class объекта referree (обнуляют, если class не тегируется). Если объект referree представляет время выполнения class, class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
sizejlong Размер объекта referree (в байтах). См. GetObjectSize.
tag_ptrjlong* referree возражают значению тега, или нулю, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
referrer_tagjlong Тег объекта referrer, или нуль, если объект referrer не тегируется.
referrer_indexjint Для ссылок типа JVMTI_REFERENCE_FIELD или JVMTI_REFERENCE_STATIC_FIELD индексирование поля в объекте referrer. Индексирование основано на порядке полей всего объекта - см. JVMTI_REFERENCE_FIELD или JVMTI_REFERENCE_STATIC_FIELD для дальнейшего описания.

Для ссылок типа JVMTI_REFERENCE_ARRAY_ELEMENT массив индексирует - см. JVMTI_REFERENCE_ARRAY_ELEMENT для дальнейшего описания.

Для ссылок типа JVMTI_REFERENCE_CONSTANT_POOL индексирование в постоянный пул class - видит JVMTI_REFERENCE_CONSTANT_POOL для дальнейшего описания.

Для ссылок других видов referrer_index -1.
user_datavoid* Данные пользователя, которыми снабжают, которые передали в итеративную функцию.

Выполните итерации По Объектам, Достижимым От Объекта

jvmtiError
IterateOverObjectsReachableFromObject(jvmtiEnv* env,
            jobject object,
            jvmtiObjectReferenceCallback object_reference_callback,
            const void* user_data)
Эта функция выполняет итерации по всем объектам, которые являются непосредственно и косвенно достижимы от указанного объекта. Для каждого объекта (известный как referrer) со ссылкой, чтобы возразить B указанную функцию обратного вызова вызывают, чтобы описать ссылку на объект. Однажды обратный вызов вызывают точно для каждой ссылки от referrer; это - истина, даже если есть ссылочные циклы или разнообразные пути к referrer. Может быть больше чем одна ссылка между referrer и referree, Их можно отличить jvmtiObjectReferenceCallback.reference_kind и jvmtiObjectReferenceCallback.referrer_index. Обратный вызов для объекта будет всегда происходить после обратного вызова для его referrer.

См. FollowReferences для ссылок на объект, о которых сообщают.

Во время выполнения этой функции не изменяется состояние "кучи": никакие объекты не выделяются, никакие объекты не собираются "мусор", и состояние объектов (включая сохраненные значения) не изменяется. В результате потоки, выполняющие код языка программирования Java, потоки, пытающиеся возобновлять выполнение кода языка программирования Java, и потоки, пытающиеся выполнить функции JNI, обычно останавливаются.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1091.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_tag_objects Может установить и получить теги, как описано в категории "Кучи".

Параметры
Имя Ввести Описание
objectjobject Объект
object_reference_callback jvmtiObjectReferenceCallback Обратный вызов, который вызовут, чтобы описать каждую ссылку на объект.

user_dataconst void * Пользователь данные, которыми снабжают, которые передадут к обратному вызову.

Агент передает в указателе. Если user_data NULL, NULL передается как пользователь данные, которыми снабжают.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_tag_objects. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_OBJECT object не объект.
JVMTI_ERROR_NULL_POINTER object_reference_callback NULL.

Выполните итерации По Достижимым Объектам

jvmtiError
IterateOverReachableObjects(jvmtiEnv* env,
            jvmtiHeapRootCallback heap_root_callback,
            jvmtiStackReferenceCallback stack_ref_callback,
            jvmtiObjectReferenceCallback object_ref_callback,
            const void* user_data)
Эта функция выполняет итерации по корневым объектам и всем объектам, которые являются непосредственно и косвенно достижимы от корневых объектов. Корневые объекты включают набор системных классов, глобальных переменных JNI, ссылок от стеков потока, и других объектов, используемых, как поддерживает цели сборки "мусора".

Для каждого корня heap_root_callback или stack_ref_callback обратный вызов вызывают. Объект может быть корневым объектом больше чем по одной причине, и в этом случае соответствующий обратный вызов вызывают по каждой причине.

Для каждой ссылки на объект object_ref_callback функцию обратного вызова вызывают, чтобы описать ссылку на объект. Однажды обратный вызов вызывают точно для каждой ссылки от referrer; это - истина, даже если есть ссылочные циклы или разнообразные пути к referrer. Может быть больше чем одна ссылка между referrer и referree, Их можно отличить jvmtiObjectReferenceCallback.reference_kind и jvmtiObjectReferenceCallback.referrer_index. Обратный вызов для объекта будет всегда происходить после обратного вызова для его referrer.

См. FollowReferences для ссылок на объект, о которых сообщают.

О корнях всегда сообщают профилировщику прежде, чем о любых ссылках на объект сообщат. Другими словами, object_ref_callback обратный вызов не вызовут, пока соответствующий обратный вызов не вызвали для всех корней. Если object_ref_callback обратный вызов определяется как NULL тогда эта функция возвраты после создания отчетов о корне возражает против профилировщика.

Во время выполнения этой функции не изменяется состояние "кучи": никакие объекты не выделяются, никакие объекты не собираются "мусор", и состояние объектов (включая сохраненные значения) не изменяется. В результате потоки, выполняющие код языка программирования Java, потоки, пытающиеся возобновлять выполнение кода языка программирования Java, и потоки, пытающиеся выполнить функции JNI, обычно останавливаются.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1101.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_tag_objects Может установить и получить теги, как описано в категории "Кучи".

Параметры
Имя Ввести Описание
heap_root_callback jvmtiHeapRootCallback Функция обратного вызова, которую вызовут для каждого корня "кучи" типа JVMTI_HEAP_ROOT_JNI_GLOBAL, JVMTI_HEAP_ROOT_SYSTEM_CLASS, JVMTI_HEAP_ROOT_MONITOR, JVMTI_HEAP_ROOT_THREAD, или JVMTI_HEAP_ROOT_OTHER.

Если heap_root_callback NULL, не сообщайте о корнях "кучи".
stack_ref_callback jvmtiStackReferenceCallback Функция обратного вызова, которую вызовут для каждого корня "кучи" JVMTI_HEAP_ROOT_STACK_LOCAL или JVMTI_HEAP_ROOT_JNI_LOCAL.

Если stack_ref_callback NULL, не сообщайте о ссылках стека.
object_ref_callback jvmtiObjectReferenceCallback Функция обратного вызова, которую вызовут для каждой ссылки на объект.

Если object_ref_callback NULL, не следуйте за ссылками от корневых объектов.
user_dataconst void * Пользователь данные, которыми снабжают, которые передадут к обратному вызову.

Агент передает в указателе. Если user_data NULL, NULL передается как пользователь данные, которыми снабжают.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_tag_objects. Использовать AddCapabilities.

Выполните итерации По "Куче"

jvmtiError
IterateOverHeap(jvmtiEnv* env,
            jvmtiHeapObjectFilter object_filter,
            jvmtiHeapObjectCallback heap_object_callback,
            const void* user_data)
Выполните итерации по всем объектам в "куче". Это включает и достижимые и недостижимые объекты.

object_filter параметр указывает на объекты, для которых вызывают функцию обратного вызова. Если этот параметр JVMTI_HEAP_OBJECT_TAGGED тогда обратный вызов только вызовут для каждого объекта, который тегируется. Если параметр JVMTI_HEAP_OBJECT_UNTAGGED тогда обратный вызов только будет для объектов, которые не тегируются. Если параметр JVMTI_HEAP_OBJECT_EITHER тогда обратный вызов вызовут для каждого объекта в "куче", независимо от того, тегируется ли это или нет.

Во время выполнения этой функции не изменяется состояние "кучи": никакие объекты не выделяются, никакие объекты не собираются "мусор", и состояние объектов (включая сохраненные значения) не изменяется. В результате потоки, выполняющие код языка программирования Java, потоки, пытающиеся возобновлять выполнение кода языка программирования Java, и потоки, пытающиеся выполнить функции JNI, обычно останавливаются.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1111.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_tag_objects Может установить и получить теги, как описано в категории "Кучи".

Параметры
Имя Ввести Описание
object_filterjvmtiHeapObjectFilter Указывает на объекты, для которых вызывают функцию обратного вызова.
heap_object_callback jvmtiHeapObjectCallback iterator функционируют, чтобы быть вызванными для каждого объекта, соответствующего object_filter.

user_dataconst void * Пользователь данные, которыми снабжают, которые передадут к обратному вызову.

Агент передает в указателе. Если user_data NULL, NULL передается как пользователь данные, которыми снабжают.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_tag_objects. Использовать AddCapabilities.
JVMTI_ERROR_ILLEGAL_ARGUMENT object_filter не jvmtiHeapObjectFilter.
JVMTI_ERROR_NULL_POINTER heap_object_callback NULL.

Выполните итерации По Экземплярам Класса

jvmtiError
IterateOverInstancesOfClass(jvmtiEnv* env,
            jclass klass,
            jvmtiHeapObjectFilter object_filter,
            jvmtiHeapObjectCallback heap_object_callback,
            const void* user_data)
Выполните итерации по всем объектам в "куче", которые являются экземплярами указанного class. Это включает прямые экземпляры указанного class и экземпляры всех подклассов указанного class. Это включает и достижимые и недостижимые объекты.

object_filter параметр указывает на объекты, для которых вызывают функцию обратного вызова. Если этот параметр JVMTI_HEAP_OBJECT_TAGGED тогда обратный вызов только вызовут для каждого объекта, который тегируется. Если параметр JVMTI_HEAP_OBJECT_UNTAGGED тогда обратный вызов только вызовут для объектов, которые не тегируются. Если параметр JVMTI_HEAP_OBJECT_EITHER тогда обратный вызов вызовут для каждого объекта в "куче", независимо от того, тегируется ли это или нет.

Во время выполнения этой функции не изменяется состояние "кучи": никакие объекты не выделяются, никакие объекты не собираются "мусор", и состояние объектов (включая сохраненные значения) не изменяется. В результате потоки, выполняющие код языка программирования Java, потоки, пытающиеся возобновлять выполнение кода языка программирования Java, и потоки, пытающиеся выполнить функции JNI, обычно останавливаются.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1121.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_tag_objects Может установить и получить теги, как описано в категории "Кучи".

Параметры
Имя Ввести Описание
klassjclass Выполните итерации по объектам этого class только.
object_filterjvmtiHeapObjectFilter Указывает на объекты, для которых вызывают функцию обратного вызова.
heap_object_callback jvmtiHeapObjectCallback iterator функционируют, чтобы быть вызванными для каждого klass экземпляр, соответствующий object_filter.

user_dataconst void * Пользователь данные, которыми снабжают, которые передадут к обратному вызову.

Агент передает в указателе. Если user_data NULL, NULL передается как пользователь данные, которыми снабжают.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_tag_objects. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_ILLEGAL_ARGUMENT object_filter не jvmtiHeapObjectFilter.
JVMTI_ERROR_NULL_POINTER heap_object_callback NULL.


Локальная переменная

Функции Локальной переменной: Эти функции используются, чтобы получить или установить значение локальной переменной. Переменная идентифицируется глубиной фрейма, содержащего его значение и число слота переменной в пределах того фрейма. Отображение переменных к числам слота может быть получено с функцией GetLocalVariableTable.


Получите Локальную переменную - Объект

jvmtiError
GetLocalObject(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jobject* value_ptr)
Эта функция может использоваться, чтобы получить значение локальной переменной, тип которой Object или подкласс Object.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 211.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_access_local_variables Может установить и получить локальные переменные

Параметры
Имя Ввести Описание
threadjthread Поток фрейма, содержащего значение переменной. Если thread NULL, текущий поток используется.
depthjint Глубина фрейма, содержащего значение переменной.
slotjint Число слота переменной.
value_ptrjobject* По возврату, точкам к значению переменной.

Агент передает указатель на a jobject. По возврату, jobject был установлен. Объект, возвращенный value_ptr JNI локальная ссылка и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_access_local_variables. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_SLOT Недопустимый slot.
JVMTI_ERROR_TYPE_MISMATCH Тип переменной не Object или подкласс Object.
JVMTI_ERROR_OPAQUE_FRAME Не видимый фрейм
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth меньше чем нуль.
JVMTI_ERROR_NO_MORE_FRAMES Нет никаких стековых фреймов в указанном depth.
JVMTI_ERROR_NULL_POINTER value_ptr NULL.

Получите Локальный Экземпляр

jvmtiError
GetLocalInstance(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jobject* value_ptr)
Эта функция может использоваться, чтобы получить значение локальной переменной объекта в слоте 0 ("this"объект) от нестатических фреймов. Эта функция может получить"this"объект от собственных фреймов метода, тогда как GetLocalObject() возвратился бы JVMTI_ERROR_OPAQUE_FRAME в тех случаях.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1551.2

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_access_local_variables Может установить и получить локальные переменные

Параметры
Имя Ввести Описание
threadjthread Поток фрейма, содержащего значение переменной. Если thread NULL, текущий поток используется.
depthjint Глубина фрейма, содержащего значение переменной.
value_ptrjobject* По возврату, точкам к значению переменной.

Агент передает указатель на a jobject. По возврату, jobject был установлен. Объект, возвращенный value_ptr JNI локальная ссылка и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_access_local_variables. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_SLOT Если указанный фрейм является статическим фреймом метода.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth меньше чем нуль.
JVMTI_ERROR_NO_MORE_FRAMES Нет никаких стековых фреймов в указанном depth.
JVMTI_ERROR_NULL_POINTER value_ptr NULL.

Получите Локальную переменную - Интервал

jvmtiError
GetLocalInt(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jint* value_ptr)
Эта функция может использоваться, чтобы получить значение локальной переменной, тип которой int, short, char, byte, или boolean.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 221.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_access_local_variables Может установить и получить локальные переменные

Параметры
Имя Ввести Описание
threadjthread Поток фрейма, содержащего значение переменной. Если thread NULL, текущий поток используется.
depthjint Глубина фрейма, содержащего значение переменной.
slotjint Число слота переменной.
value_ptrjint* По возврату, точкам к значению переменной.

Агент передает указатель на a jint. По возврату, jint был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_access_local_variables. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_SLOT Недопустимый slot.
JVMTI_ERROR_TYPE_MISMATCH Тип переменной не int, short, char, byte, или boolean.
JVMTI_ERROR_OPAQUE_FRAME Не видимый фрейм
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth меньше чем нуль.
JVMTI_ERROR_NO_MORE_FRAMES Нет никаких стековых фреймов в указанном depth.
JVMTI_ERROR_NULL_POINTER value_ptr NULL.

Получите Локальную переменную - Долго

jvmtiError
GetLocalLong(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jlong* value_ptr)
Эта функция может использоваться, чтобы получить значение локальной переменной, тип которой long.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 231.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_access_local_variables Может установить и получить локальные переменные

Параметры
Имя Ввести Описание
threadjthread Поток фрейма, содержащего значение переменной. Если thread NULL, текущий поток используется.
depthjint Глубина фрейма, содержащего значение переменной.
slotjint Число слота переменной.
value_ptrjlong* По возврату, точкам к значению переменной.

Агент передает указатель на a jlong. По возврату, jlong был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_access_local_variables. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_SLOT Недопустимый slot.
JVMTI_ERROR_TYPE_MISMATCH Тип переменной не long.
JVMTI_ERROR_OPAQUE_FRAME Не видимый фрейм
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth меньше чем нуль.
JVMTI_ERROR_NO_MORE_FRAMES Нет никаких стековых фреймов в указанном depth.
JVMTI_ERROR_NULL_POINTER value_ptr NULL.

Получите Локальную переменную - Плавание

jvmtiError
GetLocalFloat(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jfloat* value_ptr)
Эта функция может использоваться, чтобы получить значение локальной переменной, тип которой float.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 241.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_access_local_variables Может установить и получить локальные переменные

Параметры
Имя Ввести Описание
threadjthread Поток фрейма, содержащего значение переменной. Если thread NULL, текущий поток используется.
depthjint Глубина фрейма, содержащего значение переменной.
slotjint Число слота переменной.
value_ptrjfloat* По возврату, точкам к значению переменной.

Агент передает указатель на a jfloat. По возврату, jfloat был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_access_local_variables. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_SLOT Недопустимый slot.
JVMTI_ERROR_TYPE_MISMATCH Тип переменной не float.
JVMTI_ERROR_OPAQUE_FRAME Не видимый фрейм
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth меньше чем нуль.
JVMTI_ERROR_NO_MORE_FRAMES Нет никаких стековых фреймов в указанном depth.
JVMTI_ERROR_NULL_POINTER value_ptr NULL.

Получите Локальную переменную - Двойной

jvmtiError
GetLocalDouble(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jdouble* value_ptr)
Эта функция может использоваться, чтобы получить значение локальной переменной, тип которой long.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 251.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_access_local_variables Может установить и получить локальные переменные

Параметры
Имя Ввести Описание
threadjthread Поток фрейма, содержащего значение переменной. Если thread NULL, текущий поток используется.
depthjint Глубина фрейма, содержащего значение переменной.
slotjint Число слота переменной.
value_ptrjdouble* По возврату, точкам к значению переменной.

Агент передает указатель на a jdouble. По возврату, jdouble был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_access_local_variables. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_SLOT Недопустимый slot.
JVMTI_ERROR_TYPE_MISMATCH Тип переменной не double.
JVMTI_ERROR_OPAQUE_FRAME Не видимый фрейм
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth меньше чем нуль.
JVMTI_ERROR_NO_MORE_FRAMES Нет никаких стековых фреймов в указанном depth.
JVMTI_ERROR_NULL_POINTER value_ptr NULL.

Установите Локальную переменную - Объект

jvmtiError
SetLocalObject(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jobject value)
Эта функция может использоваться, чтобы установить значение локальной переменной, тип которой Object или подкласс Object.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 261.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_access_local_variables Может установить и получить локальные переменные

Параметры
Имя Ввести Описание
threadjthread Поток фрейма, содержащего значение переменной. Если thread NULL, текущий поток используется.
depthjint Глубина фрейма, содержащего значение переменной.
slotjint Число слота переменной.
valuejobject Новое значение для переменной.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_access_local_variables. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_SLOT Недопустимый slot.
JVMTI_ERROR_TYPE_MISMATCH Тип переменной не Object или подкласс Object.
JVMTI_ERROR_TYPE_MISMATCH Предоставленный value не является совместимым с типом переменной.
JVMTI_ERROR_OPAQUE_FRAME Не видимый фрейм
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth меньше чем нуль.
JVMTI_ERROR_NO_MORE_FRAMES Нет никаких стековых фреймов в указанном depth.
JVMTI_ERROR_INVALID_OBJECT value не объект.

Установите Локальную переменную - Интервал

jvmtiError
SetLocalInt(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jint value)
Эта функция может использоваться, чтобы установить значение локальной переменной, тип которой int, short, char, byte, или boolean.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 271.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_access_local_variables Может установить и получить локальные переменные

Параметры
Имя Ввести Описание
threadjthread Поток фрейма, содержащего значение переменной. Если thread NULL, текущий поток используется.
depthjint Глубина фрейма, содержащего значение переменной.
slotjint Число слота переменной.
valuejint Новое значение для переменной.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_access_local_variables. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_SLOT Недопустимый slot.
JVMTI_ERROR_TYPE_MISMATCH Тип переменной не int, short, char, byte, или boolean.
JVMTI_ERROR_OPAQUE_FRAME Не видимый фрейм
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth меньше чем нуль.
JVMTI_ERROR_NO_MORE_FRAMES Нет никаких стековых фреймов в указанном depth.

Установите Локальную переменную - Долго

jvmtiError
SetLocalLong(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jlong value)
Эта функция может использоваться, чтобы установить значение локальной переменной, тип которой long.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 281.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_access_local_variables Может установить и получить локальные переменные

Параметры
Имя Ввести Описание
threadjthread Поток фрейма, содержащего значение переменной. Если thread NULL, текущий поток используется.
depthjint Глубина фрейма, содержащего значение переменной.
slotjint Число слота переменной.
valuejlong Новое значение для переменной.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_access_local_variables. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_SLOT Недопустимый slot.
JVMTI_ERROR_TYPE_MISMATCH Тип переменной не long.
JVMTI_ERROR_OPAQUE_FRAME Не видимый фрейм
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth меньше чем нуль.
JVMTI_ERROR_NO_MORE_FRAMES Нет никаких стековых фреймов в указанном depth.

Установите Локальную переменную - Плавание

jvmtiError
SetLocalFloat(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jfloat value)
Эта функция может использоваться, чтобы установить значение локальной переменной, тип которой float.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 291.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_access_local_variables Может установить и получить локальные переменные

Параметры
Имя Ввести Описание
threadjthread Поток фрейма, содержащего значение переменной. Если thread NULL, текущий поток используется.
depthjint Глубина фрейма, содержащего значение переменной.
slotjint Число слота переменной.
valuejfloat Новое значение для переменной.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_access_local_variables. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_SLOT Недопустимый slot.
JVMTI_ERROR_TYPE_MISMATCH Тип переменной не float.
JVMTI_ERROR_OPAQUE_FRAME Не видимый фрейм
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth меньше чем нуль.
JVMTI_ERROR_NO_MORE_FRAMES Нет никаких стековых фреймов в указанном depth.

Установите Локальную переменную - Двойной

jvmtiError
SetLocalDouble(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jdouble value)
Эта функция может использоваться, чтобы установить значение локальной переменной, тип которой double.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 301.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_access_local_variables Может установить и получить локальные переменные

Параметры
Имя Ввести Описание
threadjthread Поток фрейма, содержащего значение переменной. Если thread NULL, текущий поток используется.
depthjint Глубина фрейма, содержащего значение переменной.
slotjint Число слота переменной.
valuejdouble Новое значение для переменной.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_access_local_variables. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_SLOT Недопустимый slot.
JVMTI_ERROR_TYPE_MISMATCH Тип переменной не double.
JVMTI_ERROR_OPAQUE_FRAME Не видимый фрейм
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth меньше чем нуль.
JVMTI_ERROR_NO_MORE_FRAMES Нет никаких стековых фреймов в указанном depth.


Контрольная точка

Функции контрольной точки:


Контрольная точка набора

jvmtiError
SetBreakpoint(jvmtiEnv* env,
            jmethodID method,
            jlocation location)
Установите контрольную точку в инструкции, обозначенной method и location. У инструкции может только быть одна контрольная точка.

Всякий раз, когда определяемая инструкция собирается быть выполненной, a Breakpoint событие сгенерировано.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 381.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_generate_breakpoint_events Может установить и таким образом добраться Breakpoint события

Параметры
Имя Ввести Описание
methodjmethodID Метод, в котором можно установить контрольную точку
locationjlocation индексирование инструкции, в которой можно установить контрольную точку

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_generate_breakpoint_events. Использовать AddCapabilities.
JVMTI_ERROR_DUPLICATE У определяемого байт-кода уже есть контрольная точка.
JVMTI_ERROR_INVALID_METHODID method не jmethodID.
JVMTI_ERROR_INVALID_LOCATION location не допустимое расположение.

Очистите Контрольную точку

jvmtiError
ClearBreakpoint(jvmtiEnv* env,
            jmethodID method,
            jlocation location)
Очистите контрольную точку в байт-коде, обозначенном method и location.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 391.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_generate_breakpoint_events Может установить и таким образом добраться Breakpoint события

Параметры
Имя Ввести Описание
methodjmethodID Метод, в котором можно очистить контрольную точку
locationjlocation индексирование инструкции, в которой можно очистить контрольную точку

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_generate_breakpoint_events. Использовать AddCapabilities.
JVMTI_ERROR_NOT_FOUND Нет никакой контрольной точки в определяемом байт-коде.
JVMTI_ERROR_INVALID_METHODID method не jmethodID.
JVMTI_ERROR_INVALID_LOCATION location не допустимое расположение.


Наблюдаемое Поле

Наблюдаемые Полевые функции:


Установите Часы Доступа к полю

jvmtiError
SetFieldAccessWatch(jvmtiEnv* env,
            jclass klass,
            jfieldID field)
Генерируйте a FieldAccess событие, когда поле, определенное klass и field собирается быть полученным доступ. Событие будет сгенерировано для каждого доступа поля, пока это не будет отменено с ClearFieldAccessWatch. Доступы к полю от кода языка программирования Java или от кода JNI наблюдаются, поля, измененные другими средствами, не наблюдаются. Отметьте ту JVM SetFieldModificationWatch контролировать модификации.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 411.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_generate_field_access_events Может установить контрольные точки на доступе к полю - SetFieldAccessWatch

Параметры
Имя Ввести Описание
klassjclass class, содержащий поле, чтобы смотреть
fieldjfieldID Поле, чтобы смотреть

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_generate_field_access_events. Использовать AddCapabilities.
JVMTI_ERROR_DUPLICATE Определяемое поле уже наблюдается за доступами.
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_INVALID_FIELDID field не jfieldID.

Очистите Часы Доступа к полю

jvmtiError
ClearFieldAccessWatch(jvmtiEnv* env,
            jclass klass,
            jfieldID field)
Отмените часы доступа к полю, ранее установленные SetFieldAccessWatch, на поле, определенном klass и field.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 421.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_generate_field_access_events Может установить контрольные точки на доступе к полю - SetFieldAccessWatch

Параметры
Имя Ввести Описание
klassjclass class, содержащий поле, чтобы смотреть
fieldjfieldID Поле, чтобы смотреть

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_generate_field_access_events. Использовать AddCapabilities.
JVMTI_ERROR_NOT_FOUND Определяемое поле не наблюдается за доступами.
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_INVALID_FIELDID field не jfieldID.

Полевые Часы Модификации набора

jvmtiError
SetFieldModificationWatch(jvmtiEnv* env,
            jclass klass,
            jfieldID field)
Генерируйте a FieldModification событие, когда поле, определенное klass и field собирается быть измененным. Событие будет сгенерировано для каждой модификации поля, пока это не будет отменено с ClearFieldModificationWatch. Полевые модификации от кода языка программирования Java или от кода JNI наблюдаются, поля, измененные другими средствами, не наблюдаются. Отметьте ту JVM 

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 431.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_generate_field_modification_events Может установить контрольные точки на полевой модификации - SetFieldModificationWatch

Параметры
Имя Ввести Описание
klassjclass class, содержащий поле, чтобы смотреть
fieldjfieldID Поле, чтобы смотреть

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_generate_field_modification_events. Использовать AddCapabilities.
JVMTI_ERROR_DUPLICATE Определяемое поле уже наблюдается за модификациями.
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_INVALID_FIELDID field не jfieldID.

Очистите Полевые Часы Модификации

jvmtiError
ClearFieldModificationWatch(jvmtiEnv* env,
            jclass klass,
            jfieldID field)
Отмените полевые часы модификации, ранее установленные SetFieldModificationWatch, на поле, определенном klass и field.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 441.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_generate_field_modification_events Может установить контрольные точки на полевой модификации - SetFieldModificationWatch

Параметры
Имя Ввести Описание
klassjclass class, содержащий поле, чтобы смотреть
fieldjfieldID Поле, чтобы смотреть

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_generate_field_modification_events. Использовать AddCapabilities.
JVMTI_ERROR_NOT_FOUND Определяемое поле не наблюдается за модификациями.
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_INVALID_FIELDID field не jfieldID.


Класс

Функции класса: Типы классов: Флаги класса и константы:


Получите Загруженные Классы

jvmtiError
GetLoadedClasses(jvmtiEnv* env,
            jint* class_count_ptr,
            jclass** classes_ptr)
Возвратите массив всех классов, загруженных в виртуальной машине. Число классов в массиве возвращается через class_count_ptr, и массив непосредственно через classes_ptr.

Классы массива всех типов (включая массивы типов примитивов) включаются в возвращенный список. Примитивные классы (например, java.lang.Integer.TYPE) не включаются в этот список.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 781.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
class_count_ptrjint* По возврату, точкам к числу классов.

Агент передает указатель на a jint. По возврату, jint был установлен.
classes_ptrjclass** По возврату, точкам массиву ссылок, один для каждого class.

Агент передает указатель на a jclass*. По возврату, jclass* точки недавно выделенному массиву размера *class_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные classes_ptr JNI локальные ссылки и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER class_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER classes_ptr NULL.

Получите Классы Classloader

jvmtiError
GetClassLoaderClasses(jvmtiEnv* env,
            jobject initiating_loader,
            jint* class_count_ptr,
            jclass** classes_ptr)
Возвращает массив тех классов, для которых этот загрузчик class был записан как загрузчик инициирования. Каждый class в возвращенном массиве создавался этим загрузчиком class, или определяя это непосредственно или делегацией другого загрузчика class. См. Спецификацию Виртуальной машины Java™, Главу 5.3.

Для реализаций версии 1.1 JDK, которые не распознают различие между инициированием и определением загрузчиков class, эта функция должна возвратить все классы, загруженные в виртуальной машине. Число классов в массиве возвращается через class_count_ptr, и массив непосредственно через classes_ptr.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 791.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
initiating_loader jobject Инициирование загрузчик class.

Если initiating_loader NULL, классы, инициируемые программой начальной загрузки, будут возвращены.
class_count_ptrjint* По возврату, точкам к числу классов.

Агент передает указатель на a jint. По возврату, jint был установлен.
classes_ptrjclass** По возврату, точкам массиву ссылок, один для каждого class.

Агент передает указатель на a jclass*. По возврату, jclass* точки недавно выделенному массиву размера *class_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные classes_ptr JNI локальные ссылки и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER class_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER classes_ptr NULL.

Получите Подпись Класса

jvmtiError
GetClassSignature(jvmtiEnv* env,
            jclass klass,
            char** signature_ptr,
            char** generic_ptr)
Для class, обозначенного klass, возвратите подпись типа JNI и универсальную подпись class. Например, java.util.List "Ljava/util/List;" и int[] "[I" Возвращенное имя для примитивных классов является символом подписи типа соответствующего типа примитива. Например, java.lang.Integer.TYPE "I".

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 481.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
signature_ptr char ** По возврату, точкам к подписи типа JNI class, закодированного как измененная строка UTF-8.

Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если signature_ptr NULL, подпись не возвращается.
generic_ptr char ** По возврату, точкам к универсальной подписи class, закодированного как измененная строка UTF-8. Если нет никакого универсального атрибута подписи для class, то, по возврату, точкам к NULL.

Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если generic_ptr NULL, универсальная подпись не возвращается.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.

Получите Состояние Класса

jvmtiError
GetClassStatus(jvmtiEnv* env,
            jclass klass,
            jint* status_ptr)
Получите состояние class. Нуль или больше следующих битов могут быть установлены.
Флаги Состояния класса
Постоянный Значение Описание
JVMTI_CLASS_STATUS_VERIFIED1 Байт-коды класса были проверены
JVMTI_CLASS_STATUS_PREPARED2 Подготовка к классу полна
JVMTI_CLASS_STATUS_INITIALIZED4 Инициализация класса полна. Статический инициализатор был выполнен.
JVMTI_CLASS_STATUS_ERROR8 Ошибка во время инициализации делает class неприменимым
JVMTI_CLASS_STATUS_ARRAY16 Класс является массивом. Если установлено, все другие биты являются нулем.
JVMTI_CLASS_STATUS_PRIMITIVE32 Классом является примитивный class (например, java.lang.Integer.TYPE). Если установлено, все другие биты являются нулем.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 491.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
status_ptrjint* По возврату, точкам к текущему состоянию этого class как один или больше флагов состояния class.

Агент передает указатель на a jint. По возврату, jint был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_NULL_POINTER status_ptr NULL.

Получите Имя Исходного файла

jvmtiError
GetSourceFileName(jvmtiEnv* env,
            jclass klass,
            char** source_name_ptr)
Для class, обозначенного klass, возвратите имя исходного файла через source_name_ptr. Возвращенная строка является именем файла только и никогда не содержит имя каталога.

Для примитивных классов (например, java.lang.Integer.TYPE) и для массивов эта функция возвраты JVMTI_ERROR_ABSENT_INFORMATION.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 501.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_get_source_file_name Может получить имя исходного файла class

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
source_name_ptrchar** По возврату, точкам к имени исходного файла class, закодированному как измененная строка UTF-8.

Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_get_source_file_name. Использовать AddCapabilities.
JVMTI_ERROR_ABSENT_INFORMATION Информация о классе не включает имя исходного файла. Это включает случаи, где class является массивом class или примитивный class.
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_NULL_POINTER source_name_ptr NULL.

Получите Модификаторы Класса

jvmtiError
GetClassModifiers(jvmtiEnv* env,
            jclass klass,
            jint* modifiers_ptr)
Для class, обозначенного klass, возвратите флаги доступа через modifiers_ptr. Флаги доступа определяются в Спецификации Виртуальной машины Java™, Главе 4.

Если class является массивом class, то его общедоступные, частные, и защищенные модификаторы являются тем же самым как таковыми из его компонентного типа. Для массивов примитивов этот компонентный тип представляется одним из примитивных классов (например, java.lang.Integer.TYPE).

Если class является примитивный class, его общедоступный модификатор всегда является истиной, и его защищенные и частные модификаторы всегда являются ложью.

Если class является массивом class или примитивный class тогда, его заключительный модификатор всегда является истиной, и его модификатор интерфейса всегда является ложью. Значения его других модификаторов не определяются этой спецификацией.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 511.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
modifiers_ptrjint* По возврату, точкам к текущим флагам доступа этого class.

Агент передает указатель на a jint. По возврату, jint был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_NULL_POINTER modifiers_ptr NULL.

Получите Методы Класса

jvmtiError
GetClassMethods(jvmtiEnv* env,
            jclass klass,
            jint* method_count_ptr,
            jmethodID** methods_ptr)
Для class, обозначенного klass, возвратите количество методов через method_count_ptr и список ID метода через methods_ptr. Список метода содержит конструкторов и статические инициализаторы так же как истинные методы. Только непосредственно объявленные методы возвращаются (не наследованные методы). Пустой список метода возвращается для классов массива и примитивных классов (например, java.lang.Integer.TYPE).

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 521.0

Возможности
Необходимая Функциональность
Дополнительные функции
Возможность Эффект
can_maintain_original_method_order Может возвратить методы в порядке, они происходят в файле class

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
method_count_ptrjint* По возврату, точкам к числу методов, объявленных в этом class.

Агент передает указатель на a jint. По возврату, jint был установлен.
methods_ptrjmethodID** По возврату, точкам массиву ID метода.

Агент передает указатель на a jmethodID*. По возврату, jmethodID* точки недавно выделенному массиву размера *method_count_ptr. Массив должен быть освобожден с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_CLASS_NOT_PREPARED klass не готовится.
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_NULL_POINTER method_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER methods_ptr NULL.

Получите Поля Класса

jvmtiError
GetClassFields(jvmtiEnv* env,
            jclass klass,
            jint* field_count_ptr,
            jfieldID** fields_ptr)
Для class, обозначенного klass, возвратите количество полей через field_count_ptr и список полевых ID через fields_ptr. Только непосредственно объявленные поля возвращаются (не наследованные поля). Поля возвращаются в порядке, они происходят в файле class. Пустой cписок полей возвращается для классов массива и примитивных классов (например, java.lang.Integer.TYPE). Используйте JNI, чтобы определить длину массива.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 531.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
field_count_ptrjint* По возврату, точкам к числу полей, объявленных в этом class.

Агент передает указатель на a jint. По возврату, jint был установлен.
fields_ptrjfieldID** По возврату, точкам полевому массиву ID.

Агент передает указатель на a jfieldID*. По возврату, jfieldID* точки недавно выделенному массиву размера *field_count_ptr. Массив должен быть освобожден с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_CLASS_NOT_PREPARED klass не готовится.
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_NULL_POINTER field_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER fields_ptr NULL.

Получите Реализованные Интерфейсы

jvmtiError
GetImplementedInterfaces(jvmtiEnv* env,
            jclass klass,
            jint* interface_count_ptr,
            jclass** interfaces_ptr)
Возвратите прямые суперинтерфейсы этого class. Для class эта функция возвращает интерфейсы, объявленные в implements пункт. Для интерфейса эта функция возвращает интерфейсы, объявленные в extends пункт. Пустой список интерфейса возвращается для классов массива и примитивных классов (например, java.lang.Integer.TYPE).

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 541.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
interface_count_ptrjint* По возврату, точкам к числу интерфейсов.

Агент передает указатель на a jint. По возврату, jint был установлен.
interfaces_ptrjclass** По возврату, точкам массиву интерфейса.

Агент передает указатель на a jclass*. По возврату, jclass* точки недавно выделенному массиву размера *interface_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные interfaces_ptr JNI локальные ссылки и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_CLASS_NOT_PREPARED klass не готовится.
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_NULL_POINTER interface_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER interfaces_ptr NULL.

Получите Номера версий Класса

jvmtiError
GetClassVersionNumbers(jvmtiEnv* env,
            jclass klass,
            jint* minor_version_ptr,
            jint* major_version_ptr)
Для class, обозначенного klass, возвратите номера вспомогательной версии и номера основной версии, как определено в Спецификации Виртуальной машины Java™, Главе 4.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 1451.1

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
minor_version_ptrjint* По возврату, точкам к значению minor_version элемент Формата файла Класса. Отметьте: чтобы быть непротиворечивым с Форматом файла Класса, номер вспомогательной версии является первым параметром.

Агент передает указатель на a jint. По возврату, jint был установлен.
major_version_ptrjint* По возврату, точкам к значению major_version элемент Формата файла Класса.

Агент передает указатель на a jint. По возврату, jint был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_ABSENT_INFORMATION class является примитивный class или массив class.
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_NULL_POINTER minor_version_ptr NULL.
JVMTI_ERROR_NULL_POINTER major_version_ptr NULL.

Получите Постоянный Пул

jvmtiError
GetConstantPool(jvmtiEnv* env,
            jclass klass,
            jint* constant_pool_count_ptr,
            jint* constant_pool_byte_count_ptr,
            unsigned char** constant_pool_bytes_ptr)
Для class, обозначенного klass, возвратите необработанные байты постоянного пула в формате constant_pool элемент Спецификации Виртуальной машины Java™, Главы 4. Формат постоянного пула может отличаться между версиями Формата файла Класса, таким образом, незначительные и главные номера версий class должны быть проверены на совместимость.

У возвращенного постоянного пула не могло бы быть того же самого расположения или содержания как постоянный пул в определении файл class. Постоянный пул, возвращенный GetConstantPool (), может иметь больше или меньше записей чем определяющий постоянный пул. Записи могут быть в различном порядке. Постоянный пул, возвращенный GetConstantPool (), будет соответствовать постоянный пул, используемый GetBytecodes (). Таким образом, у байт-кодов, возвращенных GetBytecodes (), будут постоянные индексы пула, которые обращаются к постоянным записям пула, возвращенным GetConstantPool (). Отметьте это с тех пор RetransformClasses и RedefineClasses может изменить постоянный пул, постоянный пул, возвращенный этой функцией, может измениться соответственно. Таким образом корреспонденция между GetConstantPool () и GetBytecodes () не содержит, если есть прошедшее перепреобразование class или переопределение. Значение постоянной записи пула, используемой данным байт-кодом, будет соответствовать значение определения файл class (даже если индексы не будут соответствовать). Постоянные записи пула, которые не используются прямо или косвенно байт-кодами (например, строки UTF-8, связанные с аннотациями), не обязаны существовать в возвращенном постоянном пуле.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 1461.1

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_get_constant_pool Может получить постоянный пул class - GetConstantPool

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
constant_pool_count_ptrjint* По возврату, точкам к числу записей в постоянном бильярдном столе для пула плюс один. Это соответствует constant_pool_count элемент Формата файла Класса.

Агент передает указатель на a jint. По возврату, jint был установлен.
constant_pool_byte_count_ptrjint* По возврату, точкам к числу байтов в возвращенном необработанном постоянном пуле.

Агент передает указатель на a jint. По возврату, jint был установлен.
constant_pool_bytes_ptrunsigned char** По возврату, точкам к необработанному постоянному пулу, который является байтами, определенными constant_pool элемент Формата файла Класса

Агент передает указатель на a unsigned char*. По возврату, unsigned char* точки недавно выделенному массиву размера *constant_pool_byte_count_ptr. Массив должен быть освобожден с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_get_constant_pool. Использовать AddCapabilities.
JVMTI_ERROR_ABSENT_INFORMATION class является примитивный class или массив class.
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_NULL_POINTER constant_pool_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER constant_pool_byte_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER constant_pool_bytes_ptr NULL.

Интерфейс

jvmtiError
IsInterface(jvmtiEnv* env,
            jclass klass,
            jboolean* is_interface_ptr)
Определяет, представляет ли ссылка на объект class интерфейс. jboolean результат JNI_TRUE если "class" является фактически интерфейсом, JNI_FALSE иначе.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 551.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
is_interface_ptrjboolean* По возврату, точкам к булеву результату этой функции.

Агент передает указатель на a jboolean. По возврату, jboolean был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_NULL_POINTER is_interface_ptr NULL.

Класс Массива

jvmtiError
IsArrayClass(jvmtiEnv* env,
            jclass klass,
            jboolean* is_array_class_ptr)
Определяет, представляет ли ссылка на объект class массив. jboolean результат JNI_TRUE если class является массивом, JNI_FALSE иначе.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 561.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
is_array_class_ptrjboolean* По возврату, точкам к булеву результату этой функции.

Агент передает указатель на a jboolean. По возврату, jboolean был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_NULL_POINTER is_array_class_ptr NULL.

Поддающийся изменению Класс

jvmtiError
IsModifiableClass(jvmtiEnv* env,
            jclass klass,
            jboolean* is_modifiable_class_ptr)
Определяет, является ли class поддающимся изменению. Если class является поддающимся изменению (is_modifiable_class_ptr возвраты JNI_TRUE) class может быть пересмотрен с RedefineClasses (принятие агента обладает can_redefine_classes возможность) или повторно преобразованный с RetransformClasses (принятие агента обладает can_retransform_classes возможность). Если class не является поддающимся изменению (is_modifiable_class_ptr возвраты JNI_FALSE) class ни не может быть пересмотрен, ни повторно преобразован.

Примитивные классы (например, java.lang.Integer.TYPE) и классы массива никогда не являются поддающимися изменению.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 451.1

Возможности
Необходимая Функциональность
Дополнительные функции
Возможность Эффект
can_redefine_any_class Если одержимый тогда все классы (кроме примитивного и классов массива) являются поддающимися изменению.
can_redefine_classes Никакой эффект на результат функции. Но должен дополнительно находиться в собственности, чтобы изменить class с RedefineClasses.
can_retransform_classes Никакой эффект на результат функции. Но должен дополнительно находиться в собственности, чтобы изменить class с RetransformClasses.

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
is_modifiable_class_ptrjboolean* По возврату, точкам к булеву результату этой функции.

Агент передает указатель на a jboolean. По возврату, jboolean был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_NULL_POINTER is_modifiable_class_ptr NULL.

Получите Загрузчик Класса

jvmtiError
GetClassLoader(jvmtiEnv* env,
            jclass klass,
            jobject* classloader_ptr)
Для class, обозначенного klass, возвратитесь через classloader_ptr ссылка на загрузчик class для class.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 571.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
classloader_ptrjobject* По возврату, точкам к загрузчику class, который загрузил этот class. Если class не создавался загрузчиком class или если загрузчик class является начальной загрузкой загрузчик class, точки к NULL.

Агент передает указатель на a jobject. По возврату, jobject был установлен. Объект, возвращенный classloader_ptr JNI локальная ссылка и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_NULL_POINTER classloader_ptr NULL.

Получите Исходное Расширение Отладки

jvmtiError
GetSourceDebugExtension(jvmtiEnv* env,
            jclass klass,
            char** source_debug_extension_ptr)
Для class, обозначенного klass, возвратите расширение отладки через source_debug_extension_ptr. Возвращенная строка содержит точно информацию о расширении отладки, существующую в файле class klass.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 901.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_get_source_debug_extension Может получить исходное расширение отладки class

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
source_debug_extension_ptrchar** По возврату, точкам к расширению отладки class, закодированному как измененная строка UTF-8.

Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_get_source_debug_extension. Использовать AddCapabilities.
JVMTI_ERROR_ABSENT_INFORMATION Информация о классе не включает расширение отладки.
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_NULL_POINTER source_debug_extension_ptr NULL.

Повторно преобразуйте Классы

jvmtiError
RetransformClasses(jvmtiEnv* env,
            jint class_count,
            const jclass* classes)
Эта функция облегчает инструментарий байт-кода уже загруженных классов. Заменять определение class независимо от существующих байт-кодов, как можно было бы сделать, перекомпилировав из источника для отладки фиксировать-и-продолжать, RedefineClasses функция должна использоваться вместо этого.

Когда классы первоначально загружаются или когда они пересматриваются, начальные байты файла class могут быть преобразованы с ClassFileLoadHook событие. Эта функция запускает повторно процесс преобразования (произошло ли преобразование ранее). Это перепреобразование следует за этими шагами: См. ClassFileLoadHook событие для большего количества деталей.

Начальные байты файла class представляют байты, которым передают ClassLoader.defineClass или RedefineClasses (прежде, чем любые преобразования были применены), однако они, возможно, не точно соответствуют им. Постоянный пул может отличаться способами, описанными в GetConstantPool. Будут соответствовать постоянные индексы пула в байт-кодах методов. Некоторые атрибуты, возможно, не присутствуют. Где порядок не значим, например порядок методов, порядок не может быть сохранен.

Перепреобразование может заставить новые версии методов быть установленными. Старые версии метода могут стать устаревшими, новая версия метода будет использоваться на новом, вызывает. Если у метода есть активные стековые фреймы, те активные фреймы продолжают выполнять байт-коды исходной версии метода.

Эта функция не вызывает инициализации за исключением того, что, который произошел бы под общепринятой семантикой JVM. Другими словами перепреобразование class не заставляет свои инициализаторы быть выполненными. Значения статических полей останутся, как они были до вызова.

Потоки не должны быть приостановлены.

Все контрольные точки в class очищаются.

Все атрибуты обновляются.

На экземпляры повторно преобразованного class не влияют - поля сохраняют свои предыдущие значения. Наклеивает экземпляры, также незатронуты.

В ответ на этот вызов, никакие события кроме ClassFileLoadHook событие будет отправлено.

Перепреобразование может изменить тела метода, постоянный пул и атрибуты. Перепреобразование не должно добавить, удалить или переименовать поля или методы, изменить подписи методов, модификаторов изменения, или наследования изменения. Эти ограничения могут быть сняты в будущих версиях. См. ошибочное описание возврата ниже для информации о кодах ошибки, возвращенных, если неподдерживаемое перепреобразование предпринимается. Байты файла class не проверяются или устанавливаются, пока они не прошли через цепочку ClassFileLoadHook события, таким образом возвращенный код ошибки отражает результат преобразований. Если какой-либо код ошибки возвращается кроме JVMTI_ERROR_NONE, ни одному из классов, которые будут повторно преобразованы, не установят новое определение. Когда эта функция возвращается (с кодом ошибки JVMTI_ERROR_NONE) всем классам, которые будут повторно преобразованы, установят их новые определения.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1521.1

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_retransform_classes Может повторно преобразовать классы с RetransformClasses. В дополнение к ограничениям, введенным определенной реализацией для этой возможности (см. раздел Возможности), эта возможность должна быть установлена перед ClassFileLoadHook событие включается впервые в этой среде. Среда, которая обладает этой возможностью в то время, когда ClassFileLoadHook включается впервые, как говорят, способное перепреобразование. Среда, которая не обладает этой возможностью в то время, когда ClassFileLoadHook включается впервые, как говорят, неспособное перепреобразование.
Дополнительные функции
can_retransform_any_class RetransformClasses может быть вызван на любом class (can_retransform_classes должен также быть установлен),

Параметры
Имя Ввести Описание
class_countjint Число классов, которые будут повторно преобразованы.
classesconst jclass* Массив классов, которые будут повторно преобразованы.

Агент передает в массиве class_count элементы jclass.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_retransform_classes. Использовать AddCapabilities.
JVMTI_ERROR_UNMODIFIABLE_CLASS Один из classes не может быть изменен. См. IsModifiableClass.
JVMTI_ERROR_INVALID_CLASS Один из classes не допустимый class.
JVMTI_ERROR_UNSUPPORTED_VERSION У повторно преобразованного файла class есть номер версии, не поддерживаемый этим VM.
JVMTI_ERROR_INVALID_CLASS_FORMAT Повторно преобразованный файл class уродлив (VM возвратил бы a ClassFormatError).
JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION Повторно преобразованные определения файла class привели бы к круговому определению (VM возвратит a ClassCircularityError).
JVMTI_ERROR_FAILS_VERIFICATION Повторно преобразованные байты файла class приводят проверку к сбою.
JVMTI_ERROR_NAMES_DONT_MATCH Имя class, определенное в повторно преобразованном файле class, отличается от имени в старом объекте class.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED Повторно преобразованный файл class потребовал бы добавления метода.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED Повторно преобразованный файл class изменяет поле.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED Прямой суперкласс отличается для повторно преобразованного файла class, или набор непосредственно реализованных интерфейсов отличается.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED Повторно преобразованный файл class не объявляет метод, объявленный в старой версии class.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED У повторно преобразованного файла class есть различные модификаторы class.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED У метода в повторно преобразованном файле class есть различные модификаторы чем его дубликат в старой версии class.
JVMTI_ERROR_ILLEGAL_ARGUMENT class_count меньше чем 0.
JVMTI_ERROR_NULL_POINTER classes NULL.

Пересмотрите Классы

typedef struct {
    jclass klass;
    jint class_byte_count;
    const unsigned char* class_bytes;
} jvmtiClassDefinition;
jvmtiError
RedefineClasses(jvmtiEnv* env,
            jint class_count,
            const jvmtiClassDefinition* class_definitions)
Все данные классы пересматриваются согласно предоставленным определениям. Эта функция используется, чтобы заменить определение class с новым определением, как мог бы быть необходим в отладке фиксировать-и-продолжать. Где существующие байты файла class должны быть преобразованы, например в инструментарии байт-кода, RetransformClasses должен использоваться.

Переопределение может заставить новые версии методов быть установленными. Старые версии метода могут стать устаревшими, новая версия метода будет использоваться на новом, вызывает. Если у метода есть активные стековые фреймы, те активные фреймы продолжают выполнять байт-коды исходной версии метода. Если сброс стековых фреймов требуется, использовать PopFrame выталкивать фреймы с устаревшими версиями метода.

Эта функция не вызывает инициализации за исключением того, что, который произошел бы под общепринятой семантикой JVM. Другими словами пересмотр class не заставляет свои инициализаторы быть выполненными. Значения статических полей останутся, как они были до вызова.

Потоки не должны быть приостановлены.

Все контрольные точки в class очищаются.

Все атрибуты обновляются.

На экземпляры пересмотренного class не влияют - поля сохраняют свои предыдущие значения. Наклеивает экземпляры, также незатронуты.

В ответ на этот вызов Рычаг Загрузки Файла Класса JVM будет отправлен (если включено), но никакая другая JVM 

Переопределение может изменить тела метода, постоянный пул и атрибуты. Переопределение не должно добавить, удалить или переименовать поля или методы, изменить подписи методов, модификаторов изменения, или наследования изменения. Эти ограничения могут быть сняты в будущих версиях. См. ошибочное описание возврата ниже для информации о кодах ошибки, возвращенных, если неподдерживаемое переопределение предпринимается. Байты файла class не проверяются или устанавливаются, пока они не прошли через цепочку ClassFileLoadHook события, таким образом возвращенный код ошибки отражает результат преобразований, которым применяются к байты, в которые передают class_definitions. Если какой-либо код ошибки возвращается кроме JVMTI_ERROR_NONE, ни одному из классов, которые будут пересмотрены, не установят новое определение. Когда эта функция возвращается (с кодом ошибки JVMTI_ERROR_NONE) всем классам, которые будут пересмотрены, установят их новые определения.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 871.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_redefine_classes Может пересмотреть классы с RedefineClasses.
Дополнительные функции
can_redefine_any_class Может изменить (повторно преобразуйте или пересмотрите), любой непримитивный немассив class. См. IsModifiableClass.

jvmtiClassDefinition - Описание переопределения класса
Поле Ввести Описание
klassjclass Объект класса для этого class
class_byte_countjint Число байтов, определяющих class (ниже)
class_bytesconst unsigned char* Байты, определяющие class (в Спецификации Виртуальной машины Java™, Главе 4)

Параметры
Имя Ввести Описание
class_countjint Число классов, определенных в class_definitions
class_definitionsconst jvmtiClassDefinition* Массив новых определений class

Агент передает в массиве class_count элементы jvmtiClassDefinition.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_redefine_classes. Использовать AddCapabilities.
JVMTI_ERROR_NULL_POINTER Один из class_bytes NULL.
JVMTI_ERROR_UNMODIFIABLE_CLASS Элемент class_definitions не может быть изменен. См. IsModifiableClass.
JVMTI_ERROR_INVALID_CLASS Элемент class_definitions не допустимый class.
JVMTI_ERROR_UNSUPPORTED_VERSION У нового файла class есть номер версии, не поддерживаемый этим VM.
JVMTI_ERROR_INVALID_CLASS_FORMAT Новый файл class уродлив (VM возвратил бы a ClassFormatError).
JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION Новые определения файла class привели бы к круговому определению (VM возвратит a ClassCircularityError).
JVMTI_ERROR_FAILS_VERIFICATION Байты class приводят проверку к сбою.
JVMTI_ERROR_NAMES_DONT_MATCH Имя class, определенное в новом файле class, отличается от имени в старом объекте class.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED Новый файл class потребовал бы добавления метода.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED Новая версия class изменяет поле.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED Прямой суперкласс отличается для новой версии class, или набор непосредственно реализованных интерфейсов отличается.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED Новая версия class не объявляет метод, объявленный в старой версии class.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED У новой версии class есть различные модификаторы.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED У метода в новой версии class есть различные модификаторы чем ее дубликат в старой версии class.
JVMTI_ERROR_ILLEGAL_ARGUMENT class_count меньше чем 0.
JVMTI_ERROR_NULL_POINTER class_definitions NULL.


Объект

Объектные функции: Объектные типы:


Получите Объектный Размер

jvmtiError
GetObjectSize(jvmtiEnv* env,
            jobject object,
            jlong* size_ptr)
Для объекта, обозначенного object, возвратитесь через size_ptr размер объекта. Этот размер является специфичным для реализации приближением количества хранения, использованного этим объектом. Это может включать некоторых или все издержки объекта, и таким образом полезно для сравнения в пределах реализации, но не между реализациями. Оценка может измениться во время единственного вызова JVM.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 1541.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
objectjobject Объект запросить.
size_ptrjlong* По возврату, точкам к размеру объекта в байтах.

Агент передает указатель на a jlong. По возврату, jlong был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_OBJECT object не объект.
JVMTI_ERROR_NULL_POINTER size_ptr NULL.

Получите Объектный Хэш-код

jvmtiError
GetObjectHashCode(jvmtiEnv* env,
            jobject object,
            jint* hash_code_ptr)
Для объекта, обозначенного object, возвратитесь через hash_code_ptr хэш-код. Этот хэш-код мог использоваться, чтобы поддержать хэш-таблицу ссылок на объект, однако, на некоторых реализациях, это может вызвать существенные воздействия производительности - в большинстве случаев тегирует, будет больше действенных средств связывающейся информации с объектами. Эта функция гарантирует то же самое значение хэш-кода для определенного объекта в течение его жизни

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 581.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
objectjobject Объект запросить.
hash_code_ptrjint* По возврату, точкам к хэш-коду объекта.

Агент передает указатель на a jint. По возврату, jint был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_OBJECT object не объект.
JVMTI_ERROR_NULL_POINTER hash_code_ptr NULL.

Получите Объектное Использование Монитора

typedef struct {
    jthread owner;
    jint entry_count;
    jint waiter_count;
    jthread* waiters;
    jint notify_waiter_count;
    jthread* notify_waiters;
} jvmtiMonitorUsage;
jvmtiError
GetObjectMonitorUsage(jvmtiEnv* env,
            jobject object,
            jvmtiMonitorUsage* info_ptr)
Получите информацию о мониторе объекта. Поля jvmtiMonitorUsage структура заполнена в информацией об использовании монитора.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 591.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_get_monitor_info Может GetObjectMonitorUsage

jvmtiMonitorUsage - Объектная информация об использовании монитора
Поле Ввести Описание
ownerjthread Поток, имеющий этот монитор, или NULL если неиспользованный
entry_countjint Число раз поток обладания ввело монитор
waiter_countjint Число потоков, ожидающих, чтобы иметь этот монитор
waitersjthread* waiter_count потоки ожидания
notify_waiter_countjint Число потоков, ожидающих, чтобы быть уведомленным этим монитором
notify_waitersjthread* notify_waiter_count потоки, ожидающие, чтобы быть уведомленным

Параметры
Имя Ввести Описание
objectjobject Объект запросить.
info_ptrjvmtiMonitorUsage* По возврату, заполненному информацией о мониторе для указанного объекта.

Агент передает указатель на a jvmtiMonitorUsage. По возврату, jvmtiMonitorUsage был установлен. Объект возвратился в поле owner из jvmtiMonitorUsage JNI локальная ссылка и должен управляться. Указатель возвратился в поле waiters из jvmtiMonitorUsage недавно выделенный массив. Массив должен быть освобожден с Deallocate. Объекты возвратились в поле waiters из jvmtiMonitorUsage JNI локальные ссылки и должен управляться. Указатель возвратился в поле notify_waiters из jvmtiMonitorUsage недавно выделенный массив. Массив должен быть освобожден с Deallocate. Объекты возвратились в поле notify_waiters из jvmtiMonitorUsage JNI локальные ссылки и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_get_monitor_info. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_OBJECT object не объект.
JVMTI_ERROR_NULL_POINTER info_ptr NULL.


Поле

Полевые функции:


Получите Имя поля (и Подпись)

jvmtiError
GetFieldName(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            char** name_ptr,
            char** signature_ptr,
            char** generic_ptr)
Для поля, обозначенного klass и field, возвратите имя поля через name_ptr и полевая подпись через signature_ptr.

Полевые подписи определяются в Спецификации JNI и упоминаются как field descriptors в Спецификации Виртуальной машины Java™, Главе 4.3.2.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 601.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
klassjclass class поля, чтобы запросить.
fieldjfieldID Поле, чтобы запросить.
name_ptr char ** По возврату, точкам к имени поля, закодированному как измененная строка UTF-8.

Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если name_ptr NULL, имя не возвращается.
signature_ptr char ** По возврату, точкам к полевой подписи, закодированной как измененная строка UTF-8.

Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если signature_ptr NULL, подпись не возвращается.
generic_ptr char ** По возврату, точкам к универсальной подписи поля, закодированного как измененная строка UTF-8. Если нет никакого универсального атрибута подписи для поля, то, по возврату, точкам к NULL.

Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если generic_ptr NULL, универсальная подпись не возвращается.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_INVALID_FIELDID field не jfieldID.

Получите Полевой Класс Объявления

jvmtiError
GetFieldDeclaringClass(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            jclass* declaring_class_ptr)
Для поля, обозначенного klass и field возвратите class, который определил это через declaring_class_ptr. Объявление class или будет klass, суперкласс, или реализованный интерфейс.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 611.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
fieldjfieldID Поле, чтобы запросить.
declaring_class_ptrjclass* По возврату, точкам к объявлению class

Агент передает указатель на a jclass. По возврату, jclass был установлен. Объект, возвращенный declaring_class_ptr JNI локальная ссылка и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_INVALID_FIELDID field не jfieldID.
JVMTI_ERROR_NULL_POINTER declaring_class_ptr NULL.

Получите Полевые Модификаторы

jvmtiError
GetFieldModifiers(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            jint* modifiers_ptr)
Для поля, обозначенного klass и field возвратите флаги доступа через modifiers_ptr. Флаги доступа определяются в Спецификации Виртуальной машины Java™, Главе 4.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 621.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
klassjclass class, чтобы запросить.
fieldjfieldID Поле, чтобы запросить.
modifiers_ptrjint* По возврату, точкам к флагам доступа.

Агент передает указатель на a jint. По возврату, jint был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_INVALID_FIELDID field не jfieldID.
JVMTI_ERROR_NULL_POINTER modifiers_ptr NULL.

Синтетическое Поле

jvmtiError
IsFieldSynthetic(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            jboolean* is_synthetic_ptr)
Для поля, обозначенного klass и field, возвратите значение, указывающее, является ли поле синтетическим через is_synthetic_ptr. Синтетические поля сгенерированы компилятором, но не существующие в коде первоисточника.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 631.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_get_synthetic_attribute Может протестировать, если поле или метод являются синтетическими - IsFieldSynthetic и IsMethodSynthetic

Параметры
Имя Ввести Описание
klassjclass class поля, чтобы запросить.
fieldjfieldID Поле, чтобы запросить.
is_synthetic_ptrjboolean* По возврату, точкам к булеву результату этой функции.

Агент передает указатель на a jboolean. По возврату, jboolean был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_get_synthetic_attribute. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_CLASS klass не объект class, или class был разгружен.
JVMTI_ERROR_INVALID_FIELDID field не jfieldID.
JVMTI_ERROR_NULL_POINTER is_synthetic_ptr NULL.


Метод

Функции метода: Типы метода: Эти функции предоставляют информацию о методе (представленный как a jmethodID) и набор, как обрабатываются методы.

Устаревшие Методы

Функции RetransformClasses и RedefineClasses может заставить новые версии методов быть установленными. Оригинальную версию метода считают эквивалентной новой версии если: Исходную версию метода, которая не эквивалентна новой версии метода, вызывают устаревшая и присваивается новый ID метода; исходный ID метода теперь обращается к новой версии метода. ID метода может быть протестирован на устаревание с IsMethodObsolete.


Получите Имя метода (и Подпись)

jvmtiError
GetMethodName(jvmtiEnv* env,
            jmethodID method,
            char** name_ptr,
            char** signature_ptr,
            char** generic_ptr)
Для метода, обозначенного method, возвратите имя метода через name_ptr и сигнатура метода через signature_ptr.

Сигнатуры методов определяются в Спецификации JNI и упоминаются как method descriptors в Спецификации Виртуальной машины Java™, Главе 4.3.3. Отметьте, что это отличается чем сигнатуры методов как определено в Спецификации языка Java.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 641.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
methodjmethodID Метод, чтобы запросить.
name_ptr char ** По возврату, точкам к имени метода, закодированному как измененная строка UTF-8.

Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если name_ptr NULL, имя не возвращается.
signature_ptr char ** По возврату, точкам к сигнатуре метода, закодированной как измененная строка UTF-8.

Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если signature_ptr NULL, подпись не возвращается.
generic_ptr char ** По возврату, точкам к универсальной подписи метода, закодированного как измененная строка UTF-8. Если нет никакого универсального атрибута подписи для метода, то, по возврату, точкам к NULL.

Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если generic_ptr NULL, универсальная подпись не возвращается.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_METHODID method не jmethodID.

Получите Класс Объявления Метода

jvmtiError
GetMethodDeclaringClass(jvmtiEnv* env,
            jmethodID method,
            jclass* declaring_class_ptr)
Для метода, обозначенного method, возвратите class, который определил это через declaring_class_ptr.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 651.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
methodjmethodID Метод, чтобы запросить.
declaring_class_ptrjclass* По возврату, точкам к объявлению class

Агент передает указатель на a jclass. По возврату, jclass был установлен. Объект, возвращенный declaring_class_ptr JNI локальная ссылка и должен управляться.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_METHODID method не jmethodID.
JVMTI_ERROR_NULL_POINTER declaring_class_ptr NULL.

Получите Модификаторы Метода

jvmtiError
GetMethodModifiers(jvmtiEnv* env,
            jmethodID method,
            jint* modifiers_ptr)
Для метода, обозначенного method, возвратите флаги доступа через modifiers_ptr. Флаги доступа определяются в Спецификации Виртуальной машины Java™, Главе 4.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 661.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
methodjmethodID Метод, чтобы запросить.
modifiers_ptrjint* По возврату, точкам к флагам доступа.

Агент передает указатель на a jint. По возврату, jint был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_METHODID method не jmethodID.
JVMTI_ERROR_NULL_POINTER modifiers_ptr NULL.

Получите Максимальные Локальные переменные

jvmtiError
GetMaxLocals(jvmtiEnv* env,
            jmethodID method,
            jint* max_ptr)
Для метода, обозначенного method, возвратите число слотов локальной переменной, используемых методом, включая локальные переменные, используемые, чтобы передать параметры к методу на его вызове.

См. max_locals в Спецификации Виртуальной машины Java™, Главе 4.7.3.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 681.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
methodjmethodID Метод, чтобы запросить.
max_ptrjint* По возврату, точкам к максимальному количеству локальных слотов

Агент передает указатель на a jint. По возврату, jint был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_METHODID method не jmethodID.
JVMTI_ERROR_NATIVE_METHOD method собственный метод.
JVMTI_ERROR_NULL_POINTER max_ptr NULL.

Получите Размер Параметров

jvmtiError
GetArgumentsSize(jvmtiEnv* env,
            jmethodID method,
            jint* size_ptr)
Для метода, обозначенного method, возвратитесь через max_ptr число слотов локальной переменной используется параметрами метода. Отметьте, что параметры с двумя словами используют два слота.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 691.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
methodjmethodID Метод, чтобы запросить.
size_ptrjint* По возврату, точкам к числу слотов параметра

Агент передает указатель на a jint. По возврату, jint был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_METHODID method не jmethodID.
JVMTI_ERROR_NATIVE_METHOD method собственный метод.
JVMTI_ERROR_NULL_POINTER size_ptr NULL.

Получите Таблицу Номера строки

typedef struct {
    jlocation start_location;
    jint line_number;
} jvmtiLineNumberEntry;
jvmtiError
GetLineNumberTable(jvmtiEnv* env,
            jmethodID method,
            jint* entry_count_ptr,
            jvmtiLineNumberEntry** table_ptr)
Для метода, обозначенного method, возвратите таблицу исходных записей номера строки. Размер таблицы возвращается через entry_count_ptr и сама таблица возвращается через table_ptr.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 701.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_get_line_numbers Может получить таблицу номера строки метода

jvmtiLineNumberEntry - Запись таблицы номера строки
Поле Ввести Описание
start_locationjlocation jlocation где строка начинается
line_numberjint номер строки

Параметры
Имя Ввести Описание
methodjmethodID Метод, чтобы запросить.
entry_count_ptrjint* По возврату, точкам к числу записей в таблице

Агент передает указатель на a jint. По возврату, jint был установлен.
table_ptrjvmtiLineNumberEntry** По возврату, точкам к табличному указателю номера строки.

Агент передает указатель на a jvmtiLineNumberEntry*. По возврату, jvmtiLineNumberEntry* точки недавно выделенному массиву размера *entry_count_ptr. Массив должен быть освобожден с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_get_line_numbers. Использовать AddCapabilities.
JVMTI_ERROR_ABSENT_INFORMATION Информация о классе не включает номера строки.
JVMTI_ERROR_INVALID_METHODID method не jmethodID.
JVMTI_ERROR_NATIVE_METHOD method собственный метод.
JVMTI_ERROR_NULL_POINTER entry_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER table_ptr NULL.

Получите Расположение Метода

jvmtiError
GetMethodLocation(jvmtiEnv* env,
            jmethodID method,
            jlocation* start_location_ptr,
            jlocation* end_location_ptr)
Для метода, обозначенного method, возвратите начальные и конечные адреса через start_location_ptr и end_location_ptr. В стандартной схеме индексации кода байта, start_location_ptr будет всегда указывать на нуль и end_location_ptr будет всегда указывать на количество кода байта минус один.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 711.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
methodjmethodID Метод, чтобы запросить.
start_location_ptrjlocation* По возврату, точкам к первому расположению, или -1 если информация о расположении не доступна. Если информация доступна и GetJLocationFormat возвраты JVMTI_JLOCATION_JVMBCI тогда это всегда будет нулем.

Агент передает указатель на a jlocation. По возврату, jlocation был установлен.
end_location_ptrjlocation* По возврату, точкам к последнему расположению, или -1 если информация о расположении не доступна.

Агент передает указатель на a jlocation. По возврату, jlocation был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_ABSENT_INFORMATION Информация о классе не включает размеры метода.
JVMTI_ERROR_INVALID_METHODID method не jmethodID.
JVMTI_ERROR_NATIVE_METHOD method собственный метод.
JVMTI_ERROR_NULL_POINTER start_location_ptr NULL.
JVMTI_ERROR_NULL_POINTER end_location_ptr NULL.

Получите Таблицу Локальной переменной

typedef struct {
    jlocation start_location;
    jint length;
    char* name;
    char* signature;
    char* generic_signature;
    jint slot;
} jvmtiLocalVariableEntry;
jvmtiError
GetLocalVariableTable(jvmtiEnv* env,
            jmethodID method,
            jint* entry_count_ptr,
            jvmtiLocalVariableEntry** table_ptr)
Возвратите информацию о локальной переменной.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 721.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_access_local_variables Может установить и получить локальные переменные

jvmtiLocalVariableEntry - Запись таблицы локальной переменной
Поле Ввести Описание
start_locationjlocation Массив кода индексирует, где локальная переменная сначала допустима (то есть, где у этого должно быть значение).
lengthjint Длина допустимого раздела для этой локальной переменной. Последний массив кода индексирует, где локальная переменная допустима, start_location + length.
namechar* Имя локальной переменной, закодированное как измененная строка UTF-8.
signaturechar* Подпись типа локальной переменной, закодированная как измененная строка UTF-8. Формат подписи является тем же самым, поскольку это определило в Спецификации Виртуальной машины Java™, Главе 4.3.2.
generic_signaturechar* Универсальная подпись локальной переменной, закодированная как измененная строка UTF-8. Значение этого поля будет NULL для любой локальной переменной, у которой нет универсального типа.
slotjint Слот локальной переменной. См. Локальные переменные.

Параметры
Имя Ввести Описание
methodjmethodID Метод, чтобы запросить.
entry_count_ptrjint* По возврату, точкам к числу записей в таблице

Агент передает указатель на a jint. По возврату, jint был установлен.
table_ptrjvmtiLocalVariableEntry** По возврату, точкам массиву записей таблицы локальной переменной.

Агент передает указатель на a jvmtiLocalVariableEntry*. По возврату, jvmtiLocalVariableEntry* точки недавно выделенному массиву размера *entry_count_ptr. Массив должен быть освобожден с Deallocate. Указатели возвратились в поле name из jvmtiLocalVariableEntry недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле signature из jvmtiLocalVariableEntry недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле generic_signature из jvmtiLocalVariableEntry недавно выделяются массивы. Массивы должны быть освобождены с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_access_local_variables. Использовать AddCapabilities.
JVMTI_ERROR_ABSENT_INFORMATION Информация о классе не включает информацию о локальной переменной.
JVMTI_ERROR_INVALID_METHODID method не jmethodID.
JVMTI_ERROR_NATIVE_METHOD method собственный метод.
JVMTI_ERROR_NULL_POINTER entry_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER table_ptr NULL.

Получите Байт-коды

jvmtiError
GetBytecodes(jvmtiEnv* env,
            jmethodID method,
            jint* bytecode_count_ptr,
            unsigned char** bytecodes_ptr)
Для метода, обозначенного method, возвратите коды байта, которые реализуют метод. Число байт-кодов возвращается через bytecode_count_ptr. Коды самого байта возвращаются через bytecodes_ptr.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 751.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_get_bytecodes Может получить байт-коды метода GetBytecodes

Параметры
Имя Ввести Описание
methodjmethodID Метод, чтобы запросить.
bytecode_count_ptrjint* По возврату, точкам к длине массива кода байта

Агент передает указатель на a jint. По возврату, jint был установлен.
bytecodes_ptrunsigned char** По возврату, точкам к указателю на массив кода байта

Агент передает указатель на a unsigned char*. По возврату, unsigned char* точки недавно выделенному массиву размера *bytecode_count_ptr. Массив должен быть освобожден с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_get_bytecodes. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_METHODID method не jmethodID.
JVMTI_ERROR_NATIVE_METHOD method собственный метод.
JVMTI_ERROR_NULL_POINTER bytecode_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER bytecodes_ptr NULL.

Собственный Метод

jvmtiError
IsMethodNative(jvmtiEnv* env,
            jmethodID method,
            jboolean* is_native_ptr)
Для метода, обозначенного method, возвратите значение, указывающее, является ли метод собственным через is_native_ptr

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 761.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
methodjmethodID Метод, чтобы запросить.
is_native_ptrjboolean* По возврату, точкам к булеву результату этой функции.

Агент передает указатель на a jboolean. По возврату, jboolean был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_METHODID method не jmethodID.
JVMTI_ERROR_NULL_POINTER is_native_ptr NULL.

Синтетический Метод

jvmtiError
IsMethodSynthetic(jvmtiEnv* env,
            jmethodID method,
            jboolean* is_synthetic_ptr)
Для метода, обозначенного method, возвратите значение, указывающее, является ли метод синтетическим через is_synthetic_ptr. Синтетические методы сгенерированы компилятором, но не существующие в коде первоисточника.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 771.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_get_synthetic_attribute Может протестировать, если поле или метод являются синтетическими - IsFieldSynthetic и IsMethodSynthetic

Параметры
Имя Ввести Описание
methodjmethodID Метод, чтобы запросить.
is_synthetic_ptrjboolean* По возврату, точкам к булеву результату этой функции.

Агент передает указатель на a jboolean. По возврату, jboolean был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_get_synthetic_attribute. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_METHODID method не jmethodID.
JVMTI_ERROR_NULL_POINTER is_synthetic_ptr NULL.

Устаревший Метод

jvmtiError
IsMethodObsolete(jvmtiEnv* env,
            jmethodID method,
            jboolean* is_obsolete_ptr)
Определите, обращается ли ID метода к устаревшей версии метода.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 911.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
methodjmethodID ID метода, чтобы запросить.
is_obsolete_ptrjboolean* По возврату, точкам к булеву результату этой функции.

Агент передает указатель на a jboolean. По возврату, jboolean был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_METHODID method не jmethodID.
JVMTI_ERROR_NULL_POINTER is_obsolete_ptr NULL.

Установите Собственный Префикс Метода

jvmtiError
SetNativeMethodPrefix(jvmtiEnv* env,
            const char* prefix)
Эта функция изменяет обработку отказа собственного разрешения метода, позволяя повторную попытку с префиксом, которому применяются к имя. Когда использующийся с событием ClassFileLoadHook, это позволяет собственным методам быть инструментованными.

Так как собственные методы не могут быть непосредственно инструментованы (у них нет никаких байт-кодов), они должны быть обернуты с несобственным методом, который может быть инструментован. Например, если мы имели:
native boolean foo(int x);

Мы могли преобразовать файл class (с событием ClassFileLoadHook) так, чтобы это стало:
boolean foo(int x) {
  ... record entry to foo ...
  return wrapped_foo(x);
}

native boolean wrapped_foo(int x);

Где foo становится оберткой для фактического собственного метода с добавленным префиксом, "обернутым _ ". Отметьте, что "обернутый _" был бы плохой выбор префикса, так как он мог бы очевидно сформировать имя существующего метода таким образом, что-то как" $ $ $MyAgentWrapped$ $ $ _" будет лучше, но сделало бы эти примеры менее читаемыми.

Обертка позволит данным быть собранными на собственном вызове метода, но теперь проблема становится соединяющим обернутого метода с собственной реализацией. Таким образом, метод wrapped_foo потребности, которые будут разрешены к собственной реализации foo, который мог бы быть:
Java_somePackage_someClass_foo(JNIEnv* env, jint x)

Эта функция позволяет префиксу быть определенным и надлежащее разрешение, чтобы произойти. Определенно, когда стандартное разрешение перестало работать, разрешение повторяется, принимая префикс во внимание. Есть два способа, которыми разрешение происходит, явное разрешение с функцией JNI RegisterNatives и нормальное автоматическое разрешение. Для RegisterNatives, VM будет делать попытку этой ассоциации:
method(foo) -> nativeImplementation(foo)

Когда это перестанет работать, разрешение будет повторено с указанным префиксом, предварительно ожидаемым к имени метода, приводя к корректному разрешению:
method(wrapped_foo) -> nativeImplementation(foo)

Для автоматического разрешения попытается VM:
method(wrapped_foo) -> nativeImplementation(wrapped_foo)

Когда это перестанет работать, разрешение будет повторено с указанным префиксом, удаленным из имени реализации, приводя к корректному разрешению:
method(wrapped_foo) -> nativeImplementation(foo)

Отметьте, что, так как префикс только используется, когда стандартное разрешение перестало работать, собственные методы могут быть обернуты выборочно.

Начиная с каждой JVM ClassFileLoadHook событие. Таким образом, если три среды примененные обертки, foo мог бы стать $env3_$env2_$env1_foo. Но если, скажем, вторая среда не применяла обертку к foo это было бы справедливо $env3_$env1_foo. Чтобы быть в состоянии эффективно определить последовательность префиксов, промежуточный префикс только применяется, если его несобственная обертка существует. Таким образом, в последнем примере, даже при том, что $env1_foo не собственный метод, $env1_ префикс применяется с тех пор $env1_foo существует.

Так как префиксы используются во время разрешения и так как разрешение может быть произвольно задержано, собственный префикс метода должен остаться установленным, пока есть соответствующие снабженные префиксом собственные методы.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Нет 731.1

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_set_native_method_prefix Может установить префикс, который будет применен, когда собственный метод не может быть разрешен - SetNativeMethodPrefix и SetNativeMethodPrefixes

Параметры
Имя Ввести Описание
prefixconst char * Префикс, чтобы применяться, закодированный как измененная строка UTF-8.

Агент передает в массиве char. Если prefix NULL, любой существующий префикс в этой среде отменяется.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_set_native_method_prefix. Использовать AddCapabilities.

Установите Собственные Префиксы Метода

jvmtiError
SetNativeMethodPrefixes(jvmtiEnv* env,
            jint prefix_count,
            char** prefixes)
Для нормального агента, SetNativeMethodPrefix обеспечит все необходимое собственное добавление префикса метода. Для метаагента, который выполняет многократные независимые преобразования файла class (например как прокси для другого уровня агентов) эта функция позволяет каждому преобразованию иметь свой собственный префикс. Префиксы применяются в предоставленном порядке и обрабатываются в том же самом поместье как описано для приложения префиксов от многократной JVM SetNativeMethodPrefix.

Заменяются любые предыдущие префиксы. Таким образом, вызывая эту функцию с a prefix_count из 0 отключает добавление префикса в этой среде.

SetNativeMethodPrefix и эта функция является этими двумя способами установить префиксы. Вызов SetNativeMethodPrefix с префиксом то же самое как вызывающий эту функцию с prefix_count из 1. Вызов SetNativeMethodPrefix с NULL то же самое как вызывающий эту функцию с prefix_count из 0.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Нет 741.1

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_set_native_method_prefix Может установить префикс, который будет применен, когда собственный метод не может быть разрешен - SetNativeMethodPrefix и SetNativeMethodPrefixes

Параметры
Имя Ввести Описание
prefix_countjint Число префиксов, чтобы применяться.
prefixes char ** Префиксы, чтобы просить эту среду, каждый закодированный как измененная строка UTF-8.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_set_native_method_prefix. Использовать AddCapabilities.
JVMTI_ERROR_ILLEGAL_ARGUMENT prefix_count меньше чем 0.
JVMTI_ERROR_NULL_POINTER prefixes NULL.


Необработанный Монитор

Необработанные функции Монитора:


Создайте Необработанный Монитор

jvmtiError
CreateRawMonitor(jvmtiEnv* env,
            const char* name,
            jrawMonitorID* monitor_ptr)
Создайте необработанный монитор.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время OnLoad или живой фазы Эта функция может быть вызвана от обратных вызовов до итеративных функций "Кучи", или от обработчиков событий для GarbageCollectionStart, GarbageCollectionFinish, и ObjectFree события. 311.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
nameconst char* Имя, чтобы идентифицировать монитор, закодированный как измененная строка UTF-8.

Агент передает в массиве char.
monitor_ptrjrawMonitorID* По возврату, точкам к создаваемому монитору.

Агент передает указатель на a jrawMonitorID. По возврату, jrawMonitorID был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER name NULL.
JVMTI_ERROR_NULL_POINTER monitor_ptr NULL.

Уничтожьте Необработанный Монитор

jvmtiError
DestroyRawMonitor(jvmtiEnv* env,
            jrawMonitorID monitor)
Уничтожьте необработанный монитор. Если уничтожаемый монитор был введен этим потоком, из него выйдут прежде, чем он будет уничтожен. Если уничтожаемый монитор был введен другим потоком, ошибка будет возвращена, и монитор не будет уничтожен.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время OnLoad или живой фазы Эта функция может быть вызвана от обратных вызовов до итеративных функций "Кучи", или от обработчиков событий для GarbageCollectionStart, GarbageCollectionFinish, и ObjectFree события. 321.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
monitorjrawMonitorID Монитор

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NOT_MONITOR_OWNER Не контролируют владельца
JVMTI_ERROR_INVALID_MONITOR monitor не jrawMonitorID.

Необработанный Монитор Входит

jvmtiError
RawMonitorEnter(jvmtiEnv* env,
            jrawMonitorID monitor)
Получите монопольное владение необработанного монитора. Тот же самый поток может ввести монитор более тогда однажды. Поток должен выйти из монитора то же самое число раз, как это вводится. Если монитор вводится во время OnLoad (прежде, чем присоединенные потоки будут существовать), и не вышел, когда присоединенные потоки появляются, введение, как полагают, произошло на основном потоке.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Эта функция может быть вызвана от обратных вызовов до итеративных функций "Кучи", или от обработчиков событий для GarbageCollectionStart, GarbageCollectionFinish, и ObjectFree события. 331.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
monitorjrawMonitorID Монитор

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_MONITOR monitor не jrawMonitorID.

Необработанный Выход Монитора

jvmtiError
RawMonitorExit(jvmtiEnv* env,
            jrawMonitorID monitor)
Выпустите монопольное владение необработанного монитора.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Эта функция может быть вызвана от обратных вызовов до итеративных функций "Кучи", или от обработчиков событий для GarbageCollectionStart, GarbageCollectionFinish, и ObjectFree события. 341.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
monitorjrawMonitorID Монитор

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NOT_MONITOR_OWNER Не контролируют владельца
JVMTI_ERROR_INVALID_MONITOR monitor не jrawMonitorID.

Необработанный Монитор Ожидает

jvmtiError
RawMonitorWait(jvmtiEnv* env,
            jrawMonitorID monitor,
            jlong millis)
Ожидайте уведомления о необработанном мониторе.

Заставляет текущий поток ожидать до любого другого потока вызовы RawMonitorNotify или RawMonitorNotifyAll для указанного необработанного монитора, или указанного тайм-аута протек.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Эта функция может быть вызвана от обратных вызовов до итеративных функций "Кучи", или от обработчиков событий для GarbageCollectionStart, GarbageCollectionFinish, и ObjectFree события. 351.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
monitorjrawMonitorID Монитор
millisjlong Тайм-аут, в миллисекундах. Если тайм-аут является нулем, то реальное время не учитывается, и поток просто ожидает пока не уведомлено.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NOT_MONITOR_OWNER Не контролируют владельца
JVMTI_ERROR_INTERRUPT Ожидайте был прерван, попробовать еще раз
JVMTI_ERROR_INVALID_MONITOR monitor не jrawMonitorID.

Необработанный Монитор Уведомляет

jvmtiError
RawMonitorNotify(jvmtiEnv* env,
            jrawMonitorID monitor)
Уведомьте единственный поток, ожидающий относительно необработанного монитора.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Эта функция может быть вызвана от обратных вызовов до итеративных функций "Кучи", или от обработчиков событий для GarbageCollectionStart, GarbageCollectionFinish, и ObjectFree события. 361.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
monitorjrawMonitorID Монитор

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NOT_MONITOR_OWNER Не контролируют владельца
JVMTI_ERROR_INVALID_MONITOR monitor не jrawMonitorID.

Необработанный Монитор Уведомляет Все

jvmtiError
RawMonitorNotifyAll(jvmtiEnv* env,
            jrawMonitorID monitor)
Уведомьте все потоки, ожидающие относительно необработанного монитора.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Эта функция может быть вызвана от обратных вызовов до итеративных функций "Кучи", или от обработчиков событий для GarbageCollectionStart, GarbageCollectionFinish, и ObjectFree события. 371.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
monitorjrawMonitorID Монитор

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NOT_MONITOR_OWNER Не контролируют владельца
JVMTI_ERROR_INVALID_MONITOR monitor не jrawMonitorID.


Перехват Функции JNI

Функции Перехвата Функции JNI: Обеспечивает возможность прервать и снова послать Java Собственный Интерфейс (JNI) вызовы функции, управляя таблицей функции JNI. См. Функции JNI в Java Собственная Спецификация Интерфейса.

Следующий пример иллюстрирует прерывание NewGlobalRef Вызов JNI, чтобы считать ссылочное создание.
JNIEnv original_jni_Functions;
JNIEnv redirected_jni_Functions;
int my_global_ref_count = 0;

jobject
MyNewGlobalRef(JNIEnv *jni_env, jobject lobj) {
   ++my_global_ref_count;
   return originalJNIFunctions->NewGlobalRef(env, lobj);
}

void
myInit() {
   jvmtiError err;

   err = (*jvmti_env)->GetJNIFunctionTable(jvmti_env, &original_jni_Functions);
   if (err != JVMTI_ERROR_NONE) {
      die();
   }
   err = (*jvmti_env)->GetJNIFunctionTable(jvmti_env, &redirected_jni_Functions);
   if (err != JVMTI_ERROR_NONE) {
      die();
   }
   redirectedJNIFunctions->NewGlobalRef = MyNewGlobalRef;
      err = (*jvmti_env)->SetJNIFunctionTable(jvmti_env, redirected_jni_Functions);
   if (err != JVMTI_ERROR_NONE) {
      die();
   }
}
      
Когда-то после myInit вызывается код JNI пользователя выполняется, который выполняет вызов, чтобы создать новую глобальную ссылку. Вместо того, чтобы идти в нормальную реализацию JNI вызов идет в myNewGlobalRef. Отметьте, что копия исходной функциональной таблицы сохраняется так, чтобы нормальная функция JNI могла быть вызвана после того, как данные собираются. Отметьте также, что любые функции JNI, которые не перезаписываются, будут обычно вести себя.


Накройте на Стол Функции JNI

jvmtiError
SetJNIFunctionTable(jvmtiEnv* env,
            const jniNativeInterface* function_table)
Накройте на стол функции JNI во всех текущих и будущих средах JNI. В результате все будущие вызовы JNI направляются к указанным функциям. Использовать GetJNIFunctionTable заставить функциональную таблицу передавать к этой функции. Для этой функции, чтобы вступить в силу обновленные записи таблицы должны использоваться клиентами JNI. Так как таблица определяется const некоторые компиляторы могут оптимизировать далеко доступ к таблице, таким образом препятствуя тому этой функции вступить в силу. Таблица копируется - изменяется на локальную копию таблицы, не имеют никакого эффекта. Эта функция влияет только на функциональную таблицу, все другие аспекты среды незатронуты. См. примеры выше.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 1201.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
function_tableconst jniNativeInterface * Точки к новой таблице функции JNI.

Агент передает в указателе на jniNativeInterface.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER function_table NULL.

Получите Таблицу Функции JNI

jvmtiError
GetJNIFunctionTable(jvmtiEnv* env,
            jniNativeInterface** function_table)
Получите таблицу функции JNI. Таблица функции JNI копируется в выделенную память. Если SetJNIFunctionTable был вызван, измененный (не оригинал), функциональная таблица возвращается. Только функциональная таблица копируется, никакие другие аспекты среды не копируются. См. примеры выше.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Нет 1211.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
function_table jniNativeInterface ** По возврату, *function_table указывает на недавно выделенную копию таблицы функции JNI.

Агент передает указатель на a jniNativeInterface*. По возврату, jniNativeInterface* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER function_table NULL.


Организация мероприятий

Функции Организации мероприятий: Типы Организации мероприятий:


Обратные вызовы События набора

jvmtiError
SetEventCallbacks(jvmtiEnv* env,
            const jvmtiEventCallbacks* callbacks,
            jint size_of_callbacks)
Установите функции, которые вызовут для каждого события. Обратные вызовы определяются, предоставляя заменяющую таблицу функции. Функциональная таблица копируется - изменяется на локальную копию таблицы, не имеют никакого эффекта. Это - атомарное действие, все обратные вызовы устанавливаются сразу. Никакие события не отправляются прежде, чем эта функция вызывается. Когда запись NULL или когда событие вне size_of_callbacks никакое событие не отправляется. Детали о событиях описываются позже в этом документе. Событие должно быть включено и иметь обратный вызов, чтобы быть отправленным - порядок в который эта функция и SetEventNotificationMode вызываются не влияет на результат.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время OnLoad или живой фазы Нет 1221.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
callbacksconst jvmtiEventCallbacks * Новые обратные вызовы события.

Агент передает в указателе на jvmtiEventCallbacks. Если callbacks NULL, удалите существующие обратные вызовы.
size_of_callbacksjint sizeof(jvmtiEventCallbacks)- для совместимости версии.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_ILLEGAL_ARGUMENT size_of_callbacks меньше чем 0.

Установите Режим Уведомления о событии

typedef enum {
    JVMTI_ENABLE = 1,
    JVMTI_DISABLE = 0
} jvmtiEventMode;
jvmtiError
SetEventNotificationMode(jvmtiEnv* env,
            jvmtiEventMode mode,
            jvmtiEvent event_type,
            jthread event_thread,
             ...)
Управляйте генерацией событий.
Событие, Enable/Disable (jvmtiEventMode)
Постоянный Значение Описание
JVMTI_ENABLE1 Если mode JVMTI_ENABLE, событие event_type будет включен
JVMTI_DISABLE0 Если mode JVMTI_DISABLE, событие event_type будет отключен
Если thread NULL, событие включается или отключается глобально; иначе, это включается или отключается для определенного потока. Событие сгенерировано для определенного потока, если оно включается или в потоке или в глобальных уровнях.

См. ниже для информации об определенных событиях.

Следующими событиями нельзя управлять на уровне потока через эту функцию.

Первоначально, никакие события не включаются или на уровне потока или на глобальном уровне.

Любые необходимые возможности (см., что Событие Включает Возможностям ниже) должны находиться в собственности прежде, чем вызвать эту функцию.

Детали о событиях описываются ниже.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время OnLoad или живой фазы Нет 21.0

Возможности
Необходимая Функциональность
Возможности Включения события
Возможность События
can_generate_field_modification_eventsFieldModification
can_generate_field_access_eventsFieldAccess
can_generate_single_step_eventsSingleStep
can_generate_exception_eventsException
ExceptionCatch
can_generate_frame_pop_eventsFramePop
can_generate_breakpoint_eventsBreakpoint
can_generate_method_entry_eventsMethodEntry
can_generate_method_exit_eventsMethodExit
can_generate_compiled_method_load_eventsCompiledMethodLoad
CompiledMethodUnload
can_generate_monitor_eventsMonitorContendedEnter
MonitorContendedEntered
MonitorWait
MonitorWaited
can_generate_vm_object_alloc_eventsVMObjectAlloc
can_generate_native_method_bind_eventsNativeMethodBind
can_generate_garbage_collection_eventsGarbageCollectionStart
GarbageCollectionFinish
can_generate_object_free_eventsObjectFree

Параметры
Имя Ввести Описание
modejvmtiEventMode JVMTI_ENABLE или JVMTI_DISABLE
event_typejvmtiEvent событие, чтобы управлять
event_thread jthread Поток, чтобы управлять

Если event_thread NULL, событием управляют на глобальном уровне.
...... для будущего расширения

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_INVALID_THREAD event_thread не -NULL и не допустимый поток.
JVMTI_ERROR_THREAD_NOT_ALIVE event_thread не -NULL и не живо (не был запущен или теперь мертв).
JVMTI_ERROR_ILLEGAL_ARGUMENT управление уровнем потока было предпринято на событиях, которые не разрешают управление уровнем потока.
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Необходимая Возможность Включения События не находится в собственности.
JVMTI_ERROR_ILLEGAL_ARGUMENT mode не jvmtiEventMode.
JVMTI_ERROR_INVALID_EVENT_TYPE event_type не jvmtiEvent.

Генерируйте События

jvmtiError
GenerateEvents(jvmtiEnv* env,
            jvmtiEvent event_type)
Генерируйте события, чтобы представить текущее состояние VM. Например, если event_type JVMTI_EVENT_COMPILED_METHOD_LOAD, a CompiledMethodLoad событие будет отправлено за каждым в настоящий момент скомпилированным методом. Методы, которые были загружены и теперь были разгружены, не отправляются. История того, что были ранее отправлены события, не производит то, что события отправляются этой функцией - например, все в настоящий момент скомпилированные методы будут отправлены каждый раз, когда эта функция вызывается.

Эта функция полезна, когда события, возможно, были пропущены из-за агента, присоединяющего после того, как выполнение программы начинается; эта функция генерирует пропущенные события.

Попытки выполнить код языка программирования Java или функции JNI могут быть приостановлены до этой функции возвраты - таким образом, ни одного нельзя вызвать от потока, отправляющего событие. Эта функция возвращается только после того, как пропущенные события были отправлены, обработаны и возвратились. Событие может быть отправлено на различном потоке чем поток, на котором событие имело место. Обратный вызов для события должен быть установлен с SetEventCallbacks и с событием нужно включить SetEventNotificationMode или события не будут иметь место. Если у VM больше нет информации, чтобы генерировать некоторых или все требуемые события, события просто не отправляются - никакая ошибка не возвращается.

Только следующие события поддерживаются:

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1231.0

Возможности
Необходимая Функциональность
Дополнительные функции
Возможность Эффект
can_generate_compiled_method_load_events Может генерировать события, когда метод компилируется или разгружается

Параметры
Имя Ввести Описание
event_typejvmtiEvent Тип события, чтобы генерировать. Должен быть один из них:

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY event_type JVMTI_EVENT_COMPILED_METHOD_LOAD и can_generate_compiled_method_load_events false.
JVMTI_ERROR_ILLEGAL_ARGUMENT event_type кроме JVMTI_EVENT_COMPILED_METHOD_LOAD или JVMTI_EVENT_DYNAMIC_CODE_GENERATED.
JVMTI_ERROR_INVALID_EVENT_TYPE event_type не jvmtiEvent.


Механизм расширения

Функции Механизма расширения: Механизм расширения функционирует типы: Типы Механизма расширения: Эти функции позволяют JVM 

У и функций расширения и событий расширения есть параметры, у каждого из которых есть 'тип' и 'вид', выбранный из следующих таблиц:
Типы Параметра Функции/События расширения (jvmtiParamTypes)
Постоянный Значение Описание
JVMTI_TYPE_JBYTE101 Тип примитива языка программирования Java - byte. Тип JNI jbyte.
JVMTI_TYPE_JCHAR102 Тип примитива языка программирования Java - char. Тип JNI jchar.
JVMTI_TYPE_JSHORT103 Тип примитива языка программирования Java - short. Тип JNI jshort.
JVMTI_TYPE_JINT104 Тип примитива языка программирования Java - int. Тип JNI jint.
JVMTI_TYPE_JLONG105 Тип примитива языка программирования Java - long. Тип JNI jlong.
JVMTI_TYPE_JFLOAT106 Тип примитива языка программирования Java - float. Тип JNI jfloat.
JVMTI_TYPE_JDOUBLE107 Тип примитива языка программирования Java - double. Тип JNI jdouble.
JVMTI_TYPE_JBOOLEAN108 Тип примитива языка программирования Java - boolean. Тип JNI jboolean.
JVMTI_TYPE_JOBJECT109 Язык программирования Java возражает типу - java.lang.Object. Тип JNI jobject. Возвращенные значения являются JNI локальные ссылки и должны управляться.
JVMTI_TYPE_JTHREAD110 Язык программирования Java возражает типу - java.lang.Thread. JVM jthread. Возвращенные значения являются JNI локальные ссылки и должны управляться.
JVMTI_TYPE_JCLASS111 Язык программирования Java возражает типу - java.lang.Class. Тип JNI jclass. Возвращенные значения являются JNI локальные ссылки и должны управляться.
JVMTI_TYPE_JVALUE112 Объединение всего языка программирования Java примитивные и объектные типы - тип JNI jvalue. Возвращенные значения, которые представляют объектные типы, являются JNI локальные ссылки и должны управляться.
JVMTI_TYPE_JFIELDID113 Полевой идентификатор языка программирования Java - тип JNI jfieldID.
JVMTI_TYPE_JMETHODID114 Идентификатор метода языка программирования Java - тип JNI jmethodID.
JVMTI_TYPE_CCHAR115 C тип языка программирования - char.
JVMTI_TYPE_CVOID116 C тип языка программирования - void.
JVMTI_TYPE_JNIENV117 Среда JNI - JNIEnv. Должен использоваться с корректным jvmtiParamKind сделать это типом указателя.
Виды Параметра Функции/События расширения (jvmtiParamKind)
Постоянный Значение Описание
JVMTI_KIND_IN91 Входящий параметр - foo.
JVMTI_KIND_IN_PTR92 Входящий параметр указателя - const foo*.
JVMTI_KIND_IN_BUF93 Входящий параметр массива - const foo*.
JVMTI_KIND_ALLOC_BUF94 Исходящий выделенный параметр массива - foo**. Свободный с Deallocate.
JVMTI_KIND_ALLOC_ALLOC_BUF95 Исходящий выделенный массив выделенного параметра массивов - foo***. Свободный с Deallocate.
JVMTI_KIND_OUT96 Исходящий параметр - foo*.
JVMTI_KIND_OUT_BUF97 Исходящий параметр массива (предварительно выделенный агентом) - foo*. Не делать Deallocate.

Информация Параметра Функции/События расширения

typedef struct {
    char* name;
    jvmtiParamKind kind;
    jvmtiParamTypes base_type;
    jboolean null_ok;
} jvmtiParamInfo;
jvmtiParamInfo - Информация Параметра Функции/События расширения
Поле Ввести Описание
namechar* Название параметра, закодированное как измененная строка UTF-8
kindjvmtiParamKind Вид параметра - вводит модификаторы
base_typejvmtiParamTypes Базовый тип параметра - измененный kind
null_okjboolean A NULL параметр разрешается? Применяется только к указателю и объектным типам.


Функция расширения

typedef jvmtiError (JNICALL *jvmtiExtensionFunction)
    (jvmtiEnv* jvmti_env, 
      ...);
Это - специфичная для реализации функция расширения.

Параметры
Имя Ввести Описание
jvmti_env jvmtiEnv * JVM 
...... Расширение функционально-специализированные параметры

Получите Функции Расширения

typedef struct {
    jvmtiExtensionFunction func;
    char* id;
    char* short_description;
    jint param_count;
    jvmtiParamInfo* params;
    jint error_count;
    jvmtiError* errors;
} jvmtiExtensionFunctionInfo;
jvmtiError
GetExtensionFunctions(jvmtiEnv* env,
            jint* extension_count_ptr,
            jvmtiExtensionFunctionInfo** extensions)
Возвращает набор функций расширения.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время OnLoad или живой фазы Нет 1241.0

Возможности
Необходимая Функциональность

jvmtiExtensionFunctionInfo - Информация Функции расширения
Поле Ввести Описание
func jvmtiExtensionFunction Фактическая функция, чтобы вызвать
idchar* Идентификатор для функции расширения, закодированной как измененная строка UTF-8. Соглашения о присвоении имен пакета использования. Например, com.sun.hotspot.bar
short_descriptionchar* Одно описание предложения функции, закодированной как измененная строка UTF-8.
param_countjint Число параметров, исключая jvmtiEnv *jvmti_env
params jvmtiParamInfo * Массив param_count параметры (jvmtiEnv *jvmti_env исключенный)
error_countjint Число возможных ошибочных возвратов (исключая универсальные ошибки)
errors jvmtiError * Массив error_count возможные ошибки

Параметры
Имя Ввести Описание
extension_count_ptrjint* По возврату, точкам к числу функций расширения

Агент передает указатель на a jint. По возврату, jint был установлен.
extensionsjvmtiExtensionFunctionInfo** Возвращает массив информации функции расширения, один на функцию

Агент передает указатель на a jvmtiExtensionFunctionInfo*. По возврату, jvmtiExtensionFunctionInfo* точки недавно выделенному массиву размера *extension_count_ptr. Массив должен быть освобожден с Deallocate. Указатели возвратились в поле id из jvmtiExtensionFunctionInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле short_description из jvmtiExtensionFunctionInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле params из jvmtiExtensionFunctionInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле name из jvmtiParamInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле errors из jvmtiExtensionFunctionInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER extension_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER extensions NULL.

Получите События Расширения

typedef struct {
    jint extension_event_index;
    char* id;
    char* short_description;
    jint param_count;
    jvmtiParamInfo* params;
} jvmtiExtensionEventInfo;
jvmtiError
GetExtensionEvents(jvmtiEnv* env,
            jint* extension_count_ptr,
            jvmtiExtensionEventInfo** extensions)
Возвращает набор событий расширения.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время OnLoad или живой фазы Нет 1251.0

Возможности
Необходимая Функциональность

jvmtiExtensionEventInfo - Информация События расширения
Поле Ввести Описание
extension_event_indexjint Идентификация индексирует события
idchar* Идентификатор для события расширения, закодированного как измененная строка UTF-8. Соглашения о присвоении имен пакета использования. Например, com.sun.hotspot.bar
short_descriptionchar* Одно описание предложения события, закодированного как измененная строка UTF-8.
param_countjint Число параметров, исключая jvmtiEnv *jvmti_env
params jvmtiParamInfo * Массив param_count параметры (jvmtiEnv *jvmti_env исключенный)

Параметры
Имя Ввести Описание
extension_count_ptrjint* По возврату, точкам к числу событий расширения

Агент передает указатель на a jint. По возврату, jint был установлен.
extensionsjvmtiExtensionEventInfo** Возвращает массив информации события расширения, один на событие

Агент передает указатель на a jvmtiExtensionEventInfo*. По возврату, jvmtiExtensionEventInfo* точки недавно выделенному массиву размера *extension_count_ptr. Массив должен быть освобожден с Deallocate. Указатели возвратились в поле id из jvmtiExtensionEventInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле short_description из jvmtiExtensionEventInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле params из jvmtiExtensionEventInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле name из jvmtiParamInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER extension_count_ptr NULL.
JVMTI_ERROR_NULL_POINTER extensions NULL.

Событие расширения

typedef void (JNICALL *jvmtiExtensionEvent)
    (jvmtiEnv* jvmti_env, 
      ...);
Это - специфичное для реализации событие. Обработчик событий устанавливается с SetExtensionEventCallback.

Обработчики событий для событий расширения должны быть объявлены varargs, чтобы соответствовать это определение. Отказ сделать так мог привести к несоответствию соглашения о вызовах и неопределенному поведению на некоторых платформах.

Например, если jvmtiParamInfo возвращенный GetExtensionEvents указывает, что есть a jint параметр, обработчик событий должен быть объявлен:
    void JNICALL myHandler(jvmtiEnv* jvmti_env, jint myInt, ...)
Отметьте терминал"..."который указывает на varargs.

Параметры
Имя Ввести Описание
jvmti_env jvmtiEnv * JVM 
...... Расширение специфичные для события параметры

Обратный вызов События Расширения набора

jvmtiError
SetExtensionEventCallback(jvmtiEnv* env,
            jint extension_event_index,
            jvmtiExtensionEvent callback)
Устанавливает функцию обратного вызова для события расширения и включает событию. Или, если обратный вызов NULL, отключает событие. Отметьте, что в отличие от стандартных событий, устанавливая обратный вызов и включая событию единственная работа.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время OnLoad или живой фазы Нет 1261.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
extension_event_indexjint Идентифицирует который обратный вызов установить. Это индексирует, extension_event_index поле jvmtiExtensionEventInfo.
callback jvmtiExtensionEvent Если callback не -NULL, набор callback быть функцией обратного вызова события и включать событию.

Если callback NULL, отключите событие.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_ILLEGAL_ARGUMENT extension_event_index не extension_event_index возвращенный GetExtensionEvents


Возможность

Функции возможности: Типы возможности: Функции возможностей позволяют Вам изменять функциональность, доступную JVM  

Раздел "Возможностей" каждой функции и события описывает, с какими возможностями, если таковые вообще имеются, они связываются. "Необходимая Функциональность" означает, что это доступно для использования, и никакие возможности не должны быть добавлены, чтобы использовать это. "Дополнительная Функциональность" означает, что агент должен обладать возможностью прежде, чем это сможет использоваться. Чтобы обладать возможностью, агент должен добавить возможность. "Дополнительные функции" описывают возможности, которые, если добавлено, расширяют набор функций.

Потенциально доступные возможности каждой JVM  Часто, добавление возможности может подвергнуться стоимости в скорости выполнения, время запуска, и/или объем потребляемой памяти. Отметьте, что издержки использования возможности абсолютно отличаются чем издержки обладания возможностью. Возьмите единственное продвижение в качестве примера. Когда единственное продвижение идет (то есть, когда событие включается и таким образом активно передающие события), издержки отправки и обработки события на каждой инструкции огромны в любой реализации. Однако, издержки обладания возможностью могут быть маленькими или большими, в зависимости от реализации. Кроме того, когда и если возможность потенциально доступна, зависит от реализации. Некоторые примеры:

У каждой среды JVM есть свой собственный набор возможностей. Первоначально, тот набор пуст. Любая требуемая возможность должна быть добавлена. Если возможный, возможности должны быть добавлены во время OnLoad фаза. Для наиболее виртуальных машин определенные возможности требуют специального набора для виртуальной машины, и это устанавливало, должен произойти во время OnLoad фаза, прежде, чем виртуальная машина начинает выполнение. Как только возможность добавляется, она может только быть удалена если явно оставлено средой.

Агент, определите, какие возможности этот VM может потенциально обеспечить, могут добавить возможности, которые будут использоваться, возможности выпуска, которые больше не необходимы, и исследуют в настоящий момент доступные возможности.

Примеры возможности

Например, недавно запущенный агент (в OnLoad функция), хочет включить всем возможным возможностям. Отметьте, что, вообще, это не желательно, поскольку агент может перенести потерю производительности для функциональности, это не использует. Код мог бы быть похожим на это в C:
	jvmtiCapabilities capa;
	jvmtiError err;

	err = (*jvmti)->GetPotentialCapabilities(jvmti, &capa);
	if (err == JVMTI_ERROR_NONE) {
	   err = (*jvmti)->AddCapabilities(jvmti, &capa);
      
Например, если агент хочет проверить, может ли это получить байт-коды метода (то есть, это хочет проверить, добавило ли это ранее эту возможность и не оставило это), код мог бы быть похожим на это в C:
	jvmtiCapabilities capa;
	jvmtiError err;

	err = (*jvmti)->GetCapabilities(jvmti, &capa);
	if (err == JVMTI_ERROR_NONE) {
   	   if (capa.can_get_bytecodes) { ... } } 
      

Структура Возможностей

Функции в этой категории используют эту структуру возможностей, которая содержит булевы флаги, соответствующие каждой возможности:

typedef struct {
    unsigned int can_tag_objects : 1;
    unsigned int can_generate_field_modification_events : 1;
    unsigned int can_generate_field_access_events : 1;
    unsigned int can_get_bytecodes : 1;
    unsigned int can_get_synthetic_attribute : 1;
    unsigned int can_get_owned_monitor_info : 1;
    unsigned int can_get_current_contended_monitor : 1;
    unsigned int can_get_monitor_info : 1;
    unsigned int can_pop_frame : 1;
    unsigned int can_redefine_classes : 1;
    unsigned int can_signal_thread : 1;
    unsigned int can_get_source_file_name : 1;
    unsigned int can_get_line_numbers : 1;
    unsigned int can_get_source_debug_extension : 1;
    unsigned int can_access_local_variables : 1;
    unsigned int can_maintain_original_method_order : 1;
    unsigned int can_generate_single_step_events : 1;
    unsigned int can_generate_exception_events : 1;
    unsigned int can_generate_frame_pop_events : 1;
    unsigned int can_generate_breakpoint_events : 1;
    unsigned int can_suspend : 1;
    unsigned int can_redefine_any_class : 1;
    unsigned int can_get_current_thread_cpu_time : 1;
    unsigned int can_get_thread_cpu_time : 1;
    unsigned int can_generate_method_entry_events : 1;
    unsigned int can_generate_method_exit_events : 1;
    unsigned int can_generate_all_class_hook_events : 1;
    unsigned int can_generate_compiled_method_load_events : 1;
    unsigned int can_generate_monitor_events : 1;
    unsigned int can_generate_vm_object_alloc_events : 1;
    unsigned int can_generate_native_method_bind_events : 1;
    unsigned int can_generate_garbage_collection_events : 1;
    unsigned int can_generate_object_free_events : 1;
    unsigned int can_force_early_return : 1;
    unsigned int can_get_owned_monitor_stack_depth_info : 1;
    unsigned int can_get_constant_pool : 1;
    unsigned int can_set_native_method_prefix : 1;
    unsigned int can_retransform_classes : 1;
    unsigned int can_retransform_any_class : 1;
    unsigned int can_generate_resource_exhaustion_heap_events : 1;
    unsigned int can_generate_resource_exhaustion_threads_events : 1;
    unsigned int : 7;
    unsigned int : 16;
    unsigned int : 16;
    unsigned int : 16;
    unsigned int : 16;
    unsigned int : 16;
} jvmtiCapabilities;
jvmtiCapabilities - Структура Возможностей
Все типы unsigned int : 1
Поле Описание С тех пор
can_tag_objects Может установить и получить теги, как описано в категории "Кучи". 1.0
can_generate_field_modification_events Может установить контрольные точки на полевой модификации - SetFieldModificationWatch 1.0
can_generate_field_access_events Может установить контрольные точки на доступе к полю - SetFieldAccessWatch 1.0
can_get_bytecodes Может получить байт-коды метода GetBytecodes 1.0
can_get_synthetic_attribute Может протестировать, если поле или метод являются синтетическими - IsFieldSynthetic и IsMethodSynthetic 1.0
can_get_owned_monitor_info Может получить информацию о владении мониторов - GetOwnedMonitorInfo 1.0
can_get_current_contended_monitor Может GetCurrentContendedMonitor 1.0
can_get_monitor_info Может GetObjectMonitorUsage 1.0
can_pop_frame Может вытолкать фреймы от стека - PopFrame 1.0
can_redefine_classes Может пересмотреть классы с RedefineClasses. 1.0
can_signal_thread Может отправить остановку или прерывание к потокам 1.0
can_get_source_file_name Может получить имя исходного файла class 1.0
can_get_line_numbers Может получить таблицу номера строки метода 1.0
can_get_source_debug_extension Может получить исходное расширение отладки class 1.0
can_access_local_variables Может установить и получить локальные переменные 1.0
can_maintain_original_method_order Может возвратить методы в порядке, они происходят в файле class 1.0
can_generate_single_step_events Может получить единственные события шага 1.0
can_generate_exception_events Могли бросить исключение и события выгоды исключения 1.0
can_generate_frame_pop_events Может установить и таким образом добраться FramePop события 1.0
can_generate_breakpoint_events Может установить и таким образом добраться Breakpoint события 1.0
can_suspend Может приостановить и возобновить потоки 1.0
can_redefine_any_class Может изменить (повторно преобразуйте или пересмотрите), любой непримитивный немассив class. См. IsModifiableClass. 1.0
can_get_current_thread_cpu_time Может получить процессорное время текущего потока 1.0
can_get_thread_cpu_time Может получить процессорное время потока 1.0
can_generate
_method_entry_events
Может генерировать события записи метода при вводе метода 1.0
can_generate
_method_exit_events
Может генерировать события выхода метода при отъезде метода 1.0
can_generate
_all_class_hook_events
Может генерировать события ClassFileLoadHook для каждого загруженного class. 1.0
can_generate
_compiled_method_load_events
Может генерировать события, когда метод компилируется или разгружается 1.0
can_generate
_monitor_events
Может генерировать события на действии монитора 1.0
can_generate
_vm_object_alloc_events
Может генерировать события на выделении VM объекта 1.0
can_generate
_native_method_bind_events
Может генерировать события, когда собственный метод связывается с его реализацией 1.0
can_generate
_garbage_collection_events
Может генерировать события, когда сборка "мусора" начинается или заканчивается 1.0
can_generate
_object_free_events
Может генерировать события, когда сборщик "мусора" освобождает объект 1.0
can_force_early_return Может возвратиться рано из метода, как описано в Силе Ранняя категория Возврата. 1.1
can_get_owned_monitor_stack_depth_info Может получить информацию о находящихся в собственности мониторах с глубиной стека - GetOwnedMonitorStackDepthInfo 1.1
can_get_constant_pool Может получить постоянный пул class - GetConstantPool 1.1
can_set_native_method_prefix Может установить префикс, который будет применен, когда собственный метод не может быть разрешен - SetNativeMethodPrefix и SetNativeMethodPrefixes 1.1
can_retransform_classes Может повторно преобразовать классы с RetransformClasses. В дополнение к ограничениям, введенным определенной реализацией для этой возможности (см. раздел Возможности), эта возможность должна быть установлена перед ClassFileLoadHook событие включается впервые в этой среде. Среда, которая обладает этой возможностью в то время, когда ClassFileLoadHook включается впервые, как говорят, способное перепреобразование. Среда, которая не обладает этой возможностью в то время, когда ClassFileLoadHook включается впервые, как говорят, неспособное перепреобразование. 1.1
can_retransform_any_class RetransformClasses может быть вызван на любом class (can_retransform_classes должен также быть установлен), 1.1
can_generate_resource_exhaustion_heap_events Может генерировать события, когда VM неспособен выделить память от "кучи" платформы JavaTM. См. ResourceExhausted. 1.1
can_generate_resource_exhaustion_threads_events Может генерировать события, когда VM неспособен создать поток. См. ResourceExhausted. 1.1


Получите Потенциальные Возможности

jvmtiError
GetPotentialCapabilities(jvmtiEnv* env,
            jvmtiCapabilities* capabilities_ptr)
Возвраты через capabilities_ptr  фаза JVM жива, и определенные возможности могут только быть добавлены во время OnLoad фаза. AddCapabilities функция может использоваться, чтобы установить любого или эти возможности. Включаются в настоящий момент находившиеся в собственности возможности.

Обычно эта функция используется в OnLoad функция. Некоторые виртуальные машины могут позволить ограниченному набору возможностей быть добавленным в живой фазе. В этом случае набор потенциально доступных возможностей будет, вероятно, отличаться от OnLoad фазовый набор.

См. Примеры Возможности.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время OnLoad или живой фазы Нет 1401.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
capabilities_ptrjvmtiCapabilities* По возврату, точкам к JVM 

Агент передает указатель на a jvmtiCapabilities. По возврату, jvmtiCapabilities был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER capabilities_ptr NULL.

Добавьте Возможности

jvmtiError
AddCapabilities(jvmtiEnv* env,
            const jvmtiCapabilities* capabilities_ptr)
Установите новые возможности, добавляя возможности, значения которых устанавливаются в один (1) в *capabilities_ptr. Сохраняются все предыдущие возможности. Обычно эта функция используется в OnLoad функция. Некоторые виртуальные машины могут позволить ограниченному набору возможностей быть добавленным в живой фазе.

См. Примеры Возможности.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время OnLoad или живой фазы Нет 1421.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
capabilities_ptrconst jvmtiCapabilities* Точки к JVM 

Агент передает в указателе на jvmtiCapabilities.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NOT_AVAILABLE Требуемые возможности не даже потенциально доступны.
JVMTI_ERROR_NULL_POINTER capabilities_ptr NULL.

Оставьте Возможности

jvmtiError
RelinquishCapabilities(jvmtiEnv* env,
            const jvmtiCapabilities* capabilities_ptr)
Оставьте возможности, значения которых устанавливаются в один (1) в *capabilities_ptr. Некоторые реализации могут позволить только одной среде иметь возможность (см. введение возможности). Эта функция выпускает возможности так, чтобы они могли использоваться другими агентами. Все другие возможности сохраняются. Возможность больше не будет присутствовать в GetCapabilities. Попытка оставить возможность, которой не обладает агент, не является ошибкой.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время OnLoad или живой фазы Нет 1431.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
capabilities_ptrconst jvmtiCapabilities* Точки к JVM 

Агент передает в указателе на jvmtiCapabilities.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER capabilities_ptr NULL.

Получите Возможности

jvmtiError
GetCapabilities(jvmtiEnv* env,
            jvmtiCapabilities* capabilities_ptr)
Возвраты через capabilities_ptr дополнительная JVM 1) в соответствующем поле структуры возможностей. Среда не обладает возможностью, если она не была успешно добавлена с AddCapabilities. Среда только теряет владение возможностью, если это было оставлено с RelinquishCapabilities. Таким образом эта функция возвращает конечный результат AddCapabilities и RelinquishCapabilities вызовы, которые были выполнены.

См. Примеры Возможности.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Нет 891.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
capabilities_ptrjvmtiCapabilities* По возврату, точкам к JVM 

Агент передает указатель на a jvmtiCapabilities. По возврату, jvmtiCapabilities был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER capabilities_ptr NULL.


Таймеры

Функции таймеров: Типы таймеров: Эти функции предоставляют информацию о синхронизации. Разрешение, в котором обновляется время, не определяется. Они обеспечивают точность наносекунды, но не обязательно точность наносекунды. К деталям о таймерах, таких как их максимальные значения, можно получить доступ с функциями информации о таймере.

Информация таймера

Информационная функция для каждого таймера возвращает эту структуру данных.

typedef struct {
    jlong max_value;
    jboolean may_skip_forward;
    jboolean may_skip_backward;
    jvmtiTimerKind kind;
    jlong reserved1;
    jlong reserved2;
} jvmtiTimerInfo;
jvmtiTimerInfo - Информация таймера
Поле Ввести Описание
max_valuejlong Значение максимума таймер может достигнуть. После того, как это значение достигается обертки таймера назад, чтобы обнулить. Это - значение без знака. Если тестирующийся или печатающийся как jlong (подписанное значение) это, может казаться, отрицательное число.
may_skip_forwardjboolean Если это правда, таймер может быть внешне скорректирован и в результате пропустить вперед. Если ложь, значение таймера никогда не будет увеличиваться быстрее чем реальное время.
may_skip_backwardjboolean Если это правда, таймер может быть внешне скорректирован и в результате пропустить назад. Если ложь, значение таймера будет монотонно увеличиваться.
kindjvmtiTimerKind Вид таймера. На платформе, которая не различает пользователя и системное время, JVMTI_TIMER_TOTAL_CPU возвращается.
reserved1jlong Зарезервированный для будущего использования.
reserved2jlong Зарезервированный для будущего использования.
Где вид таймера-
Виды таймера (jvmtiTimerKind)
Постоянный Значение Описание
JVMTI_TIMER_USER_CPU30 Процессорное время, что поток находится в непривилегированном режиме.
JVMTI_TIMER_TOTAL_CPU31 Процессорное время, что поток находится в системном режиме или пользователе.
JVMTI_TIMER_ELAPSED32 Прошедшее время.


Получите информацию Таймера ЦП Текущего потока

jvmtiError
GetCurrentThreadCpuTimerInfo(jvmtiEnv* env,
            jvmtiTimerInfo* info_ptr)
Получите информацию о GetCurrentThreadCpuTime таймер. Поля jvmtiTimerInfo структура заполнена в деталями о таймере. Эта информация является определенной для платформы и реализации GetCurrentThreadCpuTime и таким образом не изменяется потоком, и при этом он не изменяется во время определенного вызова VM.

Отметьте что реализации GetCurrentThreadCpuTime и GetThreadCpuTime может отличаться, и таким образом значения, возвращенные GetCurrentThreadCpuTimerInfo и GetThreadCpuTimerInfo может отличаться - см. GetCurrentThreadCpuTime для получения дополнительной информации.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Эта функция может быть вызвана от обратных вызовов до итеративных функций "Кучи", или от обработчиков событий для GarbageCollectionStart, GarbageCollectionFinish, и ObjectFree события. 1341.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_get_current_thread_cpu_time Может получить процессорное время текущего потока.

Параметры
Имя Ввести Описание
info_ptrjvmtiTimerInfo* По возврату, заполненному информацией, описывающей время, возвращенное GetCurrentThreadCpuTime.

Агент передает указатель на a jvmtiTimerInfo. По возврату, jvmtiTimerInfo был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_get_current_thread_cpu_time. Использовать AddCapabilities.
JVMTI_ERROR_NULL_POINTER info_ptr NULL.

Получите Процессорное время Текущего потока

jvmtiError
GetCurrentThreadCpuTime(jvmtiEnv* env,
            jlong* nanos_ptr)
Возвратите процессорное время, используемое текущим потоком.

Отметьте что GetThreadCpuTime функция обеспечивает процессорное время для любого потока, включая текущий поток. GetCurrentThreadCpuTime существует, чтобы поддерживать платформы, которые не могут предоставить процессорное время для потоков кроме текущего потока или у которых есть более точная информация для текущего потока (см. GetCurrentThreadCpuTimerInfo по сравнению с GetThreadCpuTimerInfo). На многих платформах этот вызов будет эквивалентен:
  GetThreadCpuTime(env, NULL, nanos_ptr)

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время запуска или живой фазы Эта функция может быть вызвана от обратных вызовов до итеративных функций "Кучи", или от обработчиков событий для GarbageCollectionStart, GarbageCollectionFinish, и ObjectFree события. 1351.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_get_current_thread_cpu_time Может получить процессорное время текущего потока.

Если эта возможность включается после того, как потоки запустились, реализация может выбрать любое время до и включая время, когда возможность включается как точка, где набор процессорного времени запускается.

Эта возможность должна быть потенциально доступной на любой платформе где can_get_thread_cpu_time потенциально доступно.

Параметры
Имя Ввести Описание
nanos_ptrjlong* По возврату, точкам к процессорному времени, используемому этим потоком в наносекундах. Это - значение без знака. Если тестирующийся или печатающийся как jlong (подписанное значение) это, может казаться, отрицательное число.

Агент передает указатель на a jlong. По возврату, jlong был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_get_current_thread_cpu_time. Использовать AddCapabilities.
JVMTI_ERROR_NULL_POINTER nanos_ptr NULL.

Получите информацию Таймера ЦП Потока

jvmtiError
GetThreadCpuTimerInfo(jvmtiEnv* env,
            jvmtiTimerInfo* info_ptr)
Получите информацию о GetThreadCpuTime таймер. Поля jvmtiTimerInfo структура заполнена в деталями о таймере. Эта информация является определенной для платформы и реализации GetThreadCpuTime и таким образом не изменяется потоком, и при этом он не изменяется во время определенного вызова VM.

Отметьте что реализации GetCurrentThreadCpuTime и GetThreadCpuTime может отличаться, и таким образом значения, возвращенные GetCurrentThreadCpuTimerInfo и GetThreadCpuTimerInfo может отличаться - см. GetCurrentThreadCpuTime для получения дополнительной информации.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1361.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_get_thread_cpu_time Может получить процессорное время потока.

Параметры
Имя Ввести Описание
info_ptrjvmtiTimerInfo* По возврату, заполненному информацией, описывающей время, возвращенное GetThreadCpuTime.

Агент передает указатель на a jvmtiTimerInfo. По возврату, jvmtiTimerInfo был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_get_thread_cpu_time. Использовать AddCapabilities.
JVMTI_ERROR_NULL_POINTER info_ptr NULL.

Получите Процессорное время Потока

jvmtiError
GetThreadCpuTime(jvmtiEnv* env,
            jthread thread,
            jlong* nanos_ptr)
Возвратите процессорное время, используемое указанным потоком.

Получите информацию об этом таймере с GetThreadCpuTimerInfo.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время живой фазы Нет 1371.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возможность Эффект
can_get_thread_cpu_time Может получить процессорное время потока.

Если эта возможность включается после того, как потоки запустились, реализация может выбрать любое время до и включая время, когда возможность включается как точка, где набор процессорного времени запускается.

Параметры
Имя Ввести Описание
threadjthread Поток, чтобы запросить. Если thread NULL, текущий поток используется.
nanos_ptrjlong* По возврату, точкам к процессорному времени, используемому указанным потоком в наносекундах. Это - значение без знака. Если тестирующийся или печатающийся как jlong (подписанное значение) это, может казаться, отрицательное число.

Агент передает указатель на a jlong. По возврату, jlong был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_MUST_POSSESS_CAPABILITY Среда не обладает возможностью can_get_thread_cpu_time. Использовать AddCapabilities.
JVMTI_ERROR_INVALID_THREAD thread не объект потока.
JVMTI_ERROR_THREAD_NOT_ALIVE thread не живо (не был запущен или теперь мертв).
JVMTI_ERROR_NULL_POINTER nanos_ptr NULL.

Получите информацию Таймера

jvmtiError
GetTimerInfo(jvmtiEnv* env,
            jvmtiTimerInfo* info_ptr)
Получите информацию о GetTime таймер. Поля jvmtiTimerInfo структура заполнена в деталями о таймере. Эта информация не будет изменяться во время определенного вызова VM.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Эта функция может быть вызвана от обратных вызовов до итеративных функций "Кучи", или от обработчиков событий для GarbageCollectionStart, GarbageCollectionFinish, и ObjectFree события. 1381.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
info_ptrjvmtiTimerInfo* По возврату, заполненному информацией, описывающей время, возвращенное GetTime.

Агент передает указатель на a jvmtiTimerInfo. По возврату, jvmtiTimerInfo был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER info_ptr NULL.

Получите Время

jvmtiError
GetTime(jvmtiEnv* env,
            jlong* nanos_ptr)
Возвратите текущую стоимость системного таймера в наносекундах.

Возвращенное значение представляет наносекунды с некоторого фиксированного, но произвольного времени (возможно, в будущем, таким образом, значения могут быть отрицательными). Эта функция обеспечивает точность наносекунды, но не обязательно точность наносекунды. Никакие гарантии не делаются о том, как часто значения изменяются.

Получите информацию об этом таймере с GetTimerInfo.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Эта функция может быть вызвана от обратных вызовов до итеративных функций "Кучи", или от обработчиков событий для GarbageCollectionStart, GarbageCollectionFinish, и ObjectFree события. 1391.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
nanos_ptrjlong* По возврату, точкам ко времени в наносекундах. Это - значение без знака. Если тестирующийся или печатающийся как jlong (подписанное значение) это, может казаться, отрицательное число.

Агент передает указатель на a jlong. По возврату, jlong был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER nanos_ptr NULL.

Получите Доступные Процессоры

jvmtiError
GetAvailableProcessors(jvmtiEnv* env,
            jint* processor_count_ptr)
Возвращает число процессоров, доступных виртуальной машине Java.

Это значение может измениться во время определенного вызова виртуальной машины. Приложения, которые чувствительны к числу доступных процессоров, должны поэтому иногда опрашивать это свойство.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Нет 1441.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
processor_count_ptrjint* По возврату, точкам к максимальному количеству процессоров, доступных виртуальной машине; никогда меньший чем один.

Агент передает указатель на a jint. По возврату, jint был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER processor_count_ptr NULL.


Поиск Загрузчика класса

Функции Поиска Загрузчика класса: Эти функции позволяют агенту добавлять к расположениям, что загрузчик class ищет class. Это полезно для установки инструментария под корректным загрузчиком class.


Добавьте К Поиску Загрузчика Класса Начальной загрузки

jvmtiError
AddToBootstrapClassLoaderSearch(jvmtiEnv* env,
            const char* segment)
Эта функция может использоваться, чтобы заставить классы инструментария быть определенными начальной загрузкой загрузчик class. См. Спецификацию Виртуальной машины Java™, Главу 5.3.1. После начальной загрузки загрузчик class неудачно ищет class, указанный зависимый от платформы путь поиска segment будет искаться также. Только один сегмент может быть определен в segment. Эта функция может быть вызвана многократно, чтобы добавить многократные сегменты, сегменты будут искаться в порядке, что эта функция была вызвана.

В OnLoad поэтапно осуществите функцию, может использоваться, чтобы определить любой зависимый от платформы сегмент пути поиска, который будет искаться после начальной загрузки, загрузчик class неудачно ищет class. Сегмент обычно является файлом JAR или каталогом.

В живой фазе segment может использоваться, чтобы определить любой зависимый от платформы путь к файлу JAR. Агент должен заботиться, что файл JAR не содержит классов или ресурсов кроме тех, чтобы быть определенным начальной загрузкой загрузчик class в целях инструментария.

Спецификация Виртуальной машины Java™ определяет, что последующая попытка разрешить символьную ссылку, что виртуальная машина Java ранее неудачно попыталась разрешить всегда сбои с той же самой ошибкой, которая была брошена в результате начальной попытки разрешения. Следовательно, если файл JAR содержит запись, которая соответствует class, для которого виртуальная машина Java неудачно попыталась разрешить ссылку, тогда последующие попытки разрешить, что ссылка перестанет работать с той же самой ошибкой как начальная попытка.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время OnLoad или живой фазы Нет 1491.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
segmentconst char* Зависимый от платформы сегмент пути поиска, закодированный как измененная строка UTF-8.

Агент передает в массиве char.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_ILLEGAL_ARGUMENT segment недопустимый путь. В живой фазе что-либо кроме существующего файла JAR - недопустимый путь.
JVMTI_ERROR_NULL_POINTER segment NULL.

Добавьте К Системному Поиску Загрузчика Класса

jvmtiError
AddToSystemClassLoaderSearch(jvmtiEnv* env,
            const char* segment)
Эта функция может использоваться, чтобы заставить классы инструментария быть определенными системой загрузчик class. См. Спецификацию Виртуальной машины Java™, Главу 5.3.2. После того, как загрузчик class неудачно ищет class, указанный зависимый от платформы путь поиска segment будет искаться также. Только один сегмент может быть определен в segment. Эта функция может быть вызвана многократно, чтобы добавить многократные сегменты, сегменты будут искаться в порядке, что эта функция была вызвана.

В OnLoad поэтапно осуществите функцию, может использоваться, чтобы определить любой зависимый от платформы сегмент пути поиска, который будет искаться после системы, загрузчик class неудачно ищет class. Сегмент обычно является файлом JAR или каталогом.

В живой фазе segment зависимый от платформы путь к файлу JAR, который будет искаться после системы, загрузчик class неудачно ищет class. Агент должен заботиться, что файл JAR не содержит классов или ресурсов кроме тех, чтобы быть определенным системой загрузчик class в целях инструментария.

В живой фазе система загрузчик class поддерживает добавление файла JAR, который будет искаться, если система загрузчик class реализует имя метода appendToClassPathForInstrumentation который берет единственный параметр типа java.lang.String. Метод не обязан иметь public доступ.

Спецификация Виртуальной машины Java™ определяет, что последующая попытка разрешить символьную ссылку, что виртуальная машина Java ранее неудачно попыталась разрешить всегда сбои с той же самой ошибкой, которая была брошена в результате начальной попытки разрешения. Следовательно, если файл JAR содержит запись, которая соответствует class, для которого виртуальная машина Java неудачно попыталась разрешить ссылку, тогда последующие попытки разрешить, что ссылка перестанет работать с той же самой ошибкой как начальная попытка.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время OnLoad или живой фазы Нет 1511.1

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
segmentconst char* Зависимый от платформы сегмент пути поиска, закодированный как измененная строка UTF-8.

Агент передает в массиве char.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_ILLEGAL_ARGUMENT segment недопустимый путь. В живой фазе что-либо кроме существующего файла JAR - недопустимый путь.
JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED Работа, не поддерживаемая системой загрузчик class.
JVMTI_ERROR_NULL_POINTER segment NULL.


Системные Свойства

Системные функции Свойств: Эти функции получают и устанавливают системные свойства.


Получите Системные Свойства

jvmtiError
GetSystemProperties(jvmtiEnv* env,
            jint* count_ptr,
            char*** property_ptr)
Список системных ключей свойства VM, которые могут использоваться с GetSystemProperty возвращается. Строго рекомендуется, чтобы виртуальные машины обеспечили следующие ключи свойства: Обеспечивает доступ к системным свойствам, определенным и используемый VM. Набор свойств на командной строке включается. Это позволяет получать и устанавливать этих свойств прежде, чем VM даже начнет выполнять байт-коды. Так как это - представление VM системных свойств, набор доступных свойств будет обычно отличаться чем это в java.lang.System.getProperties. Вызов метода JNI может привыкнуть к доступу java.lang.System.getProperties.

Набор свойств может вырасти во время выполнения.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время OnLoad или живой фазы Нет 1301.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
count_ptrjint* По возврату, точкам к числу возвращенных ключей свойства.

Агент передает указатель на a jint. По возврату, jint был установлен.
property_ptrchar*** По возврату, точкам массиву ключей свойства, закодированных как изменено строки UTF-8.

Агент передает указатель на a char**. По возврату, char** точки недавно выделенному массиву размера *count_ptr, каждый элемент которого также недавно выделяется. Массив должен быть освобожден с Deallocate. Каждый из элементов должен быть освобожден с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER count_ptr NULL.
JVMTI_ERROR_NULL_POINTER property_ptr NULL.

Получите Системное Свойство

jvmtiError
GetSystemProperty(jvmtiEnv* env,
            const char* property,
            char** value_ptr)
Возвратите системное значение свойства VM, данное ключ свойства.

Функция GetSystemProperties возвращает набор ключей свойства, которые могут использоваться. Свойства, которые могут быть получены, могут вырасти во время выполнения.

Так как это - представление VM системных свойств, значения свойств могут отличаться от возвращенного java.lang.System.getProperty(String). Типичный VM мог бы скопировать значения системных свойств VM в Properties сохраненный java.lang.System во время инициализации того class. После того любые изменения к системным свойствам VM (с SetSystemProperty) или java.lang.System системные свойства (с java.lang.System.setProperty(String,String)) заставил бы значения отклоняться. Вызов метода JNI может привыкнуть к доступу java.lang.System.getProperty(String).

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время OnLoad или живой фазы Нет 1311.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
propertyconst char* Ключ свойства, чтобы получить, закодированный как измененная строка UTF-8.

Агент передает в массиве char.
value_ptrchar** По возврату, точкам к значению свойства, закодированному как измененная строка UTF-8.

Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NOT_AVAILABLE Это свойство не доступно. Использовать GetSystemProperties найти доступные свойства.
JVMTI_ERROR_NULL_POINTER property NULL.
JVMTI_ERROR_NULL_POINTER value_ptr NULL.

Системное Свойство набора

jvmtiError
SetSystemProperty(jvmtiEnv* env,
            const char* property,
            const char* value_ptr)
Установите системное значение свойства VM.

Функция GetSystemProperties возвращает набор ключей свойства, некоторые из них могут быть устанавливаемыми. См. GetSystemProperty.

ФазаБезопасный обратный вызовПозицияС тех пор
май только быть вызванным во время фазы OnLoad Нет 1321.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
propertyconst char* Ключ свойства, закодированного как измененная строка UTF-8.

Агент передает в массиве char.
value_ptrconst char * Значение свойства, чтобы установить, закодированный как измененная строка UTF-8.

Агент передает в массиве char. Если value_ptr NULL, не устанавливайте значение, но возврат JVMTI_ERROR_NOT_AVAILABLE если свойство не является writeable.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NOT_AVAILABLE Это свойство не доступно или не является writeable.
JVMTI_ERROR_NULL_POINTER property NULL.


Общий

Общие функции: Общие типы: Общие флаги и константы:


Получите Фазу

typedef enum {
    JVMTI_PHASE_ONLOAD = 1,
    JVMTI_PHASE_PRIMORDIAL = 2,
    JVMTI_PHASE_START = 6,
    JVMTI_PHASE_LIVE = 4,
    JVMTI_PHASE_DEAD = 8
} jvmtiPhase;
jvmtiError
GetPhase(jvmtiEnv* env,
            jvmtiPhase* phase_ptr)
Возвратите текущую фазу выполнения VM. Фазы продолжаются в последовательности:
Фазы выполнения (jvmtiPhase)
Постоянный Значение Описание
JVMTI_PHASE_ONLOAD1 OnLoad фаза: в то время как в Agent_OnLoad функция.
JVMTI_PHASE_PRIMORDIAL2 Исконная фаза: между возвратом из Agent_OnLoad и VMStart событие.
JVMTI_PHASE_START6 Запустите фазу: когда VMStart событие отправляется и до VMInit событие отправляется.
JVMTI_PHASE_LIVE4 Живая фаза: когда VMInit событие отправляется и до VMDeath возвраты события.
JVMTI_PHASE_DEAD8 Мертвая фаза: после VMDeath событие возвращается или после отказа запуска.
В случае отказа запуска VM продолжится непосредственно к мертвой фазе, пропускающей промежуточные фазы и ни одного a VMInit ни VMDeath событие будет отправлено.

Большинство JVM OnLoad или живые фазы: Следующие функции работают в только OnLoad фаза: Следующие функции работают в запуске или живых фазах: Следующие функции работают в любой фазе: Функции JNI (кроме API Вызова) должны только использоваться в запуске или живых фазах.

Большинство JVM 

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Нет 1331.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
phase_ptrjvmtiPhase* По возврату, точкам к фазе.

Агент передает указатель на a jvmtiPhase. По возврату, jvmtiPhase был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER phase_ptr NULL.

Расположите Среду

jvmtiError
DisposeEnvironment(jvmtiEnv* env)
Завершение работы JVM GetEnv (см. JVM ). Избавьтесь от любых ресурсов, сохраненных средой. Потоки, приостановленные этой средой, не возобновляются этим вызовом, это должно быть сделано явно агентом. Память, выделенная этой средой через звонки в JVM Deallocate. Необработанные мониторы, создаваемые этой средой, не уничтожаются, это может быть сделано явно агентом, вызывая DestroyRawMonitor. На состояние потоков, ожидающих на необработанных мониторах, создаваемых этой средой, не влияют.

Будут сброшены любые собственные префиксы метода для этой среды; агент должен удалить любые снабженные префиксом собственные методы прежде, чем расположат, вызывается.

Оставляются любые возможности, сохраненные этой средой.

События, включенные этой средой, больше не будут отправлены, однако в настоящий момент рабочие обработчики событий будут продолжать работать. Предостережение должно быть осуществлено в проекте обработчиков событий, среда которых может быть расположена и таким образом становиться недопустимой во время их выполнения.

Эта среда не может использоваться после этого вызова. Этот вызов возвращается к вызывающей стороне.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Нет 1271.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание

Ошибки
Эта функция возвращает универсальную ошибку

Среда набора Локальное Хранение

jvmtiError
SetEnvironmentLocalStorage(jvmtiEnv* env,
            const void* data)
VM хранит значение указателя, связанное каждой средой. Это значение указателя вызывают локальным для среды хранением. Это значение NULL если не установлено с этой функцией. Агенты могут выделить память, в которой они хранят среду определенная информация. Устанавливая локальное для среды хранение с этим можно тогда получить доступ GetEnvironmentLocalStorage.

Вызванный агентом, чтобы установить значение JVM  

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Эта функция может быть вызвана от обратных вызовов до итеративных функций "Кучи", или от обработчиков событий для GarbageCollectionStart, GarbageCollectionFinish, и ObjectFree события. 1481.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
dataconst void * Значение, которое будет введено в локальное для среды хранение.

Агент передает в указателе. Если data NULL, значение устанавливается в NULL.

Ошибки
Эта функция возвращает универсальную ошибку

Получите Среду Локальное Хранение

jvmtiError
GetEnvironmentLocalStorage(jvmtiEnv* env,
            void** data_ptr)
Вызванный агентом, чтобы получить значение JVM 

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Эта функция может быть вызвана от обратных вызовов до итеративных функций "Кучи", или от обработчиков событий для GarbageCollectionStart, GarbageCollectionFinish, и ObjectFree события. 1471.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
data_ptrvoid** Указатель, через который значение среды возвращается локальное хранение. Если локальное для среды хранение не было установлено с SetEnvironmentLocalStorage возвращенный указатель NULL.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER data_ptr NULL.

Получите Номер версии

jvmtiError
GetVersionNumber(jvmtiEnv* env,
            jint* version_ptr)
Возвратите JVM version_ptr. Возвращаемое значение является идентификатором версии. Идентификатор версии включает главную, незначительную и микро версию так же как тип интерфейса.
Типы Интерфейса версии
Постоянный Значение Описание
JVMTI_VERSION_INTERFACE_JNI0x00000000 Значение JVMTI_VERSION_MASK_INTERFACE_TYPE для JNI.
JVMTI_VERSION_INTERFACE_JVMTI0x30000000 Значение JVMTI_VERSION_MASK_INTERFACE_TYPE для JVM 
Маски версии
Постоянный Значение Описание
JVMTI_VERSION_MASK_INTERFACE_TYPE0x70000000 Маска, чтобы извлечь тип интерфейса. Значение версии, возвращенной этой функцией, замаскированной с JVMTI_VERSION_MASK_INTERFACE_TYPEвсегда JVMTI_VERSION_INTERFACE_JVMTI так как это - JVM 
JVMTI_VERSION_MASK_MAJOR0x0FFF0000 Маска, чтобы извлечь номер основной версии.
JVMTI_VERSION_MASK_MINOR0x0000FF00 Маска, чтобы извлечь номер вспомогательной версии.
JVMTI_VERSION_MASK_MICRO0x000000FF Маска, чтобы извлечь микро номер версии.
Сдвиги версии
Постоянный Значение Описание
JVMTI_VERSION_SHIFT_MAJOR16 Сдвиг, чтобы извлечь номер основной версии.
JVMTI_VERSION_SHIFT_MINOR8 Сдвиг, чтобы извлечь номер вспомогательной версии.
JVMTI_VERSION_SHIFT_MICRO0 Сдвиг, чтобы извлечь микро номер версии.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Нет 881.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
version_ptrjint* По возврату, точкам к JVM 

Агент передает указатель на a jint. По возврату, jint был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER version_ptr NULL.

Получите Ошибочное Имя

jvmtiError
GetErrorName(jvmtiEnv* env,
            jvmtiError error,
            char** name_ptr)
Возвратите символьное имя для кода ошибки.

Например GetErrorName(env, JVMTI_ERROR_NONE, &err_name) возвратился бы в err_name строка "JVMTI_ERROR_NONE".

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Нет 1281.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
errorjvmtiError Код ошибки.
name_ptrchar** По возврату, точкам к ошибочному имени. Имя кодируется как измененная строка UTF-8, но ограничивается подмножеству ASCII.

Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_ILLEGAL_ARGUMENT error не jvmtiError.
JVMTI_ERROR_NULL_POINTER name_ptr NULL.

Установите Многословный Флаг

typedef enum {
    JVMTI_VERBOSE_OTHER = 0,
    JVMTI_VERBOSE_GC = 1,
    JVMTI_VERBOSE_CLASS = 2,
    JVMTI_VERBOSE_JNI = 4
} jvmtiVerboseFlag;
jvmtiError
SetVerboseFlag(jvmtiEnv* env,
            jvmtiVerboseFlag flag,
            jboolean value)
Многословное Перечисление Флага (jvmtiVerboseFlag)
Постоянный Значение Описание
JVMTI_VERBOSE_OTHER0 Многословный вывод кроме ниже.
JVMTI_VERBOSE_GC1 Многословный вывод сборщика "мусора", как определенный с -verbose:gc.
JVMTI_VERBOSE_CLASS2 Многословный вывод загрузки class, как определенный с -verbose:class.
JVMTI_VERBOSE_JNI4 Многословный вывод JNI, как определенный с -verbose:jni.
Управляйте многословным выводом. Это - вывод, который обычно отправляется stderr.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Нет 1501.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
flagjvmtiVerboseFlag Какой многословный флаг установить.
valuejboolean Новое значение флага.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_ILLEGAL_ARGUMENT flag не jvmtiVerboseFlag.

Получите Формат JLocation

typedef enum {
    JVMTI_JLOCATION_JVMBCI = 1,
    JVMTI_JLOCATION_MACHINEPC = 2,
    JVMTI_JLOCATION_OTHER = 0
} jvmtiJlocationFormat;
jvmtiError
GetJLocationFormat(jvmtiEnv* env,
            jvmtiJlocationFormat* format_ptr)
Хотя самая большая функциональность достигается с информацией о расположении, ссылающейся на байт-код виртуальной машины, индексируют, определение jlocation был преднамеренно оставлен неограниченным, чтобы позволить реализации VM, у которых нет этой информации.

Эта функция описывает представление jlocation используемый в этом VM. Если возвращенный формат JVMTI_JLOCATION_JVMBCI, jlocations может использоваться в качестве в индексах в массив, возвращенный GetBytecodes.
Перечисление Формата JLocation (jvmtiJlocationFormat)
Постоянный Значение Описание
JVMTI_JLOCATION_JVMBCI1 jlocation значения представляют индексы байт-кода виртуальной машины - то есть, смещения в код виртуальной машины для метода.
JVMTI_JLOCATION_MACHINEPC2 jlocation значения представляют собственные машинные значения счетчика команд.
JVMTI_JLOCATION_OTHER0 jlocation у значений есть некоторое другое представление.

ФазаБезопасный обратный вызовПозицияС тех пор
может быть вызван во время любой фазы Нет 1291.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
format_ptrjvmtiJlocationFormat* По возврату, точкам к идентификатору формата для jlocation значения.

Агент передает указатель на a jvmtiJlocationFormat. По возврату, jvmtiJlocationFormat был установлен.

Ошибки
Эта функция возвращает или универсальную ошибку или одну из следующих ошибок
Ошибка Описание
JVMTI_ERROR_NULL_POINTER format_ptr NULL.


Ошибки

Каждая JVM jvmtiError код ошибки.

Это - обязанность агента вызвать JVM , Функционально-специализированные Необходимые Ошибки должны быть обнаружены реализацией. Все другие ошибки представляют рекомендуемый ответ на состояние ошибки.

Универсальные Ошибки

Следующие ошибки могут быть возвращены любой функцией

JVMTI_ERROR_NONE (0)
Никакая ошибка не произошла. Это - код ошибки, который возвращается на успешном завершении функции.

JVMTI_ERROR_NULL_POINTER (100)
Указатель неожиданно NULL.

JVMTI_ERROR_OUT_OF_MEMORY (110)
Функция, предпринятая, чтобы выделить память и больше памяти, была доступна для выделения.

JVMTI_ERROR_ACCESS_DENIED (111)
Требуемая функциональность не была добавлена в этой виртуальной машине.

JVMTI_ERROR_UNATTACHED_THREAD (115)
Поток, используемый, чтобы вызвать эту функцию, не присоединен к виртуальной машине. Вызовы должны быть выполнены от присоединенных потоков. См. AttachCurrentThread в API вызова JNI.

JVMTI_ERROR_INVALID_ENVIRONMENT (116)
JVM 

JVMTI_ERROR_WRONG_PHASE (112)
Требуемая функциональность не доступна в текущей фазе. Всегда возвращаемый, если виртуальная машина завершила выполнение.

JVMTI_ERROR_INTERNAL (113)
Произошла неожиданная внутренняя ошибка.

Функционально-специализированные Необходимые Ошибки

Следующие ошибки возвращаются некоторой JVM 

JVMTI_ERROR_INVALID_PRIORITY (12)
Недопустимый приоритет.

JVMTI_ERROR_THREAD_NOT_SUSPENDED (13)
Поток не был приостановлен.

JVMTI_ERROR_THREAD_SUSPENDED (14)
Поток уже приостанавливается.

JVMTI_ERROR_THREAD_NOT_ALIVE (15)
Эта работа требует, чтобы поток был жив - то есть, это должно быть запущено и еще не умерло.

JVMTI_ERROR_CLASS_NOT_PREPARED (22)
class был загружен, но еще не подготовлен.

JVMTI_ERROR_NO_MORE_FRAMES (31)
Нет никакого языка программирования Java или стековых фреймов JNI в указанной глубине.

JVMTI_ERROR_OPAQUE_FRAME (32)
Информация о фрейме не доступна (например, для собственных фреймов).

JVMTI_ERROR_DUPLICATE (40)
Элемент уже устанавливается.

JVMTI_ERROR_NOT_FOUND (41)
Требуемый элемент (например, поле или контрольная точка) не найденный

JVMTI_ERROR_NOT_MONITOR_OWNER (51)
Этому потоку не принадлежит необработанный монитор.

JVMTI_ERROR_INTERRUPT (52)
Вызов был прерван перед завершением.

JVMTI_ERROR_UNMODIFIABLE_CLASS (79)
class не может быть изменен.

JVMTI_ERROR_NOT_AVAILABLE (98)
Функциональность не доступна в этой виртуальной машине.

JVMTI_ERROR_ABSENT_INFORMATION (101)
Требуемая информация не доступна.

JVMTI_ERROR_INVALID_EVENT_TYPE (102)
Указанный идентификатор типа события не распознается.

JVMTI_ERROR_NATIVE_METHOD (104)
Требуемая информация не доступна для собственного метода.

JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED (106)
Загрузчик class не поддерживает эту работу.

Функционально-специализированные Ошибки Агента

Следующие ошибки возвращаются некоторой JVM 

JVMTI_ERROR_INVALID_THREAD (10)
Переданный поток не является допустимым потоком.

JVMTI_ERROR_INVALID_FIELDID (25)
Недопустимое поле.

JVMTI_ERROR_INVALID_METHODID (23)
Недопустимый метод.

JVMTI_ERROR_INVALID_LOCATION (24)
Недопустимое расположение.

JVMTI_ERROR_INVALID_OBJECT (20)
Недопустимый объект.

JVMTI_ERROR_INVALID_CLASS (21)
Недопустимый class.

JVMTI_ERROR_TYPE_MISMATCH (34)
Переменная не является соответствующим типом для используемой функции.

JVMTI_ERROR_INVALID_SLOT (35)
Недопустимый слот.

JVMTI_ERROR_MUST_POSSESS_CAPABILITY (99)
Используемая возможность является ложью в этой среде.

JVMTI_ERROR_INVALID_THREAD_GROUP (11)
Недопустимая группа потока.

JVMTI_ERROR_INVALID_MONITOR (50)
Недопустимый необработанный монитор.

JVMTI_ERROR_ILLEGAL_ARGUMENT (103)
Недопустимый параметр.

JVMTI_ERROR_INVALID_TYPESTATE (65)
Состояние потока было изменено, и теперь непоследовательно.

JVMTI_ERROR_UNSUPPORTED_VERSION (68)
У нового файла class есть номер версии, не поддерживаемый этим VM.

JVMTI_ERROR_INVALID_CLASS_FORMAT (60)
Новый файл class уродлив (VM возвратил бы a ClassFormatError).

JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION (61)
Новые определения файла class привели бы к круговому определению (VM возвратит a ClassCircularityError).

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED (63)
Новый файл class потребовал бы добавления метода.

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED (64)
Новая версия class изменяет поле.

JVMTI_ERROR_FAILS_VERIFICATION (62)
Байты class приводят проверку к сбою.

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED (66)
Прямой суперкласс отличается для новой версии class, или набор непосредственно реализованных интерфейсов отличается.

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED (67)
Новая версия class не объявляет метод, объявленный в старой версии class.

JVMTI_ERROR_NAMES_DONT_MATCH (69)
Имя class, определенное в новом файле class, отличается от имени в старом объекте class.

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED (70)
У новой версии class есть различные модификаторы.

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED (71)
У метода в новой версии class есть различные модификаторы чем ее дубликат в старой версии class.


Типы данных

JVM 

Типы JNI, Используемые в Интерфейсе Инструмента JVM
Ввести Описание
jboolean Содержит язык программирования Java boolean. 8 битов без знака.
jchar Содержит язык программирования Java char. 16 битов без знака.
jint Содержит язык программирования Java int. Подписанные 32 бита.
jlong Содержит язык программирования Java long. Подписанные 64 бита.
jfloat Содержит язык программирования Java float. 32 бита.
jdouble Содержит язык программирования Java double. 64 бита.
jobject Содержит объект языка программирования Java.
jclass Содержит язык программирования Java class.
jvalue Объединение всех типов примитивов и jobject. Таким образом, содержит любое значение языка программирования Java.
jfieldID Идентифицирует поле языка программирования Java. jfieldIDs возвращенный JVM 
jmethodID Идентифицирует метод языка программирования Java, инициализатор, или конструктора. jmethodIDs возвращенный JVM 
JNIEnv Указатель на таблицу функции JNI. Указатель на это (JNIEnv *) среда JNI.

Базовые типы Интерфейса Инструмента JVM
Ввести Описание
jvmtiEnv  Указатель среды JVM. См. Функциональный Раздел. jvmtiEnv точки к функциональному табличному указателю.
jthread Подтип jobject это содержит поток.
typedef jobject jthread;
jthreadGroup Подтип jobject это содержит группу потока.
typedef jobject jthreadGroup;
jlocation 64 битовых значения, представляя монотонно увеличивающуюся исполнимую позицию в пределах метода. -1 указывает на собственный метод. См. GetJLocationFormat для формата на данном VM.
typedef jlong jlocation;
jrawMonitorID Необработанный монитор.
struct _jrawMonitorID;
typedef struct _jrawMonitorID *jrawMonitorID;
jvmtiError Содержит ошибочный код возврата. См. Ошибочный раздел для возможных значений.
typedef enum { 
    JVMTI_ERROR_NONE = 0,  
    JVMTI_ERROR_INVALID_THREAD = 10,
      ... 
} jvmtiError;
jvmtiEvent Идентификатор для типа события. См. раздел События для возможных значений. Гарантируется, что будущие версии этой спецификации никогда не будут присваивать нуль как идентификатор типа события.
typedef enum { 
    JVMTI_EVENT_SINGLE_STEP = 1, 
    JVMTI_EVENT_BREAKPOINT = 2, 
      ... 
} jvmtiEvent;
jvmtiEventCallbacks Обратные вызовы используются для событий.
typedef struct {
    jvmtiEventVMInit VMInit;
    jvmtiEventVMDeath VMDeath;
      ... 
} jvmtiEventCallbacks;
См. обратные вызовы события для полной структуры.

Где, например, обратный вызов инициализации VM определяется:
typedef void (JNICALL *jvmtiEventVMInit)
    (jvmtiEnv *jvmti_env, 
     JNIEnv* jni_env,
     jthread thread);
См. одиночные соревнования для определения функции обратного вызова.
jniNativeInterface Определение типа для таблицы функции JNI JNINativeInterface определенный в Спецификации JNI. Ссылочная реализация JNI определяет это с помощью подчеркивания.
typedef struct JNINativeInterface_ jniNativeInterface;

Определения Типа структуры
Ввести Описание
jvmtiAddrLocationMapСобственный адрес к записи расположения
jvmtiCapabilitiesСтруктура Возможностей
jvmtiClassDefinitionОписание переопределения класса
jvmtiExtensionEventInfoИнформация События расширения
jvmtiExtensionFunctionInfoИнформация Функции расширения
jvmtiFrameInfoИнформационная структура стекового фрейма
jvmtiHeapCallbacksСтруктура функции обратного вызова "кучи"
jvmtiHeapReferenceInfoСсылочная информационная структура
jvmtiHeapReferenceInfoArrayСсылочная информационная структура для ссылок Массива
jvmtiHeapReferenceInfoConstantPoolСсылочная информационная структура для Постоянных ссылок Пула
jvmtiHeapReferenceInfoFieldСсылочная информационная структура для Полевых ссылок
jvmtiHeapReferenceInfoJniLocalСсылочная информационная структура для JNI локальные ссылки
jvmtiHeapReferenceInfoReservedСсылочная информационная структура для Других ссылок
jvmtiHeapReferenceInfoStackLocalСсылочная информационная структура для ссылок Локальной переменной
jvmtiLineNumberEntryЗапись таблицы номера строки
jvmtiLocalVariableEntryЗапись таблицы локальной переменной
jvmtiMonitorStackDepthInfoИнформационная структура глубины стека монитора
jvmtiMonitorUsageОбъектная информация об использовании монитора
jvmtiParamInfoИнформация Параметра Функции/События расширения
jvmtiStackInfoСложите информационную структуру
jvmtiThreadGroupInfoГрупповая информационная структура потока
jvmtiThreadInfoРаспараллельте информационную структуру
jvmtiTimerInfoИнформация таймера

Функциональные Определения Типа
Ввести Описание
jvmtiArrayPrimitiveValueCallbackВыстройте Примитивный Обратный вызов Значения
jvmtiExtensionEventСобытие расширения
jvmtiExtensionFunctionФункция расширения
jvmtiHeapIterationCallbackИтеративный Обратный вызов "кучи"
jvmtiHeapObjectCallbackОбратный вызов Объекта "кучи"
jvmtiHeapReferenceCallbackСсылочный Обратный вызов "кучи"
jvmtiHeapRootCallbackКорень "кучи" Возражает Обратному вызову
jvmtiObjectReferenceCallbackОбратный вызов Ссылки на объект
jvmtiPrimitiveFieldCallbackПримитивный Полевой Обратный вызов
jvmtiReservedCallbackзарезервированный для будущего Обратного вызова использования
jvmtiStackReferenceCallbackСсылочный Обратный вызов Объекта стека
jvmtiStartFunctionАгент Запускает Функцию
jvmtiStringPrimitiveValueCallbackПредставьте Примитивный Обратный вызов Значения в виде строки

Определения перечисления
Ввести Описание
jvmtiEventModeСобытие, Enable/Disable
jvmtiHeapObjectFilterОбъект "кучи" Фильтрует Перечисление
jvmtiHeapReferenceKindСсылочное Перечисление "кучи"
jvmtiHeapRootKindКорень "кучи" Доброе Перечисление
jvmtiIterationControlИтеративное Перечисление Управления
jvmtiJlocationFormatПеречисление Формата JLocation
jvmtiObjectReferenceKindПеречисление Ссылки на объект
jvmtiParamKindВиды Параметра Функции/События расширения
jvmtiParamTypesТипы Параметра Функции/События расширения
jvmtiPhaseФазы выполнения
jvmtiPrimitiveTypeПеречисление Типа примитива
jvmtiTimerKindВиды таймера
jvmtiVerboseFlagМногословное Перечисление Флага

Функциональное Табличное Расположение
Позиция Функция Объявление
1зарезервированный
void *reserved1;
2Установите Режим Уведомления о событии
jvmtiError (JNICALL *SetEventNotificationMode) (jvmtiEnv* env, 
                       jvmtiEventMode mode, 
                       jvmtiEvent event_type, 
                       jthread event_thread, 
                        ...);
3зарезервированный
void *reserved3;
4Получите Все Потоки
jvmtiError (JNICALL *GetAllThreads) (jvmtiEnv* env, 
                       jint* threads_count_ptr, 
                       jthread** threads_ptr);
5Приостановите Поток
jvmtiError (JNICALL *SuspendThread) (jvmtiEnv* env, 
                       jthread thread);
6Поток резюме
jvmtiError (JNICALL *ResumeThread) (jvmtiEnv* env, 
                       jthread thread);
7Остановите Поток
jvmtiError (JNICALL *StopThread) (jvmtiEnv* env, 
                       jthread thread, 
                       jobject exception);
8Поток прерывания
jvmtiError (JNICALL *InterruptThread) (jvmtiEnv* env, 
                       jthread thread);
9Получите Информацию Потока
jvmtiError (JNICALL *GetThreadInfo) (jvmtiEnv* env, 
                       jthread thread, 
                       jvmtiThreadInfo* info_ptr);
10Получите Находящуюся в собственности Информацию Монитора
jvmtiError (JNICALL *GetOwnedMonitorInfo) (jvmtiEnv* env, 
                       jthread thread, 
                       jint* owned_monitor_count_ptr, 
                       jobject** owned_monitors_ptr);
11Станьте Текущими, Спорил Монитор
jvmtiError (JNICALL *GetCurrentContendedMonitor) (jvmtiEnv* env, 
                       jthread thread, 
                       jobject* monitor_ptr);
12Выполненный Поток Агента
jvmtiError (JNICALL *RunAgentThread) (jvmtiEnv* env, 
                       jthread thread, 
                       jvmtiStartFunction proc, 
                       const void* arg, 
                       jint priority);
13Get Top Thread Groups
jvmtiError (JNICALL *GetTopThreadGroups) (jvmtiEnv* env, 
                       jint* group_count_ptr, 
                       jthreadGroup** groups_ptr);
14Информация Get Thread Group
jvmtiError (JNICALL *GetThreadGroupInfo) (jvmtiEnv* env, 
                       jthreadGroup group, 
                       jvmtiThreadGroupInfo* info_ptr);
15Дочерние элементы Get Thread Group
jvmtiError (JNICALL *GetThreadGroupChildren) (jvmtiEnv* env, 
                       jthreadGroup group, 
                       jint* thread_count_ptr, 
                       jthread** threads_ptr, 
                       jint* group_count_ptr, 
                       jthreadGroup** groups_ptr);
16Получите Фрейм граф
jvmtiError (JNICALL *GetFrameCount) (jvmtiEnv* env, 
                       jthread thread, 
                       jint* count_ptr);
17Получите Состояние потока
jvmtiError (JNICALL *GetThreadState) (jvmtiEnv* env, 
                       jthread thread, 
                       jint* thread_state_ptr);
18Получите Текущий поток
jvmtiError (JNICALL *GetCurrentThread) (jvmtiEnv* env, 
                       jthread* thread_ptr);
19Получите Расположение Фрейма
jvmtiError (JNICALL *GetFrameLocation) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jmethodID* method_ptr, 
                       jlocation* location_ptr);
20Уведомьте, что Фрейм Появляется
jvmtiError (JNICALL *NotifyFramePop) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth);
21Получите Локальную переменную - Объект
jvmtiError (JNICALL *GetLocalObject) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jobject* value_ptr);
22Получите Локальную переменную - Интервал
jvmtiError (JNICALL *GetLocalInt) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jint* value_ptr);
23Получите Локальную переменную - Долго
jvmtiError (JNICALL *GetLocalLong) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jlong* value_ptr);
24Получите Локальную переменную - Плавание
jvmtiError (JNICALL *GetLocalFloat) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jfloat* value_ptr);
25Получите Локальную переменную - Двойной
jvmtiError (JNICALL *GetLocalDouble) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jdouble* value_ptr);
26Установите Локальную переменную - Объект
jvmtiError (JNICALL *SetLocalObject) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jobject value);
27Установите Локальную переменную - Интервал
jvmtiError (JNICALL *SetLocalInt) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jint value);
28Установите Локальную переменную - Долго
jvmtiError (JNICALL *SetLocalLong) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jlong value);
29Установите Локальную переменную - Плавание
jvmtiError (JNICALL *SetLocalFloat) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jfloat value);
30Установите Локальную переменную - Двойной
jvmtiError (JNICALL *SetLocalDouble) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jint slot, 
                       jdouble value);
31Создайте Необработанный Монитор
jvmtiError (JNICALL *CreateRawMonitor) (jvmtiEnv* env, 
                       const char* name, 
                       jrawMonitorID* monitor_ptr);
32Уничтожьте Необработанный Монитор
jvmtiError (JNICALL *DestroyRawMonitor) (jvmtiEnv* env, 
                       jrawMonitorID monitor);
33Необработанный Монитор Входит
jvmtiError (JNICALL *RawMonitorEnter) (jvmtiEnv* env, 
                       jrawMonitorID monitor);
34Необработанный Выход Монитора
jvmtiError (JNICALL *RawMonitorExit) (jvmtiEnv* env, 
                       jrawMonitorID monitor);
35Необработанный Монитор Ожидает
jvmtiError (JNICALL *RawMonitorWait) (jvmtiEnv* env, 
                       jrawMonitorID monitor, 
                       jlong millis);
36Необработанный Монитор Уведомляет
jvmtiError (JNICALL *RawMonitorNotify) (jvmtiEnv* env, 
                       jrawMonitorID monitor);
37Необработанный Монитор Уведомляет Все
jvmtiError (JNICALL *RawMonitorNotifyAll) (jvmtiEnv* env, 
                       jrawMonitorID monitor);
38Контрольная точка набора
jvmtiError (JNICALL *SetBreakpoint) (jvmtiEnv* env, 
                       jmethodID method, 
                       jlocation location);
39Очистите Контрольную точку
jvmtiError (JNICALL *ClearBreakpoint) (jvmtiEnv* env, 
                       jmethodID method, 
                       jlocation location);
40зарезервированный
void *reserved40;
41Установите Часы Доступа к полю
jvmtiError (JNICALL *SetFieldAccessWatch) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field);
42Очистите Часы Доступа к полю
jvmtiError (JNICALL *ClearFieldAccessWatch) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field);
43Полевые Часы Модификации набора
jvmtiError (JNICALL *SetFieldModificationWatch) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field);
44Очистите Полевые Часы Модификации
jvmtiError (JNICALL *ClearFieldModificationWatch) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field);
45Поддающийся изменению Класс
jvmtiError (JNICALL *IsModifiableClass) (jvmtiEnv* env, 
                       jclass klass, 
                       jboolean* is_modifiable_class_ptr);
46Выделить
jvmtiError (JNICALL *Allocate) (jvmtiEnv* env, 
                       jlong size, 
                       unsigned char** mem_ptr);
47Освободить
jvmtiError (JNICALL *Deallocate) (jvmtiEnv* env, 
                       unsigned char* mem);
48Получите Подпись Класса
jvmtiError (JNICALL *GetClassSignature) (jvmtiEnv* env, 
                       jclass klass, 
                       char** signature_ptr, 
                       char** generic_ptr);
49Получите Состояние Класса
jvmtiError (JNICALL *GetClassStatus) (jvmtiEnv* env, 
                       jclass klass, 
                       jint* status_ptr);
50Получите Имя Исходного файла
jvmtiError (JNICALL *GetSourceFileName) (jvmtiEnv* env, 
                       jclass klass, 
                       char** source_name_ptr);
51Получите Модификаторы Класса
jvmtiError (JNICALL *GetClassModifiers) (jvmtiEnv* env, 
                       jclass klass, 
                       jint* modifiers_ptr);
52Получите Методы Класса
jvmtiError (JNICALL *GetClassMethods) (jvmtiEnv* env, 
                       jclass klass, 
                       jint* method_count_ptr, 
                       jmethodID** methods_ptr);
53Получите Поля Класса
jvmtiError (JNICALL *GetClassFields) (jvmtiEnv* env, 
                       jclass klass, 
                       jint* field_count_ptr, 
                       jfieldID** fields_ptr);
54Получите Реализованные Интерфейсы
jvmtiError (JNICALL *GetImplementedInterfaces) (jvmtiEnv* env, 
                       jclass klass, 
                       jint* interface_count_ptr, 
                       jclass** interfaces_ptr);
55Интерфейс
jvmtiError (JNICALL *IsInterface) (jvmtiEnv* env, 
                       jclass klass, 
                       jboolean* is_interface_ptr);
56Класс Массива
jvmtiError (JNICALL *IsArrayClass) (jvmtiEnv* env, 
                       jclass klass, 
                       jboolean* is_array_class_ptr);
57Получите Загрузчик Класса
jvmtiError (JNICALL *GetClassLoader) (jvmtiEnv* env, 
                       jclass klass, 
                       jobject* classloader_ptr);
58Получите Объектный Хэш-код
jvmtiError (JNICALL *GetObjectHashCode) (jvmtiEnv* env, 
                       jobject object, 
                       jint* hash_code_ptr);
59Получите Объектное Использование Монитора
jvmtiError (JNICALL *GetObjectMonitorUsage) (jvmtiEnv* env, 
                       jobject object, 
                       jvmtiMonitorUsage* info_ptr);
60Получите Имя поля (и Подпись)
jvmtiError (JNICALL *GetFieldName) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field, 
                       char** name_ptr, 
                       char** signature_ptr, 
                       char** generic_ptr);
61Получите Полевой Класс Объявления
jvmtiError (JNICALL *GetFieldDeclaringClass) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field, 
                       jclass* declaring_class_ptr);
62Получите Полевые Модификаторы
jvmtiError (JNICALL *GetFieldModifiers) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field, 
                       jint* modifiers_ptr);
63Синтетическое Поле
jvmtiError (JNICALL *IsFieldSynthetic) (jvmtiEnv* env, 
                       jclass klass, 
                       jfieldID field, 
                       jboolean* is_synthetic_ptr);
64Получите Имя метода (и Подпись)
jvmtiError (JNICALL *GetMethodName) (jvmtiEnv* env, 
                       jmethodID method, 
                       char** name_ptr, 
                       char** signature_ptr, 
                       char** generic_ptr);
65Получите Класс Объявления Метода
jvmtiError (JNICALL *GetMethodDeclaringClass) (jvmtiEnv* env, 
                       jmethodID method, 
                       jclass* declaring_class_ptr);
66Получите Модификаторы Метода
jvmtiError (JNICALL *GetMethodModifiers) (jvmtiEnv* env, 
                       jmethodID method, 
                       jint* modifiers_ptr);
67зарезервированный
void *reserved67;
68Получите Максимальные Локальные переменные
jvmtiError (JNICALL *GetMaxLocals) (jvmtiEnv* env, 
                       jmethodID method, 
                       jint* max_ptr);
69Получите Размер Параметров
jvmtiError (JNICALL *GetArgumentsSize) (jvmtiEnv* env, 
                       jmethodID method, 
                       jint* size_ptr);
70Получите Таблицу Номера строки
jvmtiError (JNICALL *GetLineNumberTable) (jvmtiEnv* env, 
                       jmethodID method, 
                       jint* entry_count_ptr, 
                       jvmtiLineNumberEntry** table_ptr);
71Получите Расположение Метода
jvmtiError (JNICALL *GetMethodLocation) (jvmtiEnv* env, 
                       jmethodID method, 
                       jlocation* start_location_ptr, 
                       jlocation* end_location_ptr);
72Получите Таблицу Локальной переменной
jvmtiError (JNICALL *GetLocalVariableTable) (jvmtiEnv* env, 
                       jmethodID method, 
                       jint* entry_count_ptr, 
                       jvmtiLocalVariableEntry** table_ptr);
73Установите Собственный Префикс Метода
jvmtiError (JNICALL *SetNativeMethodPrefix) (jvmtiEnv* env, 
                       const char* prefix);
74Установите Собственные Префиксы Метода
jvmtiError (JNICALL *SetNativeMethodPrefixes) (jvmtiEnv* env, 
                       jint prefix_count, 
                       char** prefixes);
75Получите Байт-коды
jvmtiError (JNICALL *GetBytecodes) (jvmtiEnv* env, 
                       jmethodID method, 
                       jint* bytecode_count_ptr, 
                       unsigned char** bytecodes_ptr);
76Собственный Метод
jvmtiError (JNICALL *IsMethodNative) (jvmtiEnv* env, 
                       jmethodID method, 
                       jboolean* is_native_ptr);
77Синтетический Метод
jvmtiError (JNICALL *IsMethodSynthetic) (jvmtiEnv* env, 
                       jmethodID method, 
                       jboolean* is_synthetic_ptr);
78Получите Загруженные Классы
jvmtiError (JNICALL *GetLoadedClasses) (jvmtiEnv* env, 
                       jint* class_count_ptr, 
                       jclass** classes_ptr);
79Получите Классы Classloader
jvmtiError (JNICALL *GetClassLoaderClasses) (jvmtiEnv* env, 
                       jobject initiating_loader, 
                       jint* class_count_ptr, 
                       jclass** classes_ptr);
80Вытолкайте Фрейм
jvmtiError (JNICALL *PopFrame) (jvmtiEnv* env, 
                       jthread thread);
81Вызовите Ранний Возврат - Объект
jvmtiError (JNICALL *ForceEarlyReturnObject) (jvmtiEnv* env, 
                       jthread thread, 
                       jobject value);
82Вызовите Ранний Возврат - Интервал
jvmtiError (JNICALL *ForceEarlyReturnInt) (jvmtiEnv* env, 
                       jthread thread, 
                       jint value);
83Вызовите Ранний Возврат - Долго
jvmtiError (JNICALL *ForceEarlyReturnLong) (jvmtiEnv* env, 
                       jthread thread, 
                       jlong value);
84Вызовите Ранний Возврат - Плавание
jvmtiError (JNICALL *ForceEarlyReturnFloat) (jvmtiEnv* env, 
                       jthread thread, 
                       jfloat value);
85Вызовите Ранний Возврат - Двойной
jvmtiError (JNICALL *ForceEarlyReturnDouble) (jvmtiEnv* env, 
                       jthread thread, 
                       jdouble value);
86Вызовите Ранний Возврат - Пусто
jvmtiError (JNICALL *ForceEarlyReturnVoid) (jvmtiEnv* env, 
                       jthread thread);
87Пересмотрите Классы
jvmtiError (JNICALL *RedefineClasses) (jvmtiEnv* env, 
                       jint class_count, 
                       const jvmtiClassDefinition* class_definitions);
88Получите Номер версии
jvmtiError (JNICALL *GetVersionNumber) (jvmtiEnv* env, 
                       jint* version_ptr);
89Получите Возможности
jvmtiError (JNICALL *GetCapabilities) (jvmtiEnv* env, 
                       jvmtiCapabilities* capabilities_ptr);
90Получите Исходное Расширение Отладки
jvmtiError (JNICALL *GetSourceDebugExtension) (jvmtiEnv* env, 
                       jclass klass, 
                       char** source_debug_extension_ptr);
91Устаревший Метод
jvmtiError (JNICALL *IsMethodObsolete) (jvmtiEnv* env, 
                       jmethodID method, 
                       jboolean* is_obsolete_ptr);
92Приостановите Список Потока
jvmtiError (JNICALL *SuspendThreadList) (jvmtiEnv* env, 
                       jint request_count, 
                       const jthread* request_list, 
                       jvmtiError* results);
93Список Потока резюме
jvmtiError (JNICALL *ResumeThreadList) (jvmtiEnv* env, 
                       jint request_count, 
                       const jthread* request_list, 
                       jvmtiError* results);
94зарезервированный
void *reserved94;
95зарезервированный
void *reserved95;
96зарезервированный
void *reserved96;
97зарезервированный
void *reserved97;
98зарезервированный
void *reserved98;
99зарезервированный
void *reserved99;
100Получите Все Трассировки Стека
jvmtiError (JNICALL *GetAllStackTraces) (jvmtiEnv* env, 
                       jint max_frame_count, 
                       jvmtiStackInfo** stack_info_ptr, 
                       jint* thread_count_ptr);
101Получите Трассировки Стека Списка Потока
jvmtiError (JNICALL *GetThreadListStackTraces) (jvmtiEnv* env, 
                       jint thread_count, 
                       const jthread* thread_list, 
                       jint max_frame_count, 
                       jvmtiStackInfo** stack_info_ptr);
102Получите Локальную память потока
jvmtiError (JNICALL *GetThreadLocalStorage) (jvmtiEnv* env, 
                       jthread thread, 
                       void** data_ptr);
103Установите Локальную память потока
jvmtiError (JNICALL *SetThreadLocalStorage) (jvmtiEnv* env, 
                       jthread thread, 
                       const void* data);
104Получите Трассировку Стека
jvmtiError (JNICALL *GetStackTrace) (jvmtiEnv* env, 
                       jthread thread, 
                       jint start_depth, 
                       jint max_frame_count, 
                       jvmtiFrameInfo* frame_buffer, 
                       jint* count_ptr);
105зарезервированный
void *reserved105;
106Получите Тег
jvmtiError (JNICALL *GetTag) (jvmtiEnv* env, 
                       jobject object, 
                       jlong* tag_ptr);
107Тег набора
jvmtiError (JNICALL *SetTag) (jvmtiEnv* env, 
                       jobject object, 
                       jlong tag);
108Вызовите Сборку "мусора"
jvmtiError (JNICALL *ForceGarbageCollection) (jvmtiEnv* env);
109Выполните итерации По Объектам, Достижимым От Объекта
jvmtiError (JNICALL *IterateOverObjectsReachableFromObject) (jvmtiEnv* env, 
                       jobject object, 
                       jvmtiObjectReferenceCallback object_reference_callback, 
                       const void* user_data);
110Выполните итерации По Достижимым Объектам
jvmtiError (JNICALL *IterateOverReachableObjects) (jvmtiEnv* env, 
                       jvmtiHeapRootCallback heap_root_callback, 
                       jvmtiStackReferenceCallback stack_ref_callback, 
                       jvmtiObjectReferenceCallback object_ref_callback, 
                       const void* user_data);
111Выполните итерации По "Куче"
jvmtiError (JNICALL *IterateOverHeap) (jvmtiEnv* env, 
                       jvmtiHeapObjectFilter object_filter, 
                       jvmtiHeapObjectCallback heap_object_callback, 
                       const void* user_data);
112Выполните итерации По Экземплярам Класса
jvmtiError (JNICALL *IterateOverInstancesOfClass) (jvmtiEnv* env, 
                       jclass klass, 
                       jvmtiHeapObjectFilter object_filter, 
                       jvmtiHeapObjectCallback heap_object_callback, 
                       const void* user_data);
113зарезервированный
void *reserved113;
114Получите Объекты С Тегами
jvmtiError (JNICALL *GetObjectsWithTags) (jvmtiEnv* env, 
                       jint tag_count, 
                       const jlong* tags, 
                       jint* count_ptr, 
                       jobject** object_result_ptr, 
                       jlong** tag_result_ptr);
115Следуйте за Ссылками
jvmtiError (JNICALL *FollowReferences) (jvmtiEnv* env, 
                       jint heap_filter, 
                       jclass klass, 
                       jobject initial_object, 
                       const jvmtiHeapCallbacks* callbacks, 
                       const void* user_data);
116Выполните итерации Через "Кучу"
jvmtiError (JNICALL *IterateThroughHeap) (jvmtiEnv* env, 
                       jint heap_filter, 
                       jclass klass, 
                       const jvmtiHeapCallbacks* callbacks, 
                       const void* user_data);
117зарезервированный
void *reserved117;
118зарезервированный
void *reserved118;
119зарезервированный
void *reserved119;
120Накройте на Стол Функции JNI
jvmtiError (JNICALL *SetJNIFunctionTable) (jvmtiEnv* env, 
                       const jniNativeInterface* function_table);
121Получите Таблицу Функции JNI
jvmtiError (JNICALL *GetJNIFunctionTable) (jvmtiEnv* env, 
                       jniNativeInterface** function_table);
122Обратные вызовы События набора
jvmtiError (JNICALL *SetEventCallbacks) (jvmtiEnv* env, 
                       const jvmtiEventCallbacks* callbacks, 
                       jint size_of_callbacks);
123Генерируйте События
jvmtiError (JNICALL *GenerateEvents) (jvmtiEnv* env, 
                       jvmtiEvent event_type);
124Получите Функции Расширения
jvmtiError (JNICALL *GetExtensionFunctions) (jvmtiEnv* env, 
                       jint* extension_count_ptr, 
                       jvmtiExtensionFunctionInfo** extensions);
125Получите События Расширения
jvmtiError (JNICALL *GetExtensionEvents) (jvmtiEnv* env, 
                       jint* extension_count_ptr, 
                       jvmtiExtensionEventInfo** extensions);
126Обратный вызов События Расширения набора
jvmtiError (JNICALL *SetExtensionEventCallback) (jvmtiEnv* env, 
                       jint extension_event_index, 
                       jvmtiExtensionEvent callback);
127Расположите Среду
jvmtiError (JNICALL *DisposeEnvironment) (jvmtiEnv* env);
128Получите Ошибочное Имя
jvmtiError (JNICALL *GetErrorName) (jvmtiEnv* env, 
                       jvmtiError error, 
                       char** name_ptr);
129Получите Формат JLocation
jvmtiError (JNICALL *GetJLocationFormat) (jvmtiEnv* env, 
                       jvmtiJlocationFormat* format_ptr);
130Получите Системные Свойства
jvmtiError (JNICALL *GetSystemProperties) (jvmtiEnv* env, 
                       jint* count_ptr, 
                       char*** property_ptr);
131Получите Системное Свойство
jvmtiError (JNICALL *GetSystemProperty) (jvmtiEnv* env, 
                       const char* property, 
                       char** value_ptr);
132Системное Свойство набора
jvmtiError (JNICALL *SetSystemProperty) (jvmtiEnv* env, 
                       const char* property, 
                       const char* value_ptr);
133Получите Фазу
jvmtiError (JNICALL *GetPhase) (jvmtiEnv* env, 
                       jvmtiPhase* phase_ptr);
134Получите информацию Таймера ЦП Текущего потока
jvmtiError (JNICALL *GetCurrentThreadCpuTimerInfo) (jvmtiEnv* env, 
                       jvmtiTimerInfo* info_ptr);
135Получите Процессорное время Текущего потока
jvmtiError (JNICALL *GetCurrentThreadCpuTime) (jvmtiEnv* env, 
                       jlong* nanos_ptr);
136Получите информацию Таймера ЦП Потока
jvmtiError (JNICALL *GetThreadCpuTimerInfo) (jvmtiEnv* env, 
                       jvmtiTimerInfo* info_ptr);
137Получите Процессорное время Потока
jvmtiError (JNICALL *GetThreadCpuTime) (jvmtiEnv* env, 
                       jthread thread, 
                       jlong* nanos_ptr);
138Получите информацию Таймера
jvmtiError (JNICALL *GetTimerInfo) (jvmtiEnv* env, 
                       jvmtiTimerInfo* info_ptr);
139Получите Время
jvmtiError (JNICALL *GetTime) (jvmtiEnv* env, 
                       jlong* nanos_ptr);
140Получите Потенциальные Возможности
jvmtiError (JNICALL *GetPotentialCapabilities) (jvmtiEnv* env, 
                       jvmtiCapabilities* capabilities_ptr);
141зарезервированный
void *reserved141;
142Добавьте Возможности
jvmtiError (JNICALL *AddCapabilities) (jvmtiEnv* env, 
                       const jvmtiCapabilities* capabilities_ptr);
143Оставьте Возможности
jvmtiError (JNICALL *RelinquishCapabilities) (jvmtiEnv* env, 
                       const jvmtiCapabilities* capabilities_ptr);
144Получите Доступные Процессоры
jvmtiError (JNICALL *GetAvailableProcessors) (jvmtiEnv* env, 
                       jint* processor_count_ptr);
145Получите Номера версий Класса
jvmtiError (JNICALL *GetClassVersionNumbers) (jvmtiEnv* env, 
                       jclass klass, 
                       jint* minor_version_ptr, 
                       jint* major_version_ptr);
146Получите Постоянный Пул
jvmtiError (JNICALL *GetConstantPool) (jvmtiEnv* env, 
                       jclass klass, 
                       jint* constant_pool_count_ptr, 
                       jint* constant_pool_byte_count_ptr, 
                       unsigned char** constant_pool_bytes_ptr);
147Получите Среду Локальное Хранение
jvmtiError (JNICALL *GetEnvironmentLocalStorage) (jvmtiEnv* env, 
                       void** data_ptr);
148Среда набора Локальное Хранение
jvmtiError (JNICALL *SetEnvironmentLocalStorage) (jvmtiEnv* env, 
                       const void* data);
149Добавьте К Поиску Загрузчика Класса Начальной загрузки
jvmtiError (JNICALL *AddToBootstrapClassLoaderSearch) (jvmtiEnv* env, 
                       const char* segment);
150Установите Многословный Флаг
jvmtiError (JNICALL *SetVerboseFlag) (jvmtiEnv* env, 
                       jvmtiVerboseFlag flag, 
                       jboolean value);
151Добавьте К Системному Поиску Загрузчика Класса
jvmtiError (JNICALL *AddToSystemClassLoaderSearch) (jvmtiEnv* env, 
                       const char* segment);
152Повторно преобразуйте Классы
jvmtiError (JNICALL *RetransformClasses) (jvmtiEnv* env, 
                       jint class_count, 
                       const jclass* classes);
153Получите Находящуюся в собственности Информацию Глубины Стека Монитора
jvmtiError (JNICALL *GetOwnedMonitorStackDepthInfo) (jvmtiEnv* env, 
                       jthread thread, 
                       jint* monitor_info_count_ptr, 
                       jvmtiMonitorStackDepthInfo** monitor_info_ptr);
154Получите Объектный Размер
jvmtiError (JNICALL *GetObjectSize) (jvmtiEnv* env, 
                       jobject object, 
                       jlong* size_ptr);
155Получите Локальный Экземпляр
jvmtiError (JNICALL *GetLocalInstance) (jvmtiEnv* env, 
                       jthread thread, 
                       jint depth, 
                       jobject* value_ptr);


События

Обработка Событий

Агентам можно сообщить о многих событиях, которые происходят в прикладных программах.

Чтобы обработать события, определяйте ряд функций обратного вызова с SetEventCallbacks. Для каждого события вызовут соответствующую функцию обратного вызова. Параметры функции обратного вызова обеспечивают дополнительную информацию о событии.

Функцию обратного вызова обычно вызывают изнутри потока приложения. JVM 

Некоторая JVM  

Кроме где утверждено иначе, события поставляются на потоке, который вызвал событие. События отправляются в то время, когда они происходят. Спецификация для каждого события включает набор фаз, в которых это может быть отправлено; если действие инициирования события происходит во время другой фазы, никакое событие не отправляется.

Поток, который генерирует событие, не изменяет свое состояние выполнения (например, событие не заставляет поток быть приостановленным). Если агент хочет, чтобы событие привело к приостановке, то агент ответственен за явную приостановку потока с SuspendThread.

Если событие будет включено в многократных средах, то событие будет отправлено каждому агенту в порядке, что среды создавались.

Включение Событиям

Все события первоначально отключаются. Чтобы получить любое событие:

Многократные cо-расположенные События

Во многих ситуациях для многократных событий возможно произойти в том же самом расположении в одном потоке. Когда это происходит, обо всех событиях сообщают посредством обратных вызовов события в порядке, определенном в этом разделе.

Если текущее расположение в точке входа метода, MethodEntry о событии сообщают перед любым другим событием в текущем расположении в том же самом потоке.

Если выгода исключения была обнаружена в текущем расположении, или потому что это - начало пункта выгоды или собственного метода, который очистил исключение на ожидании, возвратился, exceptionCatch о событии сообщают перед любым другим событием в текущем расположении в том же самом потоке.

Если a singleStep событие или breakpoint событие инициировано в текущем расположении, событие определяется, чтобы сразу произойти прежде, чем код в текущем расположении будет выполнен. Об этих событиях сообщают перед любыми событиями, которые инициированы выполнением кода в текущем расположении в том же самом потоке (определенно: exception, fieldAccess, и fieldModification). Если об обоих, шаг и событие контрольной точки инициированы для того же самого потока и расположения, событие шага, сообщают перед событием контрольной точки.

Если текущее расположение является точкой выхода метода (то есть, последнее расположение прежде, чем возвратиться к вызывающей стороне), MethodExit событие и FramePop о событии (если требующийся) сообщают после всех других событий в текущем расположении в том же самом потоке. Нет никакого указанного упорядочивания этих двух событий друг относительно друга.

Cо-расположенные события могут быть инициированы во время обработки некоторого другого события агентом в том же самом расположении в том же самом потоке. Если такое событие, типа y, инициировано во время обработки события типа x, и если x предшествует y в упорядочивании, определенном выше, о cо-расположенном событии y сообщают для текущего потока и расположения. Если x не предшествует y, о y не сообщают для текущего потока и расположения. Например, если контрольная точка устанавливается в текущем расположении во время обработки SingleStep, о той контрольной точке сообщат прежде, чем поток отъезжает текущее расположение.

Следующие события, как никогда полагают, не cо-располагаются с другими событиями.

Обратные вызовы события

Структура обратного вызова события ниже используется, чтобы определить функцию-обработчик для событий. Это устанавливается с SetEventCallbacks функция.
typedef struct {
    jvmtiEventVMInit VMInit;
    jvmtiEventVMDeath VMDeath;
    jvmtiEventThreadStart ThreadStart;
    jvmtiEventThreadEnd ThreadEnd;
    jvmtiEventClassFileLoadHook ClassFileLoadHook;
    jvmtiEventClassLoad ClassLoad;
    jvmtiEventClassPrepare ClassPrepare;
    jvmtiEventVMStart VMStart;
    jvmtiEventException Exception;
    jvmtiEventExceptionCatch ExceptionCatch;
    jvmtiEventSingleStep SingleStep;
    jvmtiEventFramePop FramePop;
    jvmtiEventBreakpoint Breakpoint;
    jvmtiEventFieldAccess FieldAccess;
    jvmtiEventFieldModification FieldModification;
    jvmtiEventMethodEntry MethodEntry;
    jvmtiEventMethodExit MethodExit;
    jvmtiEventNativeMethodBind NativeMethodBind;
    jvmtiEventCompiledMethodLoad CompiledMethodLoad;
    jvmtiEventCompiledMethodUnload CompiledMethodUnload;
    jvmtiEventDynamicCodeGenerated DynamicCodeGenerated;
    jvmtiEventDataDumpRequest DataDumpRequest;
    jvmtiEventReserved reserved72;
    jvmtiEventMonitorWait MonitorWait;
    jvmtiEventMonitorWaited MonitorWaited;
    jvmtiEventMonitorContendedEnter MonitorContendedEnter;
    jvmtiEventMonitorContendedEntered MonitorContendedEntered;
    jvmtiEventReserved reserved77;
    jvmtiEventReserved reserved78;
    jvmtiEventReserved reserved79;
    jvmtiEventResourceExhausted ResourceExhausted;
    jvmtiEventGarbageCollectionStart GarbageCollectionStart;
    jvmtiEventGarbageCollectionFinish GarbageCollectionFinish;
    jvmtiEventObjectFree ObjectFree;
    jvmtiEventVMObjectAlloc VMObjectAlloc;
} jvmtiEventCallbacks;


Событие Индексирует


Единственный Шаг

void JNICALL
SingleStep(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location)
Единственные события шага позволяют агенту прослеживать выполнение потока при самой прекрасной гранулярности, позволенной VM. Единственное событие шага сгенерировано всякий раз, когда поток достигает нового расположения. Как правило, единственные события шага представляют завершение одной инструкции VM как определено в Спецификации Виртуальной машины Java™. Однако, некоторые реализации могут определить расположения по-другому. В любом случае method и location параметры однозначно определяют текущее расположение и позволяют отображение на исходный файл и номер строки, когда та информация доступна.

Никакие единственные события шага не сгенерированы изнутри собственных методов.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_SINGLE_STEP60SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_SINGLE_STEP, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_single_step_events Может получить единственные события шага

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
threadjthread Поток, собирающийся выполнение новая инструкция
methodjmethodID Метод, собирающийся выполнять новую инструкцию
locationjlocation Расположение новой инструкции


Контрольная точка

void JNICALL
Breakpoint(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location)
События контрольной точки сгенерированы всякий раз, когда поток достигает расположения, определяемого как контрольная точка с SetBreakpoint. method и location параметры однозначно определяют текущее расположение и позволяют отображение на исходный файл и номер строки, когда та информация доступна.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_BREAKPOINT62SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_BREAKPOINT, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_breakpoint_events Может установить и таким образом добраться Breakpoint события

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток.
threadjthread Поток, которые поражают контрольную точку
methodjmethodID Метод, которые поражают контрольную точку
locationjlocation расположение контрольной точки


Доступ к полю

void JNICALL
FieldAccess(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location,
            jclass field_klass,
            jobject object,
            jfieldID field)
События доступа к полю сгенерированы всякий раз, когда поток получает доступ к полю, которое определялось как контрольная точка с SetFieldAccessWatch. method и location параметры однозначно определяют текущее расположение и позволяют отображение на исходный файл и номер строки, когда та информация доступна.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_FIELD_ACCESS63SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_FIELD_ACCESS, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_field_access_events Может установить контрольные точки на доступе к полю - SetFieldAccessWatch

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
threadjthread Поток, получающий доступ к полю
methodjmethodID Метод, где доступ происходит
locationjlocation Расположение, где доступ происходит
field_klassjclass Класс получаемого доступ поля
objectjobject Объект с полем, получаемым доступ, если поле является полем экземпляра; NULL иначе
fieldjfieldID Получаемое доступ поле


Полевая Модификация

void JNICALL
FieldModification(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location,
            jclass field_klass,
            jobject object,
            jfieldID field,
            char signature_type,
            jvalue new_value)
Полевые события модификации сгенерированы всякий раз, когда поток изменяет поле, которое определялось как контрольная точка с SetFieldModificationWatch. method и location параметры однозначно определяют текущее расположение и позволяют отображение на исходный файл и номер строки, когда та информация доступна.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_FIELD_MODIFICATION64SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_FIELD_MODIFICATION, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_field_modification_events Может установить контрольные точки на полевой модификации - SetFieldModificationWatch

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
threadjthread Поток, изменяющий поле
methodjmethodID Метод, где модификация происходит
locationjlocation Расположение, где модификация происходит
field_klassjclass Класс изменяемого поля
objectjobject Объект с полем, изменяемым, если поле является полем экземпляра; NULL иначе
fieldjfieldID Изменяемое поле
signature_typechar Тип подписи нового значения
new_valuejvalue Новое значение


Фрейм Появляется

void JNICALL
FramePop(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jboolean was_popped_by_exception)
Фрейм появляется, события сгенерированы на выход от единственного метода в единственном фрейме как определено в звонке NotifyFramePop. Это - истина, вызывается ли завершение, выполняя его инструкцию возврата или выдавая исключение к его вызывающей стороне (см. was_popped_by_exception). Однако, фрейм появляется вызванный PopFrame о функции не сообщают.

Расположение, о котором сообщают GetFrameLocation идентифицирует исполнимое расположение в методе возврата, сразу до возврата.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_FRAME_POP61SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_FRAME_POP, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_frame_pop_events Может установить и таким образом добраться FramePop события

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
threadjthread Поток, который выталкивает фрейм
methodjmethodID Выталкиваемый метод
was_popped_by_exceptionjboolean Истина, если фрейм был вытолкан выданным исключением. Ложь, если метод выходил через его инструкцию возврата.


Запись метода

void JNICALL
MethodEntry(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method)
События записи метода сгенерированы после записи методов языка программирования Java (включая собственные методы).

Расположение, о котором сообщают GetFrameLocation идентифицирует начальное исполнимое расположение в методе.

Включение записи метода или событиям выхода значительно ухудшит производительность на многих платформах и таким образом не советуется для производительности критическое использование (такое как профилирование). Инструментарий байт-кода должен использоваться в этих случаях.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_METHOD_ENTRY65SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_METHOD_ENTRY, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_method_entry_events Может генерировать события записи метода при вводе метода

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
threadjthread Поток, вводящий метод
methodjmethodID Вводимый метод


Выход метода

void JNICALL
MethodExit(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jboolean was_popped_by_exception,
            jvalue return_value)
События выхода метода сгенерированы на выход от методов языка программирования Java (включая собственные методы). Это - истина, вызывается ли завершение, выполняя его инструкцию возврата или выдавая исключение к его вызывающей стороне (см. was_popped_by_exception).

method поле однозначно определяет метод, из которого, вводимый или выходят. frame поле обеспечивает доступ к стековому фрейму для метода.

Расположение, о котором сообщают GetFrameLocation идентифицирует исполнимое расположение в методе возврата сразу до возврата.

Включение записи метода или событиям выхода значительно ухудшит производительность на многих платформах и таким образом не советуется для производительности критическое использование (такое как профилирование). Инструментарий байт-кода должен использоваться в этих случаях.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_METHOD_EXIT66SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_METHOD_EXIT, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_method_exit_events Может генерировать события выхода метода при отъезде метода

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
threadjthread Поток, выходящий из метода
methodjmethodID Выходивший метод
was_popped_by_exceptionjboolean Истина, если фрейм был вытолкан выданным исключением. Ложь, если метод выходил через его инструкцию возврата.
return_valuejvalue Возвращаемое значение выходившего метода. Неопределенный и не должен использоваться если was_popped_by_exception истина.


Собственный Метод Связывает

void JNICALL
NativeMethodBind(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            void* address,
            void** new_address_ptr)
Событие Native Method Bind отправляется, когда VM связывает язык программирования Java собственный метод с адресом функции, которая реализует собственный метод. Это произойдет, когда собственный метод вызовут впервые и также происходит, когда JNI функционирует RegisterNatives вызывается. Это событие позволяет связыванию быть перенаправленным к определенной агентом функции прокси. Это событие не отправляется, когда собственный метод несвязанный. Как правило, эта функция прокси должна будет быть определенной для определенного метода или, чтобы обработать общий случай, автоматически сгенерированный ассемблерный код, так как после кода инструментария выполняется, функция в исходном обязательном адресе будет обычно вызываться. Исходная привязка может быть восстановлена или перенаправление, измененное при помощи функции JNI RegisterNatives. Некоторые события могут быть отправлены во время исконной фазы, JNI и большей части JVM 

ФазаТип событияЧислоВключениеС тех пор
отправленный во время исконного, запустите или живите фаза JVMTI_EVENT_NATIVE_METHOD_BIND67SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_NATIVE_METHOD_BIND, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_native_method_bind_events Может генерировать события, когда собственный метод связывается с его реализацией

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток будет NULL если отправлено во время исконной фазы.
threadjthread Поток, запрашивающий связывание
methodjmethodID Собственный связываемый метод
addressvoid* Адрес VM собирается связать с - то есть, адрес реализации собственного метода
new_address_ptrvoid** если адрес, на который ссылаются, изменяется (то есть, если *new_address_ptr устанавливается), привязка будет вместо этого сделана к предоставленному адресу.


Исключение

void JNICALL
Exception(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location,
            jobject exception,
            jmethodID catch_method,
            jlocation catch_location)
События исключения сгенерированы всякий раз, когда исключение сначала обнаруживается в методе языка программирования Java. Где "исключение" означает любого java.lang.Throwable. Исключение, возможно, было выдано языком программирования Java или собственным методом, но в случае собственных методов, событие не сгенерировано, пока исключение сначала не замечается методом языка программирования Java. Если исключение устанавливается и очищается в собственном методе (и таким образом никогда не видимо к коду языка программирования Java), никакое событие исключения не сгенерировано.

method и location параметры однозначно определяют текущее расположение (где исключение было обнаружено), и позвольте отображение на исходный файл и номер строки, когда та информация доступна. exception поле идентифицирует брошенный объект исключения. catch_method и catch_location идентифицируйте расположение пункта выгоды, если таковые вообще имеются, который обрабатывает выданное исключение. Если нет такого пункта выгоды, каждое поле устанавливается в 0. Нет никакой гарантии, что поток будет когда-либо достигать этого пункта выгоды. Если есть собственные методы на стеке вызовов между расположением броска и пунктом выгоды, исключение может быть сброшено одним из тех собственных методов. Точно так же исключения, о которых сообщают как непойманные (catch_klass и др. набор к 0) может фактически быть пойман собственным кодом. Агенты могут проверить на эти возникновения, контролируя ExceptionCatch события. Отметьте, что наконец пункты реализуются как выгода и перебросок. Поэтому о них сообщат в расположении выгоды.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_EXCEPTION58SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_EXCEPTION, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_exception_events Могли бросить исключение и события выгоды исключения

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
threadjthread Поток, генерирующий исключение
methodjmethodID Метод, генерирующий исключение
locationjlocation Расположение, где исключение произошло
exceptionjobject Выданное исключение
catch_methodjmethodID Метод, который поймает исключение, или NULL если никакая известная выгода
catch_locationjlocation расположение, которое поймает исключение или обнулит если никакая известная выгода


Выгода исключения

void JNICALL
ExceptionCatch(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location,
            jobject exception)
События выгоды исключения сгенерированы всякий раз, когда выданное исключение поймано. Где "исключение" означает любого java.lang.Throwable. Если исключение поймано в методе языка программирования Java, событие сгенерировано, когда пункт выгоды достигается. Если исключение поймано в собственном методе, событие сгенерировано, как только управление возвращается к методу языка программирования Java. События выгоды исключения сгенерированы для любого исключения, для которого бросок был обнаружен в методе языка программирования Java. Отметьте, что наконец пункты реализуются как выгода и перебросок. Поэтому они генерируют события выгоды исключения.

method и location параметры однозначно определяют текущее расположение и позволяют отображение на исходный файл и номер строки, когда та информация доступна. Для исключений, пойманных в методе языка программирования Java, exception объект идентифицирует объект исключения. Исключения, пойманные в собственных методах, не обязательно доступны к тому времени, когда о выгоде исключения сообщают, таким образом, exception поле устанавливается в NULL.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_EXCEPTION_CATCH59SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_EXCEPTION_CATCH, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_exception_events Могли бросить исключение и события выгоды исключения

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
threadjthread Поток ловя исключение
methodjmethodID Метод ловя исключение
locationjlocation Расположение, где исключение поймано
exceptionjobject Пойманное исключение


Поток Запускается

void JNICALL
ThreadStart(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread)
Поток запускается, события сгенерированы новым потоком прежде, чем его начальный метод выполнится.

Поток может быть перечислен в массиве, возвращенном GetAllThreads перед его потоком запускаются, событие сгенерировано. Для других событий возможно быть сгенерированным на потоке прежде, чем его поток запустит событие.

Событие пересылается недавно запущенный thread.

ФазаТип событияЧислоВключениеС тех пор
отправленный во время запуска или живой фазы JVMTI_EVENT_THREAD_START52SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_THREAD_START, NULL)1.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток.
threadjthread Запуск потока


Конец потока

void JNICALL
ThreadEnd(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread)
События конца потока сгенерированы завершающимся потоком после того, как его начальный метод закончил выполнение.

Поток может быть перечислен в массиве, возвращенном GetAllThreads после того, как его событие конца потока сгенерировано. Никакие события не сгенерированы на потоке после его события конца потока.

Событие отправляется на смерти thread.

ФазаТип событияЧислоВключениеС тех пор
отправленный во время запуска или живой фазы JVMTI_EVENT_THREAD_END53SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_THREAD_END, NULL)1.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток.
threadjthread Окончание потока


Загрузка класса

void JNICALL
ClassLoad(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jclass klass)
Событие загрузки class сгенерировано, когда class сначала загружается. Порядок событий загрузки class, сгенерированных определенным потоком, как гарантируют, будет соответствовать порядок class, загружающегося в пределах того потока. Создание class массива не генерирует событие загрузки class. Создание примитивного class (например, java.lang. Целое число. ВВЕДИТЕ), не генерирует событие загрузки class.

Это событие отправляется на ранней стадии в загрузке class. В результате class должен использоваться тщательно. Отметьте, например, что методы и поля еще не загружаются, таким образом, запросы для методов, поля, подклассы, и так далее не будут давать корректные результаты. См. "Загрузку Классов и Интерфейсов" в Спецификации языка Java. Поскольку большинство имеет целью ClassPrepare событие будет более полезным.

ФазаТип событияЧислоВключениеС тех пор
отправленный во время запуска или живой фазы JVMTI_EVENT_CLASS_LOAD55SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_CLASS_LOAD, NULL)1.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
threadjthread Поток, загружающий class
klassjclass Загружаемый класс


Класс Готовится

void JNICALL
ClassPrepare(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jclass klass)
class готовится, событие сгенерировано, когда подготовка class полна. В этой точке поля class, методы, и реализованные интерфейсы доступны, и никакой код от class не был выполнен. Так как у классов массива никогда нет полей, или методы, class готовится, события не сгенерированы для них. Класс готовится, события не сгенерированы для примитивных классов (например, java.lang.Integer.TYPE).

ФазаТип событияЧислоВключениеС тех пор
отправленный во время запуска или живой фазы JVMTI_EVENT_CLASS_PREPARE56SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_CLASS_PREPARE, NULL)1.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
threadjthread Поток, генерирующий class, готовится
klassjclass Подготовленный класс


Рычаг Загрузки Файла класса

void JNICALL
ClassFileLoadHook(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jclass class_being_redefined,
            jobject loader,
            const char* name,
            jobject protection_domain,
            jint class_data_len,
            const unsigned char* class_data,
            jint* new_class_data_len,
            unsigned char** new_class_data)
Это событие отправляется, когда VM получает данные файла class, но прежде, чем это создаст представление в оперативной памяти для того class. Это событие также отправляется, когда class изменяется RetransformClasses функционируйте или RedefineClasses функция, вызванная в любом инструментарии байт-кода JVM для информации об использовании.

Это событие может быть отправлено прежде, чем VM инициализируется (исконная фаза). В это время никакие ресурсы VM не должны быть созданы. Некоторые классы не могли бы быть совместимыми с функцией (eg. Классы ROMized), и это событие не будет сгенерировано для этих классов.

Агент должен выделить место для измененного буфера данных файла class, используя функцию выделения памяти Allocate потому что VM ответственен за освобождение нового использования буфера данных файла class Deallocate. Отметьте это Allocate разрешается во время исконной фазы.

Если агент хочет изменить файл class, он должен установить new_class_data указать на недавно инструментованный буфер данных файла class и установить new_class_data_len к длине того буфера прежде, чем возвратиться из этого вызова. Если никакая модификация не требуется, агент просто не устанавливает new_class_data. Если многократные агенты включили этому событию, результаты объединяются в цепочку. Таким образом, если new_class_data был установлен, это становится class_data для следующего агента.

Порядок, который это событие отправляется каждой среде, отличается от других событий. Это событие отправляется средам в следующем порядке: Когда инициировано RetransformClasses, это событие отправляется только перепреобразованию способные среды.

ФазаТип событияЧислоВключениеС тех пор
отправленный во время исконного, запустите или живите фаза JVMTI_EVENT_CLASS_FILE_LOAD_HOOK54SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, NULL)1.0

Возможности
Необходимая Функциональность
Дополнительные функции
Возможность Эффект
can_generate_all_class_hook_events Может генерировать события ClassFileLoadHook для каждого загруженного class.

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток. Будет NULL если отправлено во время исконной фазы.
class_being_redefinedjclass class, пересматриваемый или повторно преобразованный. NULL если отправлено загрузкой class.
loaderjobject Загрузчик class, загружающий class. NULL если начальная загрузка загрузчик class.
nameconst char* Имя class, загружаемого как внутреннее полностью определенное имя VM (например, "java/util/List"), закодированный как измененная строка UTF-8. Отметьте: если class определяется с помощью a NULL имя или без определенного имени, name будет NULL.
protection_domainjobject ProtectionDomain из class.
class_data_lenjint Длина текущего буфера данных файла class.
class_dataconst unsigned char* Указатель на текущий буфер данных файла class.
new_class_data_lenjint* Указатель на длину нового буфера данных файла class.
new_class_dataunsigned char** Указатель на указатель на инструментованный буфер данных файла class.


VM Запускают Событие

void JNICALL
VMStart(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env)
Событие инициализации VM сигнализирует запуск VM. В это время JNI жив, но VM полностью еще не инициализируется. Как только это событие сгенерировано, агент свободен вызвать любую функцию JNI. Это событие сигнализирует начало фазы запуска, JVM 

В случае отказа запуска VM не будет отправлено это событие.

ФазаТип событияЧислоВключениеС тех пор
отправленный во время запуска или живой фазы JVMTI_EVENT_VM_START57SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_START, NULL)1.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток.


Событие Инициализации VM

void JNICALL
VMInit(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread)
Событие инициализации VM сигнализирует завершение инициализации VM. Как только это событие сгенерировано, агент свободен вызвать любой JNI или JVM 

В случае отказа запуска VM не будет отправлено это событие.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_VM_INIT50SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, NULL)1.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток.
threadjthread Начальный поток


Смертельное Событие VM

void JNICALL
VMDeath(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env)
Смертельное событие VM уведомляет агент завершения VM. Никакие события не будут иметь место после события VMDeath.

В случае отказа запуска VM не будет отправлено это событие. Отметьте, что Agent_OnUnload все еще вызовут в этих случаях.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_VM_DEATH51SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_DEATH, NULL)1.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток


Скомпилированная Загрузка Метода

typedef struct {
    const void* start_address;
    jlocation location;
} jvmtiAddrLocationMap;
void JNICALL
CompiledMethodLoad(jvmtiEnv *jvmti_env,
            jmethodID method,
            jint code_size,
            const void* code_addr,
            jint map_length,
            const jvmtiAddrLocationMap* map,
            const void* compile_info)
Отправленный, когда метод компилируется и загружается в память VM. Если это разгружается, CompiledMethodUnload событие отправляется. Если это перемещается, CompiledMethodUnload событие отправляется, сопровождается новым CompiledMethodLoad событие. Отметьте, что у единственного метода могут быть многократные скомпилированные формы, и что это событие будет отправлено за каждой формой. Отметьте также, что несколько методов могут быть встроены в единственное адресное пространство, и что это событие будет отправлено за каждым методом.

Эти события могут быть отправлены после их начального возникновения с GenerateEvents.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_COMPILED_METHOD_LOAD68SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_COMPILED_METHOD_LOAD, NULL)1.0

jvmtiAddrLocationMap - Собственный адрес к записи расположения
Поле Ввести Описание
start_addressconst void* Запуск собственного адреса кода, соответствующего расположению
locationjlocation Соответствующее расположение. См. GetJLocationFormat для значения расположения.

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_compiled_method_load_events Может генерировать события, когда метод компилируется или разгружается

Параметры
Имя Ввести Описание
methodjmethodID Метод, скомпилированный и загруженный
code_sizejint Размер скомпилированного кода
code_addrconst void* Адрес, где скомпилированный код метода загружается
map_lengthjint Число jvmtiAddrLocationMap записи в таблице адресов. Нуль, отображая информацию не может быть предоставлен.
mapconst jvmtiAddrLocationMap* Карта от собственных адресов до расположения. Собственное адресное пространство каждой записи от start_address к start_address-1 из следующей записи. NULL если отображение информации не может быть предоставлено.
compile_infoconst void* Информация о компиляции VM-specific. Информацией о компиляции, на которую ссылаются, управляет VM и не должна зависеть от агента для набора. Реализация VM определяет контент и время жизни информации.


Скомпилированный Метод Разгружается

void JNICALL
CompiledMethodUnload(jvmtiEnv *jvmti_env,
            jmethodID method,
            const void* code_addr)
Отправленный, когда скомпилированный метод разгружается из памяти. Это событие не могло бы быть отправлено на потоке, который выполнял разгружение. Это событие может быть отправлено когда-то после того, как разгружение происходит, но будет отправлено прежде, чем память снова используется недавно сгенерированным скомпилированным методом. Это событие может быть отправлено после того, как class разгружается.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_COMPILED_METHOD_UNLOAD69SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_COMPILED_METHOD_UNLOAD, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_compiled_method_load_events Может генерировать события, когда метод компилируется или разгружается

Параметры
Имя Ввести Описание
methodjmethodID Скомпилированный разгружаемый метод. Для идентификации скомпилированного метода только - может быть разгружен class, и поэтому метод не должен использоваться в качестве параметра дальнейшему JNI или JVM 
code_addrconst void* Адрес, где скомпилированный код метода был загружен. Для идентификации скомпилированного метода только - возможно, было исправлено пространство.


Динамический Сгенерированный Код

void JNICALL
DynamicCodeGenerated(jvmtiEnv *jvmti_env,
            const char* name,
            const void* address,
            jint length)
Отправленный, когда компонент виртуальной машины сгенерирован динамически. Это не соответствует коду языка программирования Java, который компилируется - см. CompiledMethodLoad. Это для собственного кода - например, интерпретатор, который сгенерирован по-другому в зависимости от параметров командной строки.

Отметьте, что у этого события нет никакой возможности управления. Если VM не может генерировать эти события, он просто не отправляет никому.

Эти события могут быть отправлены после их начального возникновения с GenerateEvents.

ФазаТип событияЧислоВключениеС тех пор
отправленный во время исконного, запустите или живите фаза JVMTI_EVENT_DYNAMIC_CODE_GENERATED70SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_DYNAMIC_CODE_GENERATED, NULL)1.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание
nameconst char* Имя кода, закодированного как измененная строка UTF-8. Предназначенный для дисплея к конечному пользователю. Имя не могло бы быть уникальным.
addressconst void* Собственный адрес кода
lengthjint Длина в байтах кода


Запрос Дампа данных

void JNICALL
DataDumpRequest(jvmtiEnv *jvmti_env)
Отправленный VM, чтобы запросить агент вывести свои данные. Это - только подсказка, и агент не должен реагировать на это событие. Это полезно для обработки сигналов командной строки от пользователей. Например, в Java 2 SDK CTRL-Break на Win32 и CTRL-\на Солярисе заставляют VM отправлять это событие агенту.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_DATA_DUMP_REQUEST71SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_DATA_DUMP_REQUEST, NULL)1.0

Возможности
Необходимая Функциональность

Параметры
Имя Ввести Описание


Монитор Спорил, Входят

void JNICALL
MonitorContendedEnter(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object)
Отправленный, когда поток пытается ввести монитор языка программирования Java, уже полученный другим потоком.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_MONITOR_CONTENDED_ENTER75SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_MONITOR_CONTENDED_ENTER, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_monitor_events Может генерировать события на действии монитора

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
threadjthread JNI локальная ссылка на поток, пытающийся ввести монитор
objectjobject JNI локальная ссылка на монитор


Монитор Спорил Вводимый

void JNICALL
MonitorContendedEntered(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object)
Отправленный, когда поток вводит монитор языка программирования Java после ожидания этого, чтобы быть выпущенным другим потоком.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_MONITOR_CONTENDED_ENTERED76SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_MONITOR_CONTENDED_ENTERED, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_monitor_events Может генерировать события на действии монитора

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
threadjthread JNI локальная ссылка на поток, вводящий монитор
objectjobject JNI локальная ссылка на монитор


Монитор Ожидает

void JNICALL
MonitorWait(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object,
            jlong timeout)
Отправленный, когда поток собирается ожидать на объекте.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_MONITOR_WAIT73SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_MONITOR_WAIT, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_monitor_events Может генерировать события на действии монитора

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
threadjthread JNI локальная ссылка на поток, собирающийся ожидать
objectjobject JNI локальная ссылка на монитор
timeoutjlong Число миллисекунд поток будет ожидать


Монитор Ожидал

void JNICALL
MonitorWaited(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object,
            jboolean timed_out)
Отправленный, когда поток заканчивает ожидать на объекте.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_MONITOR_WAITED74SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_MONITOR_WAITED, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_monitor_events Может генерировать события на действии монитора

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
threadjthread Локальная ссылка JNI на поток, который был закончен, ожидая
objectjobject JNI локальная ссылка на монитор.
timed_outjboolean Истина, если монитор, синхронизированный


Исчерпанный ресурс

void JNICALL
ResourceExhausted(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jint flags,
            const void* reserved,
            const char* description)
Отправленный, когда ресурс VM, необходимый рабочему приложению, был исчерпан. За исключением необходимого дополнительными возможностями, набор ресурсов, которые сообщают об исчерпании, является зависящим от реализации.

Следующие битовые флаги определяют свойства исчерпания ресурса:
Флаги Исчерпания ресурса
Постоянный Значение Описание
JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR0x0001 После этого события возвраты VM бросит a java.lang.OutOfMemoryError.
JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP0x0002 VM был неспособен выделить память от "кучи" платформы JavaTM. "Куча" является областью данных времени выполнения, от которой выделяется память для всех экземпляров class и массивов.
JVMTI_RESOURCE_EXHAUSTED_THREADS0x0004 VM был неспособен создать поток.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_RESOURCE_EXHAUSTED80SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_RESOURCE_EXHAUSTED, NULL)1.1

Возможности
Необходимая Функциональность
Дополнительные функции
Возможность Эффект
can_generate_resource_exhaustion_heap_events Может генерировать события, когда VM неспособен выделить память от "кучи".
can_generate_resource_exhaustion_threads_events Может генерировать события, когда VM неспособен создать поток.

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
flagsjint Флаги, определяющие свойства исчерпания ресурса как определено Флагами Исчерпания Ресурса.
reservedconst void* Зарезервированный.
descriptionconst char* Описание исчерпания ресурса, закодированного как измененная строка UTF-8.


Выделение Объекта VM

void JNICALL
VMObjectAlloc(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jobject object,
            jclass object_klass,
            jlong size)
Отправленный то, когда метод заставляет виртуальную машину выделять Объект, видимый коду языка программирования Java и выделению, не обнаруживаемо другими intrumentation механизмами. Обычно объектное выделение должно быть обнаружено, инструментуя байт-коды выделения методов. Объектное выделение, сгенерированное в собственном коде вызовами функции JNI, должно быть обнаружено, используя перехват функции JNI. Некоторые методы, возможно, не связали байт-коды и не являются собственными методами, они вместо этого выполняются непосредственно VM. Эти методы должны отправить это событие. Виртуальные машины, которые неспособны к инструментарию байт-кода для некоторых или всех их методов, могут отправить это событие.

Типичные примеры, куда это событие могло бы быть отправлено: Случаи, где это событие не было бы сгенерировано:

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_VM_OBJECT_ALLOC84SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_VM_OBJECT_ALLOC, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_vm_object_alloc_events Может генерировать события на выделении VM объекта

Параметры
Имя Ввести Описание
jni_env JNIEnv * Среда JNI события (текущий) поток
threadjthread Поток, выделяющий объект.
objectjobject Локальная ссылка JNI на объект, который был выделен
object_klassjclass JNI локальная ссылка на class объекта
sizejlong Размер объекта (в байтах). См. GetObjectSize.


Свободный объект

void JNICALL
ObjectFree(jvmtiEnv *jvmti_env,
            jlong tag)
Объектное Бесплатное мероприятие отправляется, когда сборщик "мусора" освобождает объект. События только отправляются за теговыми объектами - см. функции "кучи".

Обработчик событий не должен использовать функции JNI и не должен использовать JVM 

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_OBJECT_FREE83SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_OBJECT_FREE, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_object_free_events Может генерировать события, когда сборщик "мусора" освобождает объект

Параметры
Имя Ввести Описание
tagjlong Тег освобожденного объекта


Сборка "мусора" Запускается

void JNICALL
GarbageCollectionStart(jvmtiEnv *jvmti_env)
Событие Garbage Collection Start отправляется, когда пауза сборки "мусора" начинается. Только остановитесь - о мировых наборах сообщают - то есть, наборы, во время которых все потоки прекращают изменять состояние виртуальной машины Java. Это означает, что некоторые коллекторы никогда не будут генерировать эти события. Это событие отправляется, в то время как VM все еще останавливается, таким образом обработчик событий не должен использовать функции JNI и не должен использовать JVM 

Это событие всегда отправляется как соответствующая пара с GarbageCollectionFinish (принимающий оба события включаются), и никакие события сборки "мусора" не будут иметь место между ними.

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_GARBAGE_COLLECTION_START81SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_START, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_garbage_collection_events Может генерировать события, когда сборка "мусора" начинается или заканчивается

Параметры
Имя Ввести Описание


Конец Сборки "мусора"

void JNICALL
GarbageCollectionFinish(jvmtiEnv *jvmti_env)
Событие Garbage Collection Finish отправляется, когда пауза сборки "мусора" заканчивается. Это событие отправляется, в то время как VM все еще останавливается, таким образом обработчик событий не должен использовать функции JNI и не должен использовать JVM 

Некоторые агенты, возможно, должны сделать операции сборки "мусора" сообщения, которые требуют использования отвергнутой JVM 

Это событие всегда отправляется как соответствующая пара с GarbageCollectionStart (принимающий оба события включаются).

ФазаТип событияЧислоВключениеС тех пор
отправленный только во время живой фазы JVMTI_EVENT_GARBAGE_COLLECTION_FINISH82SetEventNotificationMode(JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, NULL)1.0

Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Возможность Эффект
can_generate_garbage_collection_events Может генерировать события, когда сборка "мусора" начинается или заканчивается

Параметры
Имя Ввести Описание


Постоянный Индексируют

JVMTI_CLASS_STATUS_ARRAY
JVMTI_CLASS_STATUS_ERROR
JVMTI_CLASS_STATUS_INITIALIZED
JVMTI_CLASS_STATUS_PREPARED
JVMTI_CLASS_STATUS_PRIMITIVE
JVMTI_CLASS_STATUS_VERIFIED
JVMTI_DISABLE
JVMTI_ENABLE
JVMTI_HEAP_FILTER_CLASS_TAGGED
JVMTI_HEAP_FILTER_CLASS_UNTAGGED
JVMTI_HEAP_FILTER_TAGGED
JVMTI_HEAP_FILTER_UNTAGGED
JVMTI_HEAP_OBJECT_EITHER
JVMTI_HEAP_OBJECT_TAGGED
JVMTI_HEAP_OBJECT_UNTAGGED
JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT
JVMTI_HEAP_REFERENCE_CLASS
JVMTI_HEAP_REFERENCE_CLASS_LOADER
JVMTI_HEAP_REFERENCE_CONSTANT_POOL
JVMTI_HEAP_REFERENCE_FIELD
JVMTI_HEAP_REFERENCE_INTERFACE
JVMTI_HEAP_REFERENCE_JNI_GLOBAL
JVMTI_HEAP_REFERENCE_JNI_LOCAL
JVMTI_HEAP_REFERENCE_MONITOR
JVMTI_HEAP_REFERENCE_OTHER
JVMTI_HEAP_REFERENCE_PROTECTION_DOMAIN
JVMTI_HEAP_REFERENCE_SIGNERS
JVMTI_HEAP_REFERENCE_STACK_LOCAL
JVMTI_HEAP_REFERENCE_STATIC_FIELD
JVMTI_HEAP_REFERENCE_SUPERCLASS
JVMTI_HEAP_REFERENCE_SYSTEM_CLASS
JVMTI_HEAP_REFERENCE_THREAD
JVMTI_HEAP_ROOT_JNI_GLOBAL
JVMTI_HEAP_ROOT_JNI_LOCAL
JVMTI_HEAP_ROOT_MONITOR
JVMTI_HEAP_ROOT_OTHER
JVMTI_HEAP_ROOT_STACK_LOCAL
JVMTI_HEAP_ROOT_SYSTEM_CLASS
JVMTI_HEAP_ROOT_THREAD
JVMTI_ITERATION_ABORT
JVMTI_ITERATION_CONTINUE
JVMTI_ITERATION_IGNORE
JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED
JVMTI_JAVA_LANG_THREAD_STATE_MASK
JVMTI_JAVA_LANG_THREAD_STATE_NEW
JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE
JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED
JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING
JVMTI_JAVA_LANG_THREAD_STATE_WAITING
JVMTI_JLOCATION_JVMBCI
JVMTI_JLOCATION_MACHINEPC
JVMTI_JLOCATION_OTHER
JVMTI_KIND_ALLOC_ALLOC_BUF
JVMTI_KIND_ALLOC_BUF
JVMTI_KIND_IN
JVMTI_KIND_IN_BUF
JVMTI_KIND_IN_PTR
JVMTI_KIND_OUT
JVMTI_KIND_OUT_BUF
JVMTI_PHASE_DEAD
JVMTI_PHASE_LIVE
JVMTI_PHASE_ONLOAD
JVMTI_PHASE_PRIMORDIAL
JVMTI_PHASE_START
JVMTI_PRIMITIVE_TYPE_BOOLEAN
JVMTI_PRIMITIVE_TYPE_BYTE
JVMTI_PRIMITIVE_TYPE_CHAR
JVMTI_PRIMITIVE_TYPE_DOUBLE
JVMTI_PRIMITIVE_TYPE_FLOAT
JVMTI_PRIMITIVE_TYPE_INT
JVMTI_PRIMITIVE_TYPE_LONG
JVMTI_PRIMITIVE_TYPE_SHORT
JVMTI_REFERENCE_ARRAY_ELEMENT
JVMTI_REFERENCE_CLASS
JVMTI_REFERENCE_CLASS_LOADER
JVMTI_REFERENCE_CONSTANT_POOL
JVMTI_REFERENCE_FIELD
JVMTI_REFERENCE_INTERFACE
JVMTI_REFERENCE_PROTECTION_DOMAIN
JVMTI_REFERENCE_SIGNERS
JVMTI_REFERENCE_STATIC_FIELD
JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP
JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR
JVMTI_RESOURCE_EXHAUSTED_THREADS
JVMTI_THREAD_MAX_PRIORITY
JVMTI_THREAD_MIN_PRIORITY
JVMTI_THREAD_NORM_PRIORITY
JVMTI_THREAD_STATE_ALIVE
JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER
JVMTI_THREAD_STATE_IN_NATIVE
JVMTI_THREAD_STATE_IN_OBJECT_WAIT
JVMTI_THREAD_STATE_INTERRUPTED
JVMTI_THREAD_STATE_PARKED
JVMTI_THREAD_STATE_RUNNABLE
JVMTI_THREAD_STATE_SLEEPING
JVMTI_THREAD_STATE_SUSPENDED
JVMTI_THREAD_STATE_TERMINATED
JVMTI_THREAD_STATE_VENDOR_1
JVMTI_THREAD_STATE_VENDOR_2
JVMTI_THREAD_STATE_VENDOR_3
JVMTI_THREAD_STATE_WAITING
JVMTI_THREAD_STATE_WAITING_INDEFINITELY
JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT
JVMTI_TIMER_ELAPSED
JVMTI_TIMER_TOTAL_CPU
JVMTI_TIMER_USER_CPU
JVMTI_TYPE_CCHAR
JVMTI_TYPE_CVOID
JVMTI_TYPE_JBOOLEAN
JVMTI_TYPE_JBYTE
JVMTI_TYPE_JCHAR
JVMTI_TYPE_JCLASS
JVMTI_TYPE_JDOUBLE
JVMTI_TYPE_JFIELDID
JVMTI_TYPE_JFLOAT
JVMTI_TYPE_JINT
JVMTI_TYPE_JLONG
JVMTI_TYPE_JMETHODID
JVMTI_TYPE_JNIENV
JVMTI_TYPE_JOBJECT
JVMTI_TYPE_JSHORT
JVMTI_TYPE_JTHREAD
JVMTI_TYPE_JVALUE
JVMTI_VERBOSE_CLASS
JVMTI_VERBOSE_GC
JVMTI_VERBOSE_JNI
JVMTI_VERBOSE_OTHER
JVMTI_VERSION_INTERFACE_JNI
JVMTI_VERSION_INTERFACE_JVMTI
JVMTI_VERSION_MASK_INTERFACE_TYPE
JVMTI_VERSION_MASK_MAJOR
JVMTI_VERSION_MASK_MICRO
JVMTI_VERSION_MASK_MINOR
JVMTI_VERSION_SHIFT_MAJOR
JVMTI_VERSION_SHIFT_MICRO
JVMTI_VERSION_SHIFT_MINOR
JVMTI_VISIT_ABORT
JVMTI_VISIT_OBJECTS


История изменений

Последнее обновление: 05.09.07
Версия: 1.2.2

JVM GetVersionNumber функция.

Версия
Дата
Изменения
14 ноября 2002 Преобразованный в XML-документ.
14 ноября 2002 Игнорируемые функции дампа "кучи" (пока) начиная с того, что было, были несправедливостью.
18 ноября 2002 Добавленная деталь повсюду.
18 ноября 2002 Измененный JVMTI_THREAD_STATUS_RUNNING к JVMTI_THREAD_STATUS_RUNNABLE.
19 ноября 2002 Добавленный AsyncGetStackTrace.
19 ноября 2002 Добавленные jframeID возвращаются в GetStackTrace.
19 ноября 2002 Игнорируемые функции GetCurrentFrame и GetCallingFrame (пока) начиная с того, что было там, так как они избыточны с GetStackTrace.
19 ноября 2002 Игнорируемый ClearAllBreakpoints, так как это всегда было избыточно.
19 ноября 2002 Добавленный GetSystemProperties.
19 ноября 2002 Измененный локальная память потока функционирует, чтобы использовать jthread.
20 ноября 2002 Добавленный GetJLocationFormat.
22 ноября 2002 Добавленные события и вводный текст.
22 ноября 2002 Тип перекрестной ссылки и постоянные определения.
24 ноября 2002 Добавленный DTD.
24 ноября 2002 Добавленные возможности функционируют раздел.
29 ноября 2002 Присвойте возможности каждой функции и событию.
29 ноября 2002 Добавьте функции перехвата JNI.
30 ноября 2002 Автоматический генерируют возможности SetEventNotificationMode.
30 ноября 2002 Добавить VMObjectAlloc событие.
30 ноября 2002 Добавить DynamicCodeGenerated событие.
30 ноября 2002 Добавьте константу к объявлениям.
30 ноября 2002 Выход метода изменения и фрейм появляются, чтобы передаться на исключении.
1 декабря 2002 Добавьте ForceGarbageCollection.
2 декабря 2002 Восстановите раздел Xrun; разъясните GetStackTrace и добавьте пример; Решите проблемы width; используйте "агент" последовательно.
8 декабря 2002 Удалите предыдущее введение запуска. Добавьте  раздел JVM.
8 декабря 2002 Добавить DisposeEnvironment.
9 декабря 2002 Многочисленные незначительные обновления.
15 декабря 2002 Добавьте добавленные функции профилирования "кучи": получите/установите аннотацию, выполните итерации живых объектов/"кучи". Добавьте "кучу", профилирующую добавленного заполнителя функций: корни "кучи". Событие профилирования "кучи" добавило: свободный объект. Событие профилирования "кучи" перепроектировало: vm возражают выделению. Заполнители события профилирования "кучи" добавили: сборка "мусора" запускает/заканчивается. Собственный метод связывает добавленное событие.
19 декабря 2002 Обновите приостанавливают/возобновляются функции. Добавьте информацию об источнике с тегом jvmdi. Исправления Misc.
24 декабря 2002 Добавьте семантику к типам.
27 декабря 2002 Добавьте локальный ссылочный раздел. Автоматически сгенерируйте описания параметра от типов.
28 декабря 2002 Документ, что RunAgentThread отправляет threadStart.
29 декабря 2002 Удалите избыточную локальную переменную касательно и предупреждение dealloc. Преобразуйте GetRawMonitorName в выделенный буфер. Добавьте GenerateEvents.
30 декабря 2002 Сделайте мониторы сырых данных типом и переименуйте к "jrawMonitorID".
1 Ян 2003 Включайте информацию об источнике. Уборка JVMDI выпускает ссылки. Удалите Освобождают предупреждения, которые теперь автоматически сгенерированы.
2 Яна 2003 Устраните проблемы представления для jthread.
3 Яна 2003 Сделайте возможности буферизованными к 64 битам - и сделайте это автоматически.
4 Яна 2003 Сделайте константы, которые являются перечислением в перечислимые типы. Параметры теперь перечислимого типа. Уборка и индексирует раздел типа. Замена, остающаяся datadef объекты с обратным вызовом.
7 Янов 2003 Исправьте описание GenerateEvents. Больше внутренней работы семантики.
9 Янов 2003 Замените предыдущий GetSystemProperties двумя функциями, которые используют выделенную информацию, вместо этого фиксированную. Добавьте SetSystemProperty. Больше внутренней работы семантики.
12 Янов 2003 Добавьте varargs к концу SetEventNotificationMode.
20 Янов 2003 Закончите фиксировать спецификацию, чтобы отразить, что размеры выделения являются jlong.
22 Яна 2003 Позвольте НУЛЬ как аргумент RunAgentThread.
22 Яна 2003 Фиксированные имена к стандартизированному соглашению о присвоении имен Удаленный AsyncGetStackTrace.
29 Янов 2003 Так как мы используем jthread, удалил GetThread.
31 Ян 2003 Изменитесь GetFieldName, чтобы позволить ОБНУЛЯЕТ как GetMethodName.
v40
29 февраля 2003
Перепишите вводный текст, добавляя разделы по запуску, средам и инструментарию байт-кода. Измените параметры командной строки на обсуждения EG. Добавьте введение в раздел возможностей. Добавьте категорию механизма расширения и функции. Марк для удаления, но разъясненный во всяком случае, SuspendAllThreads. Переименуйте IterateOverLiveObjects к IterateOverReachableObjects и измените текст соответственно. Разъясните IterateOverHeap. Разъясните CompiledMethodLoad. Обсудите необходимое как условие состояние для Вызывания Функций. Разъясните SetAllocationHooks. Добавленные проблемы ("Чтобы быть разрешенным:") повсюду. И так далее...
v41
6 марта 2003
Удалите struct из звонка в GetOwnedMonitorInfo. Автоматически генерируйте большинство ошибочной документации, удалите (скорее поврежденный) рукописный ошибочный документ. Лучше опишите использование возможности (пустой начальный набор). Добавьте, что минуты оценивают jint params. Удалите возможность can_access_thread_local_storage. Переименуйте ошибку JVMTI_ERROR_NOT_IMPLEMENTED к JVMTI_ERROR_MUST_POSSESS_CAPABILITY; то же самое для *NOT_IMPLEMENTED. Исправления описания.
v42
8 марта 2003
Переименуйте GetClassSignature к GetClassName. Переименуйте IterateOverClassObjects к IterateOverInstancesOfClass. Удалите GetMaxStack (стек операнда не используется в JVM 
v43
8 марта 2003
Решите незначительную проблему редактирования.
v44
10 марта 2003
Добавьте фазовую информацию. Повторно отобразите (компактные) числа события.
v45
11 марта 2003
Более фазовая информация - позволяет "любому". Игнорируйте необработанные запросы монитора и события. Незначительные исправления описания.
v46
12 марта 2003
Добавьте GetPhase. Используйте "фазу" через документ. Игнорируйте GetRawMonitorName. Игнорируйте GetObjectMonitors.
v47
12 марта 2003
Исправления от ссылки, XML, и проверки правописания. Автоматически сгенерируйте структуру обратного вызова.
v48
13 марта 2003
Один символьный XML фиксирует.
v49
13 марта 2003
Изменитесь имена параметров функции, чтобы быть непротиворечивым с параметрами события (fooBarBaz становится foo_bar_baz).
v50
14 марта 2003
Фиксируйте неработающую ссылку. Фиксируйте маркеры потока.
v51
14 марта 2003
Константы изменения, таким образом, они находятся под 128 к проблемам компилятора обходного решения.
v52
23 марта 2003
Возможности перестройки. Разделите GetStackTrace на GetStackTrace и GetStackFrames.
v54
8 апреля 2003
Используйте глубину вместо jframeID, чтобы сослаться на фреймы. Удалите теперь несоответствующий GetCurrentFrame, GetCallerFrame и GetStackFrames. Удалите аргумент фрейма из событий.
v55
9 апреля 2003
Удалите GetObjectWithAnnotation, так как тесты показывают более эффективный подход bufferred. Добавьте без вести пропавших annotation_count к GetObjectsWithAnnotations
v56
10 апреля 2003
Удалите запутывающий вводный оператор в GetObjectsWithAnnotations
v58
13 апреля 2003
Замените jclass/jmethodID представление метода с просто jmethodID; Передайте JvmtiEnv* как первый аргумент каждого события; удалите JNIEnv* где несоответствующий. Замените can_access_frames can_access_local_variables; удалите из просто доступа стека. Используйте can_get_synthetic_attribute; фиксируйте описание. Разъясните, что должны быть освобождены нулевые массивы длины. Разъясните RelinquishCapabilities. Обобщите JVMTI_ERROR_VM_DEAD к JVMTI_ERROR_WRONG_PHASE.
v59
27 апреля 2003
Удалите вялые косвенные ссылки на OBSOLETE_METHOD_ID.
v60
4 мая 2003
Разрешите DestroyRawMonitor во время OnLoad.
v61
7 мая 2003
Добавленный не контролируют ошибочный возврат владельца к DestroyRawMonitor.
v62
13 мая 2003
Разъясните семантику необработанных мониторов. Изменение отмечает на GetThreadStatus. GetClassLoader возвратите НУЛЬ для начальной загрузки загрузчик class. Добавить GetClassName проблема. Определите подпись локальной переменной. Отвергните нуль в массиве аннотаций GetObjectsWithAnnotations. Удалите по спецификации в GetObjectsWithAnnotations. Игнорировать SetAllocationHooks. Игнорировать SuspendAllThreads.
v63
14 мая 2003
Определите тип данных jvmtiEventCallbacks. Нулевые выделения длины возвращают НУЛЬ. Сохраните SetAllocationHooks в JVMDI, но удалите из JVM 
v64
15 мая 2003
Лучше формулируя, на анализ.
v65
15 мая 2003
Первая Альфа. Сделайте jmethodID и jfieldID уникальным, jclass не используемый.
v66
27 мая 2003
Фиксируйте незначительные ошибки XSLT.
v67
13 июня 2003
Отмена, делающая jfieldID уникальный (jmethodID все еще).
v68
17 июня 2003
Изменения в 11-ое июня встреча Экспертной группы - функциональность "Кучи" Перестройки: единственный обратный вызов, удалите GetHeapRoots, добавьте достижимый iterators, и переименуйте "аннотацию", чтобы "тегировать". НУЛЕВОЙ параметр потока на большинстве функций является текущим потоком. Добавьте таймеры. Удалите ForceExit. Добавьте GetEnvironmentLocalStorage. Добавьте многословный флаг и событие. Добавьте AddToBootstrapClassLoaderSearch. Обновление ClassFileLoadHook.
v69
18 июня 2003
Очистите разделы проблем. Переименуйте GetClassName назад к GetClassSignature и фиксируйте описание. Добавьте универсальную подпись к GetClassSignature, GetFieldSignature, GetMethodSignature, и GetLocalVariableTable. Игнорируйте EstimateCostOfCapabilities. Разъясните, что системные функции свойства работают на представлении VM системных свойств. Разъясните Agent_OnLoad. Удалите "константу" из JNIEnv* в событиях. Добавьте средства доступа метаданных.
v70
18 июня 2003
Добавьте start_depth к GetStackTrace. Переместите системные свойства в новую категорию. Добавьте GetObjectSize. Удалите "X" из флагов командной строки. XML, HTML, и проверяют орфографию исправлений.
v71
19 июня 2003
Фиксируйте JVMTI_HEAP_ROOT_THREAD, чтобы быть 6. Заставьте каждое резюме соответствовать имя функции. Фиксируйте неясную формулировку.
v72
26 июня 2003
SetThreadLocalStorage и SetEnvironmentLocalStorage должны позволить значению быть, устанавливают в NULL. У NotifyFramePop, GetFrameLocationm и всех операций локальной переменной должна была быть их формулировка о фиксированных фреймах. Грамматика и ясность должны быть фиксированы повсюду. Написание прописными буквами и puntuation должны быть непротиворечивыми. Нуждаюсь в микро номере версии и масках для того, чтобы получить доступ главный, незначительный, и микро. Списки кода ошибки должны указать, который должен быть возвращен реализацией. Свойства командной строки должны быть видимыми в функциях свойств. Отвергните появление от текущего потока. Позвольте реализациям возвращать непрозрачную ошибку фрейма, когда они не могут население, событие NativeMethodBind должно быть отправлено во время любой фазы. Событие DynamicCodeGenerated должно быть отправлено во время любой фазы. Следующим функциям нужно позволить работать перед VMInit: Set/GetEnvironmentLocalStorage GetMethodDeclaringClass GetClassSignature GetClassModifiers IsInterface IsArrayClass GetMethodName GetMethodModifiers GetMaxLocals GetArgumentsSize GetLineNumberTable GetMethodLocation IsMethodNative IsMethodSynthetic. Другие изменения (к XSL): описание Параметра должно показать звездочку после не перед указателями. NotifyFramePop, GetFrameLocationm и все операции локальной переменной должны hsve добавленная ошибка NO_MORE_FRAMES. Не у живых потоков должен быть различный ошибочный возврат чем недопустимый поток.
v73
7 июля 2003
Событие VerboseOutput пропускало параметр сообщения. Незначительная фиксация-ups.
v74
14 июля 2003
Технические исправления Отдела Публикаций. Позвольте поток и среду, которую устанавливает в NULL локальное хранение, чтобы быть.
v75
23 июля 2003
Используйте новый Agent_OnLoad, а не перегруженный JVM_OnLoad. Добавьте JNICALL к обратным вызовам (XSL). Документ требование JNICALL и для событий и для обратных вызовов (XSL). Ограничьте RedefineClasses методами и атрибутами. Игнорируйте событие VerboseOutput. VMObjectAlloc: ограничьте, когда событие отправляется, и удалите параметр метода. Конец свободные концы от Технического редактирования Пабов.
v76
24 июля 2003
Событие ClassFileLoadHook изменения, чтобы отправить class вместо булева из пересматривает.
v77
24 июля 2003
Исправления XML. Незначительные текстовые разъяснения и исправления.
v78
24 июля 2003
Удалите GetExceptionHandlerTable и GetThrownExceptions от JVM Спецификация Виртуальной машины Java™, Глава 4.4).
v79
24 июля 2003
XML и текстовые исправления. Переместите описание стекового фрейма в категорию Стекового фрейма.
v80
26 июля 2003
Позвольте НУЛЬ (означает программу начальной загрузки) для GetClassloaderClasses. Добавьте новые ссылочные виды "кучи" для ссылок от классов. Добавьте информацию о таймере struct и запросите функции. Добавьте AvailableProcessors. Переименуйте GetOtherThreadCpuTime к GetThreadCpuTime. Явно добавьте JVMTI_ERROR_INVALID_THREAD и JVMTI_ERROR_THREAD_NOT_ALIVE к режиму SetEventNotification. Добавьте начальный поток к событию VM_INIT. Удалите предположения платформы из AddToBootstrapClassLoaderSearch.
v81
26 июля 2003
Грамматика и ясность изменяются на анализ.
v82
27 июля 2003
Больше грамматики и ясности изменяются на анализ. Добавьте Agent_OnUnload.
v83
28 июля 2003
Тип возврата изменения Agent_OnUnload, чтобы освободить.
v84
28 июля 2003
Переименуйте JVMTI_REFERENCE_ARRAY к JVMTI_REFERENCE_ARRAY_ELEMENT.
v85
28 июля 2003
Кража java.lang. Runtime.availableProcessors () формулирующий для AvailableProcessors (). Гарантируйте, что нуль никогда не будет ID события. Удалите некоторые проблемы, которые больше не являются проблемами. На анализ переименуйте и более полностью задокументируйте функции информации о таймере.
v86
29 июля 2003
Неспецификация видимое изменение к XML управляемая реализация: SetThreadLocalStorage должен работать в режиме VM.
0.1.87
5 августа 2003
Добавьте GetErrorName. Добавьте varargs предупреждение jvmtiExtensionEvent. Удалите "константу" на jvmtiEnv* jvmtiExtensionEvent. Удалите неиспользованную can_get_exception_info возможность. Передайте jvmtiEnv* и JNIEnv* к jvmtiStartFunction. Фиксируйте jvmtiExtensionFunctionInfo.func, объявленный типом. Функция расширения возвращает код ошибки. Используйте новую нумерацию версии.
0.2.88
5 августа 2003
Удалите событие ClassUnload.
0.2.89
8 августа 2003
Ссылка "кучи" iterator обратные вызовы возвращает перечисление, которое позволяет исходить ссылки на объект, которые будут проигнорированы. Позвольте JNIEnv как тип param к событиям/функциям расширения.
0.2.90
15 августа 2003
Фиксируйте опечатку.
0.2.91
2 сентября 2003
Удалите все функции метаданных: GetClassMetadata, GetFieldMetadata, и GetMethodMetadata.
0.2.92
1 октября 2003
Марк функции Выделяет. Освободите, RawMonitor *, SetEnvironmentLocalStorage, и GetEnvironmentLocalStorage как безопасный для использования в обратных вызовах "кучи" и событиях GC.
0.2.93
24 ноября 2003
Добавьте проходят через непрозрачный пользовательский указатель данных на "кучу", выполняют итерации функций и обратных вызовов. В событии CompiledMethodUnload отправьте адрес кода. Добавьте событие GarbageCollectionOccurred. Добавьте постоянный ссылочный вид пула. Отметьте функции CreateRawMonitor и DestroyRawMonitor как безопасные для использования в обратных вызовах "кучи" и событиях GC. Разъяснитесь: VMDeath, GetCurrentThreadCpuTimerInfo, GetThreadCpuTimerInfo, IterateOverReachableObjects, IterateOverObjectsReachableFromObject, GetTime и JVMTI_ERROR_NULL_POINTER. Добавьте недостающие ошибки к: GenerateEvents и AddToBootstrapClassLoaderSearch. Фиксируйте описание параметра имени ClassFileLoadHook. В обратных вызовах "кучи" и событиях GC/ObjectFree, определите, что только явно позволенные функции могут быть вызваны. Разрешите GetCurrentThreadCpuTimerInfo, GetCurrentThreadCpuTime, GetTimerInfo, и GetTime во время обратного вызова. Позвольте вызывать SetTag/GetTag во время onload фазы. SetEventNotificationMode, добавьте: ошибка предпринятое несоответствующее управление уровнем потока. Удалите jvmtiExceptionHandlerEntry. Закрепите обработку собственных методов на стеке - location_ptr param GetFrameLocation, удалите JVMTI_ERROR_OPAQUE_FRAME из GetFrameLocation, jvmtiFrameInfo.location, и jlocation. Удалите опечатку (из JVMPI) допущение, что событие MonitorWaited отправляется на сне.
0.2.94
25 ноября 2003
Разъяснения и опечатки.
0.2.95
3 декабря 2003
Позвольте НУЛЬ user_data в "куче" iterators.
0.2.97
28 января 2004
Добавьте GetThreadState, осудите GetThreadStatus.
0.2.98
29 января 2004
INVALID_SLOT и ошибки TYPE_MISMATCH должны быть дополнительными.
0.2.102
12 февраля 2004
Удалите MonitorContendedExit. Добавленный параметр JNIEnv к VMObjectAlloc. Разъясненное определение class _tag и referrer_index параметры, чтобы поместить обратные вызовы в "кучу".
0.2.103
16 Febuary 2004
Документ JAVA_TOOL_OPTIONS.
0.2.105
17 Febuary 2004
Разделитесь запускают фазу в исконный и запускаются. Добавьте ассоциации фазы Изменения события VMStart функций и событий.
0.3.6
18 Febuary 2004
Игнорируйте осуждал GetThreadStatus. Ударьте вспомогательную версию, вычтите 100 из микро версии
0.3.7
18 Febuary 2004
Документ, что значения наносекунды таймера без знака. Разъясните текст, имеющий отношение к собственным методам.
0.3.8
19 Febuary 2004
Фиксируйте опечаток. Удалите игнорируемый, осуждал GetThreadStatus.
0.3.9
23 Febuary 2004
Потребуйте, чтобы NotifyFramePop действовал на приостановленные потоки.
0.3.10
24 Febuary 2004
Добавьте возможности (can_redefine_any_class и can_generate_all_class_hook_events) и ошибка (JVMTI_ERROR_UNMODIFIABLE_CLASS) которые позволяют некоторым классам быть неподдающимися изменению.
0.3.11
28 Febuary 2004
Добавьте JVMTI_ERROR_MUST_POSSESS_CAPABILITY к SetEventNotificationMode.
0.3.12
8 марта 2004
Разъясненный CompiledMethodUnload так, чтобы это было четким событие, может быть отправлен после того, как class был разгружен.
0.3.13
5 марта 2004
Измените параметр размера VMObjectAlloc к jlong, чтобы соответствовать GetObjectSize.
0.3.14
13 марта 2004
Добавленная направляющая линия для использования JNI FindClass функционирует в функциях обратного вызова события.
0.3.15
15 марта 2004
Добавьте GetAllStackTraces и GetThreadListStackTraces.
0.3.16
19 марта 2004
События ClassLoad и ClassPrepare могут быть отправлены во время фазы запуска.
0.3.17
25 марта 2004
Добавьте JVMTI_ERROR_NATIVE_METHOD к GetLineNumberTable, GetLocalVariableTable, GetMaxLocals, GetArgumentsSize, GetMethodLocation, GetBytecodes.
0.3.18
29 марта 2004
Возвратите вид таймера в информационной структуре таймера.
0.3.19
31 марта 2004
Разъяснения спецификации: JVMTI_THREAD_STATE_IN_NATIVE не мог бы включать JNI или JVM 
0.3.20
1 апреля 2004
Усовершенствования к вышеупомянутым разъяснениям и Разъясняют, что ошибка, возвращенная Agent_OnLoad, завершает VM.
0.3.21
1 апреля 2004
Создание class массива не генерирует событие загрузки class.
0.3.22
7 апреля 2004
Выровняйте иерархию состояния потока более близко с java.lang. Поток. Государство.
0.3.23
12 апреля 2004
Разъясните документацию состояния потока.
0.3.24
19 апреля 2004
Удалите событие GarbageCollectionOccurred - может быть сделан агентом.
0.3.25
22 апреля 2004
Определите "параметр командной строки".
0.3.26
29 апреля 2004
Опишите намеченное использование инструментария байт-кода. Фиксируйте описание события расширения первый параметр.
0.3.27
30 апреля 2004
Разъяснение и опечатки.
0.3.28
18 мая 2004
Удалите событие DataDumpRequest.
0.3.29
18 мая 2004
Разъясните RawMonitorWait с нулевым тайм-аутом. Разъясните состояние потока после RunAgentThread.
0.3.30
24 мая 2004
Уборка: фиксируйте плохие/старые ссылки и т.д.
0.3.31
30 мая 2004
Разъяснения включая: Все символьные строки изменяются UTF-8. Поток агента visibiity. Значение устаревшей версии метода. Поток, вызывающий обратные вызовы "кучи",
1.0.32
1 июня 2004
Ударьте major.minor номера версий к "1.0".
1.0.33
2 июня 2004
Разъясните взаимодействие между ForceGarbageCollection и ObjectFree.
1.0.34
6 июня 2004
Ограничьте AddToBootstrapClassLoaderSearch и SetSystemProperty к фазе OnLoad только.
1.0.35
11 июня 2004
Фиксируйте опечатку в SetTag.
1.0.36
18 июня 2004
Фиксируйте торговые марки. Добавьте недостающий параметр в примере использование GetThreadState.
1.0.37
4 августа 2004
Обновления авторского права.
1.0.38
5 ноября 2004
Добавьте недостающее функциональное табличное расположение. Добавьте недостающее описание формата функции членства C++ функций. Разъясните, что имя в CFLH может быть НУЛЕМ. Выпущенный как часть J2SETM 5.0.
1.1.47
24 апреля 2005
Ударьте major.minor номера версий к "1.1". Добавьте функции ForceEarlyReturn*. Добавьте функцию GetOwnedMonitorStackDepthInfo. Добавьте функцию GetCurrentThread. Добавьте "начиная с" маркера версии. Добавьте AddToSystemClassLoaderSearch. Позвольте AddToBootstrapClassLoaderSearch использоваться в живой фазе. Фиксируйте исторический мусор в описаниях heap_object_callback параметра функций IterateOverHeap и IterateOverInstancesOfClass; отвергните НУЛЬ для этого параметра. Разъясните, исправьте и сделайте непротиворечивым: формулировка о текущем потоке, непрозрачных фреймах и недостаточном числе фреймов в PopFrame. Последовательно используйте "текущий фрейм", а не "самый верхний". Разъясните ошибки JVMTI_ERROR_TYPE_MISMATCH в GetLocal* и SetLocal*, делая их совместимый с теми в ForceEarlyReturn*. Много других разъяснений и формулирующий чистый ups.
1.1.48
25 апреля 2005
Добавьте GetConstantPool. Ссылки переключателя на первый выпуск Спецификации VM, к выпуску секунд.
1.1.49
26 апреля 2005
Разъясните незначительный порядок / порядок основной версии в GetConstantPool.
1.1.50
26 апреля 2005
Добавьте SetNativeMethodPrefix и SetNativeMethodPrefixes. Повторно присвойте GetOwnedMonitorStackDepthInfo, чтобы расположить 153. Вспыхните Поиск Загрузчика Класса в его собственной категории документации. Соглашение с чрезмерно длинными линиями в источнике XML.
1.1.51
29 апреля 2005
Позвольте агентам быть запущенными в живой фазе. Добавленный абзац о развертывающихся агентах.
1.1.52
30 апреля 2005
Добавьте описание спецификации к SetNativeMethodPrefix (es). Лучше определите условия на GetConstantPool.
1.1.53
30 апреля 2005
Вспыхните функция GetClassVersionNumber от GetConstantPool. Уборка ссылки на Спецификацию VM.
1.1.54
1 мая 2005
Разрешите SetNativeMethodPrefix (es) в любой фазе. Добавьте разъяснения о воздействии переопределения на GetConstantPool.
1.1.56
2 мая 2005
Различные разъяснения к SetNativeMethodPrefix (es).
1.1.57
2 мая 2005
Добавьте недостающее предупреждение производительности событию записи метода.
1.1.58
5 мая 2005
Удалите внутреннюю поддержку JVMDI.
1.1.59
8 мая 2005
Добавить RetransformClasses. Обновите документацию инструментария байт-кода. Изменение IsMethodObsolete больше не потребовать can_redefine_classes возможности.
1.1.63
11 мая 2005
Разъяснения для перепреобразования.
1.1.64
11 мая 2005
Разъяснения для перепреобразования, на анализ. Привяжите "перепреобразование, способное" при загрузке class, включают времени.
1.1.67
4 июня 2005
Добавьте новую "кучу" functionity, который поддерживает сообщающие примитивные значения, позволяет устанавливать тег referrer, и имеет более мощную фильтрацию: FollowReferences, IterateThroughHeap, и их связанные обратные вызовы, structs, перечисления, и константы.
1.1.68
4 июня 2005
Разъяснение.
1.1.69
6 июня 2005
FollowReferences, IterateThroughHeap: обратные вызовы Put в struct; Добавьте недостающие коды ошибки; уменьшите биты во флагах управления посещением.
1.1.70
14 июня 2005
Больше на новой "куче" functionity: уборка спецификации на анализ.
1.1.71
15 июня 2005
Больше на новой "куче" functionity: Переименуйте старый раздел "кучи" к "Куче" (1.0).
1.1.72
21 июня 2005
Фиксируйте опечаток.
1.1.73
27 июня 2005
Заставьте referrer информацию структурировать объединение.
1.1.74
9 сентября 2005
В новых функциях "кучи": Добавьте недостающий ссылочный вид суперкласса. Использование единственная схема вычислительного поля индексирует. Удалите устаревшие ссылки на struct базируемая referrer информация.
1.1.75
12 сентября 2005
Не делайте обратного вызова во время FollowReferences на фривольном java.lang. Объектный суперкласс.
1.1.76
13 сентября 2005
В строке примитивный обратный вызов, длина теперь длина Unicode. В массиве и представляют примитивные обратные вызовы в виде строки, оценивают теперь "константу". Отметьте возможные воздействия компилятора на накрытие на стол функции JNI.
1.1.77
13 сентября 2005
GetClassVersionNumbers () и GetConstantPool () должен возвратить ошибку на массиве или примитивном class.
1.1.78
14 сентября 2005
Исправления грамматики.
1.1.79
26 сентября 2005
Добавьте запрос IsModifiableClass.
1.1.81
9 февраля 2006
Добавьте referrer_class_tag параметр к jvmtiHeapReferenceCallback.
1.1.82
13 февраля 2006
Исправления документа: обновите can_redefine_any_class, чтобы включать, повторно преобразовывают. Разъясните, что события исключения покрывают весь Throwables. В GetStackTrace никакой тест не делается для start_depth, слишком большого, если start_depth является нулем, поля Clarify, о которых сообщают в Примитивном Полевом Обратном вызове - статичный по сравнению с экземпляром. Имена путания восстановления типов "кучи", включая имена обратного вызова. Потребуйте непротиворечивого использования глубины стека перед лицом методов запуска потока. Отметьте несовместимость JVM 
1.1.85
14 февраля 2006
Фиксируйте опечаток, и отсутствие переименовывает.
1.1.86
13 марта 2006
Разъясните, что jmethodIDs и jfieldIDs могут быть сохранены. Разъясните, что Выполняют итерации По Экземплярам Класса, включает подклассы.
1.1.87
14 марта 2006
Лучше формулировка.
1.1.88
16 марта 2006
Соответствуйте referrer_index для статических полей в Обратном вызове Ссылки на объект со Ссылочной Реализацией (и всеми другими известными реализациями); то есть, заставьте это соответствовать определению например поля. В GetThreadListStackTraces добавьте JVMTI_ERROR_INVALID_THREAD, чтобы покрыть недопустимый поток в списке; и определите, что не запускался, потоки возвращают пустые стеки.
1.1.89
17 марта 2006
Опечатка.
1.1.90
25 марта 2006
Опечатка.
1.1.91
6 апреля 2006
Удалите ограничения на AddToBootstrapClassLoaderSearch и AddToSystemClassLoaderSearch.
1.1.93
1 мая 2006
Измененная спецификация, чтобы возвратиться-1 для монитора складывает глубину для реализации, которая не может определить глубину стека.
1.1.94
3 мая 2006
Исправления для любезности удобочитаемости и точности Алана Пратта IBM. Перечислите объектные отношения, о которых сообщают в FollowReferences.
1.1.95
5 мая 2006
Разъясните объектные отношения, о которых сообщают в FollowReferences.
1.1.98
28 июня 2006
Разъясните DisposeEnvironment; добавьте предупреждение. Фиксируйте опечаток в SetLocalXXX, "получают" => "набор". Разъясните, что собственные префиксы метода должны остаться установленными в то время как использующийся. Разъясните, что точно один Agent_OnXXX вызывают на агент. Разъясните, что загрузка библиотеки независима от запуска. Удалите неоднозначную ссылку на Agent_OnLoad в спецификации Agent_OnUnload.
1.1.99
31 июля 2006
Разъясните взаимодействие между функциями и исключениями. Разъясните и дайте примеры полевых индексов. Удалите запутывающий, "Который является" предложением от событий MonitorWait и MonitorWaited. Обновление соединяется, чтобы указать на Java 6.
1.1.102
6 августа 2006
Добавьте ResourceExhaustedEvent.
1.2.2
11 октября 2012
Фиксированный "HTTP" и "Недостающая Привязка" ошибки сообщили инструментом LinkCheck.