Интерфейс Инструмента JVMTM ( виртуальная машина ТМ JVM (VM). JVM Виртуальная машина ТМ JVM. Агент JVM, может быть уведомлен относительно интересных возникновений через события. Функции JVM, или в ответ на события или независимый от них. Агенты, выполненные в том же самом процессе с и, связываются непосредственно с виртуальной машиной, выполняющей исследуемое приложение. Эта передача через собственный интерфейс (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 фаза тогда ее библиотека агента должна экспортировать функцию запуска со следующим прототипом:
VM запустит агент, вызывая эту функцию. Это вызовут достаточно рано в инициализации VM что:
системные свойства могут быть установлены прежде, чем они использовались в запуске 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, и запросить, чтобы это запустило данный агент. Если агент запускается во время живой фазы тогда, ее библиотека агента должна экспортировать функцию запуска со следующим прототипом:
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 GetEnv. См. JVM Доступа для большего количества деталей о создании и использовании JVM GetEnv от Agent_OnLoad.
Инструментарий байт-кода
Этот интерфейс не включает некоторые события, которые можно было бы ожидать в интерфейсе с профилированием поддержки. Некоторые примеры включают объектные события выделения, и метод максимальной скорости вводят и выходят из событий. Интерфейс вместо этого оказывает поддержку для инструментария байт-кода, возможность изменить инструкции байт-кода виртуальной машины Java, которые включают целевую программу. Как правило, эти изменения должны добавить "события" к коду метода - например, чтобы добавить, в начале метода, звонка MyProfiler.methodEntered(). Так как изменения являются просто дополнением, они не изменяют состояние приложения или поведение. Поскольку вставленный код агента является стандартными байт-кодами, VM может работать на максимальной скорости, оптимизируя не только целевая программа, но также и инструментарий. Если инструментарий не включает переключение с выполнения байт-кода, никакие дорогие изменения состояния не необходимы. Результатом являются высокопроизводительные события. Этот подход также обеспечивает полный контроль для агента: инструментарий может быть ограничен "интересным" частям кода (например, кода конечного пользователя) и может быть условным выражением. Инструментарий может работать полностью в коде языка программирования Java или может вызвать в собственный агент. Инструментарий может просто поддержать счетчики или может статистически выбрать события. Инструментарий может быть вставлен одним из трех способов:
Статический Инструментарий: файл класса инструментуется прежде, чем он будет загружен в VM - например, создавая двойной каталог *.class файлы, которые были изменены, чтобы добавить инструментарий. Этот метод является чрезвычайно неуклюжим и, вообще, агент не может знать источник файлов класса, которые будут загружены.
Инструментарий времени загрузки: Когда файл класса загружается VM, необработанные байты файла класса отправляются за инструментарием к агенту. ClassFileLoadHook событие, инициированное загрузкой класса, обеспечивает эту функциональность. Этот механизм обеспечивает эффективный и полный доступ к одноразовому инструментарию.
Динамический Инструментарий: Изменяется класс, который уже загружается (и возможно даже работающий). Эта дополнительная функция обеспечивается ClassFileLoadHook событие, инициированное, вызывая RetransformClasses функция. Классы могут быть изменены многократно и могут быть возвращены к их исходному состоянию. Механизм позволяет инструментарий, который изменяется в течение выполнения.
Функциональность модификации класса, обеспеченная в этом интерфейсе, предназначается, чтобы обеспечить механизм для инструментария ( ClassFileLoadHook событие и RetransformClasses функция) и, во время разработки, для отладки фиксировать-и-продолжать ( RedefineClasses функция). Забота должна быть проявлена, чтобы избежать тревожить зависимости, особенно инструментуя базовые классы. Например, подход к получению уведомления о каждом объектном выделении должен инструментовать конструктора на Object. Предполагая, что конструктор первоначально пуст, конструктор мог быть изменен на:
public Object() {
MyProfiler.allocationTracker(this);
}
Однако, если это изменение было произведено, используя ClassFileLoadHook событие тогда это могло бы воздействовать на типичный VM следующим образом: первый создаваемый объект вызовет конструктора, вызывающего загрузку класса MyProfiler; который тогда вызовет объектное создание, и с тех пор MyProfiler еще не загружается, бесконечная рекурсия; приведение к переполнению стека. Усовершенствование этого должно было бы задержать вызов метода отслеживания до безопасного времени. Например, trackAllocations мог быть установлен в обработчике для VMInit событие.
static boolean trackAllocations = false;
public Object() {
if (trackAllocations) {
MyProfiler.allocationTracker(this);
}
}
SetNativeMethodPrefix позволяет собственным методам быть инструментованными при помощи методов обертки.
Так как этот интерфейс обеспечивает доступ к состоянию приложений, работающих в виртуальной машине Java; терминология обращается к платформе Java а не собственной платформе (если не утверждено иначе). Например:
"поток" означает поток языка программирования Java.
"стековый фрейм" означает стековый фрейм виртуальной машины Java.
"класс" означает класс языка программирования Java.
"куча" означает "кучу" виртуальной машины Java.
"монитор" означает монитор объекта языка программирования Java.
Sun, Sun Microsystems, логотип Sun, Java, и JVM являются торговыми марками или зарегистрированными торговыми марками Oracle и/или его филиалов в США и других странах.
Функции
Доступ к Функциям
К собственному Java JVM доступов кода Собственный Интерфейс (JNI) функции получают доступ. Указатель среды JVM. Указатель среды является указателем на среду и имеет тип jvmtiEnv*. У среды есть информация о ее JVM Когда использующийся с языка C: двойная косвенность используется, чтобы получить доступ к функциям; указатель среды обеспечивает контекст и является первым параметром каждого вызова функции; например:
Каждый звонок 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 для информации об обработке исключений.
Объяснение: jlong используется для совместимости с JVMDI.
mem_ptr
unsigned char**
По возврату, указателю на начало выделенной памяти. Если size нуль, NULL возвращается. Агент передает указатель на a unsigned char*. По возврату, unsigned char* точки недавно выделенному массиву размера size. Массив должен быть освобожден с Deallocate.
Указатель на начало выделенной памяти. Пожалуйста, проигнорируйте "По возврату, элементы устанавливаются." Агент передает массив unsigned char. Входящие значения элементов массива игнорируются. По возврату устанавливаются элементы. Если memNULL, вызов игнорируется.
Поток жив. Нуль, если поток нов (не запускался) или завершался.
JVMTI_THREAD_STATE_TERMINATED
0x0002
Поток завершил выполнение.
JVMTI_THREAD_STATE_RUNNABLE
0x0004
Поток выполним.
JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER
0x0400
Поток ожидает, чтобы ввести блок/метод синхронизации или, после Object.wait(), ожидание, чтобы повторно войти в блок/метод синхронизации.
JVMTI_THREAD_STATE_WAITING
0x0080
Поток ожидает.
JVMTI_THREAD_STATE_WAITING_INDEFINITELY
0x0010
Поток ожидает без тайм-аута. Например, Object.wait().
JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT
0x0020
Поток ожидает с максимальным временем, чтобы ожидать определенный. Например, Object.wait(long).
JVMTI_THREAD_STATE_SLEEPING
0x0040
Поток спит- Thread.sleep(long).
JVMTI_THREAD_STATE_IN_OBJECT_WAIT
0x0100
Поток ожидает на объектном мониторе- Object.wait.
JVMTI_THREAD_STATE_PARKED
0x0200
Поток паркуется, например: LockSupport.park, LockSupport.parkUtil и LockSupport.parkNanos.
JVMTI_THREAD_STATE_SUSPENDED
0x100000
Поток приостанавливается. java.lang.Thread.suspend() или JVM SuspendThread) был вызван на потоке. Если этот бит устанавливается, другие биты обращаются к состоянию потока перед приостановкой.
JVMTI_THREAD_STATE_INTERRUPTED
0x200000
Поток был прерван.
JVMTI_THREAD_STATE_IN_NATIVE
0x400000
Поток находится в собственном коде - то есть, собственный метод работает, который не перезвонил в VM или код языка программирования Java. Этот флаг не устанавливается, выполняя VM скомпилированный код языка программирования Java, и при этом это не устанавливается, выполняя код VM или код поддержки VM. Собственные функции интерфейса VM, такие как JNI и JVM
JVMTI_THREAD_STATE_VENDOR_1
0x10000000
Определенный поставщиком VM.
JVMTI_THREAD_STATE_VENDOR_2
0x20000000
Определенный поставщиком VM.
JVMTI_THREAD_STATE_VENDOR_3
0x40000000
Определенный поставщиком VM.
Следующие определения используются, чтобы преобразовать JVM java.lang.Thread.State состояния стиля.
java.lang. Поток. Государственные Маски Преобразования
Правила
Может быть не больше, чем один ответ на вопрос, хотя не может быть никакого ответа (потому что ответ неизвестен, не применяется, или ни один из ответов не корректен). Ответ устанавливается только, когда включение отвечает на соответствие. Таким образом, не больше, чем один из
JVMTI_THREAD_STATE_RUNNABLE
JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER
JVMTI_THREAD_STATE_WAITING
может быть установлен (совместимая реализация J2SETM будет всегда устанавливать один из них если JVMTI_THREAD_STATE_ALIVE устанавливается). И если какой-либо из них устанавливается, ответ включения JVMTI_THREAD_STATE_ALIVE устанавливается. Не больше, чем один из
JVMTI_THREAD_STATE_WAITING_INDEFINITELY
JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT
может быть установлен (совместимая реализация J2SETM будет всегда устанавливать один из них если JVMTI_THREAD_STATE_WAITING устанавливается). И если любой устанавливается, ответы включения JVMTI_THREAD_STATE_ALIVE и JVMTI_THREAD_STATE_WAITING устанавливаются. Не больше, чем один из
JVMTI_THREAD_STATE_IN_OBJECT_WAIT
JVMTI_THREAD_STATE_PARKED
JVMTI_THREAD_STATE_SLEEPING
может быть установлен. И если какой-либо из них устанавливается, ответы включения 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_SUSPENDED
JVMTI_THREAD_STATE_INTERRUPTED
JVMTI_THREAD_STATE_IN_NATIVE
может быть установлен, но если кто-либо устанавливается, JVMTI_THREAD_STATE_ALIVE устанавливается. И наконец, JVMTI_THREAD_STATE_TERMINATED не может быть установлен если JVMTI_THREAD_STATE_ALIVE не устанавливается. Представление состояния потока разрабатывается для расширения в будущих версиях спецификации; значения состояния потока должны использоваться соответственно, который является, они не должны использоваться в качестве ординалов. Большинство запросов может быть сделано, тестируя единственный бит, если использование в операторе переключения требуется, биты состояния должны быть замаскированы с интересными битами. Все биты, не определенные выше, резервируются для будущего использования. VM, совместимый к текущей спецификации, должен обнулить зарезервированные биты. Агент должен проигнорировать зарезервированные биты - они, как должно предполагаться, не являются нулем и таким образом не должны быть включены в сравнения.
Примеры
Отметьте, что значения ниже исключают зарезервированный и биты поставщика. Состояние потока блокируется в a synchronized- оператор был бы:
Тестирование государства
В большинстве случаев состояние потока может быть определено, тестируя один бит, соответствующий тому вопросу. Например, код, чтобы протестировать, если поток спит:
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";
}
По возврату, точки, чтобы утвердить флаги, как определено Флагами Состояния потока. Агент передает указатель на a jint. По возврату, jint был установлен.
Получите текущий поток. Текущий поток является потоком языка программирования Java, который вызвал функцию. Отметьте что большинство JVM NULL означать текущий поток.
По возврату, точкам к текущему потоку. Агент передает указатель на a jthread. По возврату, jthread был установлен. Объект, возвращенный thread_ptr JNI локальная ссылка и должен управляться.
Получите все живые потоки. Потоки являются потоками языка программирования Java; то есть, потоки, которые присоединены к VM. Поток жив если java.lang.Thread.isAlive() возвратился бы true, то есть, поток был запущен и еще не умер. Вселенная потоков определяется контекстом JVM RunAgentThread).
По возврату, точкам массиву ссылок, один для каждого рабочего потока. Агент передает указатель на a jthread*. По возврату, jthread* точки недавно выделенному массиву размера *threads_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные threads_ptr JNI локальные ссылки и должен управляться.
Приостановите указанный поток. Если вызывающий поток будет определен, то эта функция не будет возвращаться до некоторых других вызовов потока ResumeThread. Если поток в настоящий момент приостанавливается, эта функция ничего не делает и возвращает ошибку.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Приостановите request_count потоки, определенные в request_list массив. Потоки могут быть возобновлены с ResumeThreadList или ResumeThread. Если вызывающий поток определяется в request_list массив, эта функция не будет возвращаться, пока некоторый другой поток не возобновляет это. Ошибки, с которыми встречаются в приостановке потока, возвращаются в results массив, не в возвращаемом значении этой функции. Потоки, которые в настоящий момент приостанавливаются, не изменяют состояние.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Агент предоставленный массив request_count элементы. По возврату, заполненному кодом ошибки для приостанавливания соответствующего потока. Код ошибки будет JVMTI_ERROR_NONE если поток был приостановлен этим вызовом. Возможные коды ошибки - определенные для SuspendThread. Агент передает массив, достаточно многочисленный, чтобы содержать request_count элементы jvmtiError. Входящие значения элементов массива игнорируются. По возврату устанавливаются элементы.
Возобновите приостановленный поток. Любые потоки в настоящий момент приостанавливаются через JVM SuspendThread) или java.lang.Thread.suspend() возобновит выполнение; все другие потоки незатронуты.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возобновитесь request_count потоки, определенные в request_list массив. Любой поток приостанавливается через JVM SuspendThreadList) или java.lang.Thread.suspend() возобновит выполнение.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Агент предоставленный массив request_count элементы. По возврату, заполненному кодом ошибки для резюме о соответствующем потоке. Код ошибки будет JVMTI_ERROR_NONE если поток был приостановлен этим вызовом. Возможные коды ошибки - определенные для ResumeThread. Агент передает массив, достаточно многочисленный, чтобы содержать request_count элементы jvmtiError. Входящие значения элементов массива игнорируются. По возврату устанавливаются элементы.
Отправьте указанное асинхронное исключение указанному потоку (подобный java.lang.Thread.stop). Обычно, эта функция используется, чтобы уничтожить указанный поток с экземпляром исключения ThreadDeath.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
По возврату, заполненному информацией, описывающей указанный поток. Для JDK 1.1 реализации, которые не распознают загрузчики класса контекста, context_class_loader поле будет НУЛЕМ. Агент передает указатель на a jvmtiThreadInfo. По возврату, jvmtiThreadInfo был установлен. Указатель возвратился в поле name из jvmtiThreadInfo недавно выделенный массив. Массив должен быть освобожден с Deallocate. Объект возвратился в поле thread_group из jvmtiThreadInfo JNI локальная ссылка и должен управляться. Объект возвратился в поле context_class_loader из jvmtiThreadInfo JNI локальная ссылка и должен управляться.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Массив находящихся в собственности мониторов. Агент передает указатель на a jobject*. По возврату, jobject* точки недавно выделенному массиву размера *owned_monitor_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные owned_monitors_ptr JNI локальные ссылки и должен управляться.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Глубина стека. Соответствует глубине стека, используемой в функциях Стекового фрейма. Таким образом, нуль является текущим фреймом, каждый - фрейм который названный текущим фреймом. И это - отрицательный, если реализация не может определить глубину стека (например, для мониторов, полученных JNI MonitorEnter).
Массив находящейся в собственности информации о глубине монитора. Агент передает указатель на a jvmtiMonitorStackDepthInfo*. По возврату, jvmtiMonitorStackDepthInfo* точки недавно выделенному массиву размера *owned_monitor_depth_count_ptr. Массив должен быть освобожден с Deallocate. Объекты возвратились в поле monitor из jvmtiMonitorStackDepthInfo JNI локальные ссылки и должен управляться.
Получите объект, если таковые вообще имеются, чей монитор указанный поток ожидает, чтобы ввести или ожидает, чтобы возвратить через java.lang.Object.wait.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
По возврату, заполненному током, спорил монитор, или НУЛЬ, если нет ни одного. Агент передает указатель на a jobject. По возврату, jobject был установлен. Объект, возвращенный monitor_ptr JNI локальная ссылка и должен управляться.
Запускает выполнение потока агента. с указанной собственной функцией. Параметр arg передается на функции запуска (определенный с proc) как его единственный параметр. Эта функция позволяет создание потоков агента для того, чтобы обработать передачу с другим процессом или для того, чтобы обработать события без потребности загрузить специальный подкласс java.lang.Thread или разработчик java.lang.Runnable. Вместо этого создаваемый поток может работать полностью в собственном коде. Однако, создаваемый поток действительно требует недавно создаваемого экземпляра java.lang.Thread (ссылаемый параметром thread) с которым это будет связано. Объект потока может быть создан с вызовами JNI. Следующие приоритеты общей нити обеспечиваются для Вашего удобства:
Приоритетные Константы потока
Постоянный
Значение
Описание
JVMTI_THREAD_MIN_PRIORITY
1
Минимальный возможный приоритет потока
JVMTI_THREAD_NORM_PRIORITY
5
Нормальный приоритет потока
JVMTI_THREAD_MAX_PRIORITY
10
Максимальный возможный приоритет потока
Новая дискуссия начинается как поток демона с указанным priority. Если включено, a ThreadStart событие будет отправлено. Так как поток был запущен, поток будет жив, когда эта функция возвратится, если поток сразу не умер. Группа потока потока игнорируется - определенно, поток не добавляется к группе потока, и поток не замечается на запросах группы потока или в языке программирования Java или в JVM Поток не видим к запросам языка программирования Java, но включается в JVM GetAllThreads и GetAllStackTraces). После выполнения proc, новый поток будет присоединен к VM - см. документацию JNI относительно Присоединения к VM.
VM хранит значение указателя, связанное каждой парой потока среды. Это значение указателя вызывают локальной памятью потока. Это значение NULL если не установлено с этой функцией. Агенты могут выделить память, в которой они хранят поток определенная информация. Устанавливая локальную память потока с этим можно тогда получить доступ GetThreadLocalStorage. Эта функция вызывается агентом, чтобы установить значение JVM
Получите от этого потока. Если threadNULL, текущий поток используется.
data_ptr
void**
Указатель, через который возвращается значение локальной памяти потока. Если локальная память потока не была установлена с SetThreadLocalStorage возвращенный указатель NULL.
По возврату, обращается к указателю на высокоуровневый групповой массив потока. Агент передает указатель на a jthreadGroup*. По возврату, jthreadGroup* точки недавно выделенному массиву размера *group_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные groups_ptr JNI локальные ссылки и должен управляться.
По возврату, заполненному информацией, описывающей указанную группу потока. Агент передает указатель на a jvmtiThreadGroupInfo. По возврату, jvmtiThreadGroupInfo был установлен. Объект возвратился в поле parent из jvmtiThreadGroupInfo JNI локальная ссылка и должен управляться. Указатель возвратился в поле name из jvmtiThreadGroupInfo недавно выделенный массив. Массив должен быть освобожден с Deallocate.
По возврату, точкам массиву живых потоков в этой группе потока. Агент передает указатель на a jthread*. По возврату, jthread* точки недавно выделенному массиву размера *thread_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные threads_ptr JNI локальные ссылки и должен управляться.
По возврату, точкам массиву активных дочерних групп потока. Агент передает указатель на a jthreadGroup*. По возврату, jthreadGroup* точки недавно выделенному массиву размера *group_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные groups_ptr JNI локальные ссылки и должен управляться.
Эти функции предоставляют информацию о стеке потока. На стековые фреймы ссылается глубина. Фрейм в нуле глубины является текущим фреймом. Стековые фреймы как описываются в Спецификации Виртуальной машины Java™, Главе 3.6, таким образом, они соответствуют вызовам метода (включая собственные методы), но не соответствуют платформе собственные или внутренние рамки VM. JVM main() и run(). Однако это представление должно быть непротиворечивым через всю JVM
Информационная структура стекового фрейма
Информация о стековом фрейме возвращается в этой структуре.
Получите информацию о стеке потока. Если max_frame_count меньше чем глубина стека, max_frame_count самые верхние фреймы возвращаются, иначе весь стек возвращается. Самые верхние фреймы, последний раз вызванные, в начале возвращенного буфера. Следующий пример заставляет до пяти из самых верхних фреймов быть возвращенными и (если есть какие-либо фреймы), в настоящий момент выполняющееся имя метода, которое будет напечатано.
thread не должен быть приостановлен, чтобы вызвать эту функцию. GetLineNumberTable функция может использоваться, чтобы отобразить расположения на номера строки. Отметьте, что это отображение может быть сделано лениво.
Начните получать фреймы в этой глубине. Если неотрицательный, количество от текущего фрейма, первый полученный фрейм в глубине start_depth. Например, если нуль, запустите с текущего фрейма; если один, запустите с вызывающей стороны текущего фрейма; если два, запустите с вызывающей стороны вызывающей стороны текущего фрейма; и так далее. Если отрицание, количество от ниже самого старого фрейма, первый полученный фрейм в глубине stackDepth + start_depth, где stackDepth является количеством фреймов на стеке. Например, если отрицательный, только самый старый фрейм получается; если отрицательные два, запустите с фрейма, вызванного самым старым фреймом.
По возврату этот агент выделенный буфер заполнен информацией о стековом фрейме. Агент передает массив, достаточно многочисленный, чтобы содержать max_frame_count элементы jvmtiFrameInfo. Входящие значения элементов массива игнорируются. По возврату, *count_ptr из элементов устанавливаются.
По возврату, точкам к числу заполненных записей. Для неотрицательного start_depth, это будет минутой (max_frame_count, stackDepth - start_depth). Для отрицательного start_depth, это будет минутой (max_frame_count, -start_depth). Агент передает указатель на a jint. По возврату, jint был установлен.
Получите информацию о стеках всех живых потоков (включая потоки агента). Если 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);
По возврату этот буфер заполнен информацией о стеке для каждого потока. Число jvmtiStackInfo записи определяются thread_count_ptr. Отметьте, что этот буфер выделяется, чтобы включать jvmtiFrameInfo буферы, которыми указывают jvmtiStackInfo.frame_buffer. Эти буферы не должны быть отдельно освобождены. Агент передает указатель на a jvmtiStackInfo*. По возврату, jvmtiStackInfo* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Объекты возвратились в поле thread из jvmtiStackInfo JNI локальные ссылки и должен управляться.
Получите информацию о стеках предоставленных потоков. Если max_frame_count меньше чем глубина стека, max_frame_count самые верхние фреймы возвращаются для того потока, иначе весь стек возвращается. Самые верхние фреймы, последний раз вызванные, в начале возвращенного буфера. Все стеки собираются одновременно, то есть, никакие изменения не произойдут с состоянием потока или стеками между выбирающим потоком и следующим. Потоки не должны быть приостановлены. Если поток еще не запустился или завершается прежде, чем информация стека собирается, нулевой стек длины (jvmtiStackInfo.frame_count будет нуль), будет возвращен и поток jvmtiStackInfo.state может быть проверен. См. пример для подобной функции GetAllStackTraces.
По возврату этот буфер заполнен информацией о стеке для каждого потока. Число jvmtiStackInfo записи определяются thread_count. Отметьте, что этот буфер выделяется, чтобы включать jvmtiFrameInfo буферы, которыми указывают jvmtiStackInfo.frame_buffer. Эти буферы не должны быть отдельно освобождены. Агент передает указатель на a jvmtiStackInfo*. По возврату, jvmtiStackInfo* точки недавно выделенному массиву размера *thread_count. Массив должен быть освобожден с Deallocate. Объекты возвратились в поле thread из jvmtiStackInfo JNI локальные ссылки и должен управляться.
Получите число фреймов в настоящий момент в стеке вызовов указанного потока. Если эта функция вызывается для потока, активно выполняющего байт-коды (например, не текущий поток, и не приостанавливается), возвращенной информацией является переходный процесс.
Вытолкайте текущий фрейм thread's стек. Выталкивание фрейма берет Вас к предыдущему фрейму. Когда поток возобновляется, режим выполнения потока сразу сбрасывается к состоянию прежде, чем вызванный метод был вызван. Это (использование терминологии Спецификации Виртуальной машины Java™):
текущий фрейм отбрасывается, поскольку предыдущий фрейм становится текущим
стек операнда восстанавливается - значения аргументов добавляются назад и если вызывание не было invokestatic, objectref добавляется назад также
PC виртуальной машины Java восстанавливается коду операции вызвать инструкции
Отметьте однако, что любые изменения к параметрам, которые произошли в вызванном методе, остаются; когда выполнение будет продолжаться, первая инструкция, которая выполнит, будет вызыванием. Между вызовом PopFrame и возобновляя поток состояние стека неопределено. Чтобы вытолкать фреймы вне первого, эти три шага должны быть повторены:
приостановите поток через событие (шаг, точка останова...)
вызвать PopFrame
возобновите поток
Блокировка, полученная, вызывая вызванный метод (если это - a synchronized метод), и блокировки получаются, входя synchronized блоки в пределах вызванного метода выпускаются. Отметьте: это не применяется к собственным блокировкам или java.util.concurrent.locks блокировки. Наконец блоки не выполняются. Изменения к глобальному состоянию не адресуются и таким образом остаются измененными. Указанный поток должен быть приостановлен (который подразумевает, что это не может быть текущий поток). И вызванный метод и метод вызова должны быть несобственными методами языка программирования Java. Никакая JVM
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
По возврату, точкам к индексу в настоящий момент выполняющейся инструкции. Устанавливается в -1 если фрейм выполняет собственный метод. Агент передает указатель на a jlocation. По возврату, jlocation был установлен.
Когда фрейм, который является в настоящий момент в depth выталкивается от стека, генерируйте a FramePop событие. См. FramePop событие для деталей. Только фреймы, соответствующие несобственным методам языка программирования Java, могут получить уведомление. Указанный поток должен или быть текущим потоком или потоком, должен быть приостановлен.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Эти функции позволяют агенту вынуждать метод возвратиться в любой точке во время ее выполнения. Метод, который возвратится рано, упоминается как вызванный метод. Вызванный метод является текущим методом (как определено Спецификацией Виртуальной машины Java™, Главой 3.6) для указанного потока в то время, когда функция вызывается. Указанный поток должен быть приостановлен или должен быть текущим потоком. Возврат происходит, когда выполнение кода языка программирования Java возобновляется на этом потоке. Между вызовом одной из этих функций и возобновлением выполнения потока, состояние стека неопределено. Никакие дальнейшие инструкции не выполняются в вызванном методе. Определенно, наконец блоки не выполняются. Отметьте: это может вызвать непоследовательные состояния в приложении. Блокировка, полученная, вызывая вызванный метод (если это - a synchronized метод), и блокировки получаются, входя synchronized блоки в пределах вызванного метода выпускаются. Отметьте: это не применяется к собственным блокировкам или java.util.concurrent.locks блокировки. События, такой как MethodExit, сгенерированы, как они были бы в нормальном возврате. Вызванный метод должен быть несобственным методом языка программирования Java. Принуждение возврата на потоке только с одним фреймом на стеке заставляет поток выходить когда возобновлено.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Предпринятый, чтобы возвратиться рано из фрейма, соответствующего собственному методу. Или реализация неспособна обеспечить эту функциональность на этом фрейме.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Предпринятый, чтобы возвратиться рано из фрейма, соответствующего собственному методу. Или реализация неспособна обеспечить эту функциональность на этом фрейме.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Предпринятый, чтобы возвратиться рано из фрейма, соответствующего собственному методу. Или реализация неспособна обеспечить эту функциональность на этом фрейме.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Предпринятый, чтобы возвратиться рано из фрейма, соответствующего собственному методу. Или реализация неспособна обеспечить эту функциональность на этом фрейме.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Предпринятый, чтобы возвратиться рано из фрейма, соответствующего собственному методу. Или реализация неспособна обеспечить эту функциональность на этом фрейме.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Предпринятый, чтобы возвратиться рано из фрейма, соответствующего собственному методу. Или реализация неспособна обеспечить эту функциональность на этом фрейме.
Эти функции используются, чтобы проанализировать "кучу". Функциональность включает возможность просмотреть объекты в "куче" и тегировать эти объекты.
Объектные Теги
Тег является значением, связанным с объектом. Теги явно устанавливаются агентом, используя SetTag функционируйте или функциями обратного вызова такой как jvmtiHeapIterationCallback. Теги локальны для среды; то есть, теги одной среды не видимы в другом. Теги jlong значения, которые могут использоваться просто, чтобы отметить объект или сохранить указатель на более подробную информацию. У объектов, которые не были тегированы, есть тег нуля. Обнуление тега делает объект нетеговым.
Функции обратного вызова "кучи"
Функции "кучи", которые выполняют итерации через "кучу" и рекурсивно следуют за ссылками на объект, используют агент предоставленные функции обратного вызова, чтобы поставить информацию. Эти функции обратного вызова "кучи" должны придерживаться следующих ограничений - Эти обратные вызовы не должны использовать функции JNI. Эти обратные вызовы не должны использовать обратный вызов JVM безопасные функции, которые определенно позволяют такое использование (см. необработанный монитор, управление памятью, и среду локальные функции хранения). Реализация может вызвать обратный вызов на внутренний поток или поток, который вызывал итеративную функцию. Обратные вызовы "кучи" являются единственными, распараллеливал - не больше, чем, один обратный вызов будет вызван за один раз. Флаги Фильтра "Кучи" могут использоваться, чтобы предотвратить создание отчетов, основанное на состоянии тега объекта или его класса. Если никакие флаги не устанавливаются ( jint нуль), объекты не будут отфильтрованы.
Флаги Фильтра "кучи"
Постоянный
Значение
Описание
JVMTI_HEAP_FILTER_TAGGED
0x4
Отфильтруйте теговые объекты. Объекты, которые тегируются, не включаются.
JVMTI_HEAP_FILTER_UNTAGGED
0x8
Отфильтруйте нетеговые объекты. Объекты, которые не тегируются, не включаются.
JVMTI_HEAP_FILTER_CLASS_TAGGED
0x10
Отфильтруйте объекты с теговыми классами. Объекты, класс которых тегируется, не включаются.
JVMTI_HEAP_FILTER_CLASS_UNTAGGED
0x20
Отфильтруйте объекты с нетеговыми классами. Объекты, класс которых не тегируется, не включаются.
Флаги Управления Посещением "Кучи" возвращаются обратными вызовами "кучи" и могут использоваться, чтобы прервать итерацию. Для Ссылочного Обратного вызова "Кучи" это может также использоваться, чтобы сократить график пересеченных ссылок (JVMTI_VISIT_OBJECTS не устанавливается).
Флаги Управления Посещением "кучи"
Постоянный
Значение
Описание
JVMTI_VISIT_OBJECTS
0x100
Если мы посещаем объект и если этот обратный вызов инициировался FollowReferences, пересеките ссылки этого объекта. Иначе проигнорированный.
JVMTI_VISIT_ABORT
0x8000
Прервите итерацию. Проигнорируйте все другие биты.
Ссылка от объекта до значения одного из его полей экземпляра.
JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT
3
Ссылка от массива к одному из его элементов.
JVMTI_HEAP_REFERENCE_CLASS_LOADER
4
Ссылка от класса до его загрузчика класса.
JVMTI_HEAP_REFERENCE_SIGNERS
5
Ссылка от класса до его массива подписывающих лиц.
JVMTI_HEAP_REFERENCE_PROTECTION_DOMAIN
6
Ссылка от класса до его домена защиты.
JVMTI_HEAP_REFERENCE_INTERFACE
7
Ссылка от класса до одного из его интерфейсов. Отметьте: интерфейсы определяются через постоянную ссылку пула, таким образом, об интерфейсах, на которые ссылаются, можно также сообщить с a JVMTI_HEAP_REFERENCE_CONSTANT_POOL ссылочный вид.
JVMTI_HEAP_REFERENCE_STATIC_FIELD
8
Ссылка от класса до значения одного из его статических полей.
JVMTI_HEAP_REFERENCE_CONSTANT_POOL
9
Ссылка от класса до разрешенной записи в постоянном пуле.
JVMTI_HEAP_REFERENCE_SUPERCLASS
10
Ссылка от класса до его суперкласса. Обратный вызов является роботом, отправленным, если суперкласс java.lang.Object. Отметьте: загруженные классы определяют суперклассы через постоянную ссылку пула, таким образом, о суперклассе, на который ссылаются, можно также сообщить с a JVMTI_HEAP_REFERENCE_CONSTANT_POOL ссылочный вид.
JVMTI_HEAP_REFERENCE_JNI_GLOBAL
21
Корневая ссылка "кучи": глобальная ссылка JNI.
JVMTI_HEAP_REFERENCE_SYSTEM_CLASS
22
Корневая ссылка "кучи": Системный класс.
JVMTI_HEAP_REFERENCE_MONITOR
23
Корневая ссылка "кучи": монитор.
JVMTI_HEAP_REFERENCE_STACK_LOCAL
24
Корневая ссылка "кучи": локальная переменная на стеке.
JVMTI_HEAP_REFERENCE_JNI_LOCAL
25
Корневая ссылка "кучи": JNI локальная ссылка.
JVMTI_HEAP_REFERENCE_THREAD
26
Корневая ссылка "кучи": Поток.
JVMTI_HEAP_REFERENCE_OTHER
27
Корневая ссылка "кучи": другая корневая ссылка "кучи".
Определения для единственных дескрипторов символьного типа типов примитивов.
Перечисление Типа примитива (jvmtiPrimitiveType)
Постоянный
Значение
Описание
JVMTI_PRIMITIVE_TYPE_BOOLEAN
90
'Z' - язык программирования Java boolean - JNI jboolean
JVMTI_PRIMITIVE_TYPE_BYTE
66
'B' - язык программирования Java byte - JNI jbyte
JVMTI_PRIMITIVE_TYPE_CHAR
67
'C' - язык программирования Java char - JNI jchar
JVMTI_PRIMITIVE_TYPE_SHORT
83
'S' - язык программирования Java short - JNI jshort
JVMTI_PRIMITIVE_TYPE_INT
73
'Я' - язык программирования Java int - JNI jint
JVMTI_PRIMITIVE_TYPE_LONG
74
'J' - язык программирования Java long - JNI jlong
JVMTI_PRIMITIVE_TYPE_FLOAT
70
'F' - язык программирования Java float - JNI jfloat
JVMTI_PRIMITIVE_TYPE_DOUBLE
68
'D' - язык программирования Java double - JNI jdouble
Ссылочная информационная структура для Полевых ссылок
Для JVMTI_HEAP_REFERENCE_FIELD, объект referrer не является классом или inteface. В этом случае, index индекс поля в классе объекта referrer. Этот класс упоминается ниже как C. Для JVMTI_HEAP_REFERENCE_STATIC_FIELD, объект referrer является классом (упомянутый ниже как C) или интерфейс (упомянутый ниже как I). В этом случае, index индекс поля в том классе или интерфейсе. Если объект referrer не является интерфейсом, то полевые индексы определяются следующим образом:
составьте список всех полей в C и его суперклассах, запускающихся со всех полей в java.lang.Object и окончание всеми полями в C.
В пределах этого списка, помещенного поля для данного класса в порядке, возвращенном 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. Экземпляр класса C1 будет иметь следующие полевые индексы:
a
2
Количество полей в интерфейсах, реализованных C1 два (n=2): p из I0 и x из I1.
b
3
последующий индекс.
Класс C1 будет иметь те же самые полевые индексы. Экземпляр класса C2 будет иметь следующие полевые индексы:
a
3
Количество полей в интерфейсах, реализованных C2 три (n=3): p из I0, x из I1 и y из I2 (интерфейс C2). Отметьте что поле p из I0 только включается однажды.
b
4
последующий индекс к "a".
q
5
последующий индекс к "b".
r
6
последующий индекс к "q".
Класс C2 будет иметь те же самые полевые индексы. Отметьте, что у поля может быть различный индекс в зависимости от объекта, который просматривает его - например поле "a" выше. Отметьте также: не все полевые индексы могут быть видимыми от обратных вызовов, но все индексы показывают в иллюстративных целях. Интерфейс I1 будет иметь следующие полевые индексы:
x
1
Количество полей в суперинтерфейсах I1 один (n=1): p из I0.
Ссылочная информационная структура для ссылок Массива
Объяснение: функциональность дампа "кучи" (ниже) использует обратный вызов для каждого объекта. В то время как казалось бы, что буферизованный подход обеспечит лучшую пропускную способность, тесты не показывают это, чтобы иметь место - возможно из-за местоположения ссылки памяти или издержек доступа массива.
Агент предоставленная функция обратного вызова. Описывает (но не передает в), объект в "куче". Эта функция должна возвратить немного вектора требуемых флагов управления посещением. Это определит, должна ли вся итерация быть прервана ( JVMTI_VISIT_OBJECTS флаг игнорируется). См. ограничения функции обратного вызова "кучи".
Тег класса объекта (обнуляют, если класс не тегируется). Если объект представляет класс времени выполнения, class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
Объектное значение тега, или нуль, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
Агент предоставленная функция обратного вызова. Описывает ссылку от объекта или VM (referrer) к другому объекту (referree) или корень "кучи" к referree. Эта функция должна возвратить немного вектора требуемых флагов управления посещением. Это определит, нужно ли объекты, на которые ссылается referree, посетить или если вся итерация должна быть прервана. См. ограничения функции обратного вызова "кучи".
Тег класса объекта referree (обнуляют, если класс не тегируется). Если объект referree представляет класс времени выполнения, class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
Тег класса объекта referrer (обнуляют, если класс не тегируется или referree, является корнем "кучи"). Если объект referrer представляет класс времени выполнения, referrer_class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
Точки к referree возражают значению тега, или нулю, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
Точки к тегу объекта referrer, или точки к нулю, если объект referrer не тегируется. NULL если referrer в не объект (то есть, этот обратный вызов сообщает о корне "кучи"). Чтобы установить значение тега, которое будет связано с referrer, возражают, что агент устанавливает jlong указанный параметром. Если этот обратный вызов сообщает о ссылке от объекта до себя, referrer_tag_ptr == tag_ptr.
Предоставленная функция обратного вызова агента, которая описывает примитивное поле объекта (объект). Примитивное поле является полем, тип которого является типом примитива. Этот обратный вызов опишет статическое поле, если объект будет классом, и иначе опишет поле экземпляра. Эта функция должна возвратить немного вектора требуемых флагов управления посещением. Это определит, должна ли вся итерация быть прервана ( JVMTI_VISIT_OBJECTS флаг игнорируется). См. ограничения функции обратного вызова "кучи".
Тег класса объекта (обнуляют, если класс не тегируется). Если объект представляет класс времени выполнения, object_class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
Точки к тегу объекта, или нуль, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
Агент предоставленная функция обратного вызова. Описывает значения в массиве типа примитива. Эта функция должна возвратить немного вектора требуемых флагов управления посещением. Это определит, должна ли вся итерация быть прервана ( JVMTI_VISIT_OBJECTS флаг игнорируется). См. ограничения функции обратного вызова "кучи".
Точки к тегу объекта массива, или нуль, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
Агент предоставленная функция обратного вызова. Описывает значение java.lang. Строка. Эта функция должна возвратить немного вектора требуемых флагов управления посещением. Это определит, должна ли вся итерация быть прервана ( JVMTI_VISIT_OBJECTS флаг игнорируется). См. ограничения функции обратного вызова "кучи".
Точки к тегу Строкового объекта, или нуль, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
Эта функция инициирует обход по объектам, которые являются непосредственно и косвенно достижимы от указанного объекта или, если 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 устанавливается в массив класса байтов, тогда только о массивах байта сообщат. Таблица ниже суммирует это:
Во время выполнения этой функции не изменяется состояние "кучи": никакие объекты не выделяются, никакие объекты не собираются "мусор", и состояние объектов (включая сохраненные значения) не изменяется. В результате потоки, выполняющие код языка программирования Java, потоки, пытающиеся возобновлять выполнение кода языка программирования Java, и потоки, пытающиеся выполнить функции JNI, обычно останавливаются.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Этот битовый вектор "кучи" фильтрует флаги. ограничивает объекты, для которых вызывают функцию обратного вызова. Это применяется к и объектным и примитивным обратным вызовам.
Об обратных вызовах только сообщают, когда объект является экземпляром этого класса. Объекты, которые являются экземплярами подкласса klass не сообщаются. Если klass интерфейс, ни о каких объектах не сообщают. Это применяется к и объектным и примитивным обратным вызовам. Если klassNULL, обратные вызовы не ограничиваются экземплярами определенного класса.
Структура, определяющая набор функций обратного вызова. Агент передает в указателе на jvmtiHeapCallbacks.
user_data
const void *
Пользователь данные, которыми снабжают, которые передадут к обратному вызову. Агент передает в указателе. Если user_dataNULL, NULL передается как пользователь данные, которыми снабжают.
Инициируйте итерацию по всем объектам в "куче". Это включает и достижимые и недостижимые объекты. Объекты посещают без определенного порядка. Об объектах "кучи" сообщают, вызывая агент предоставленная функция обратного вызова jvmtiHeapIterationCallback. О ссылках между объектами не сообщают. Если только достижимые объекты требуются, или если информация о ссылке на объект необходима, использовать FollowReferences. Эта функция может также использоваться, чтобы исследовать примитивные (необъектные) значения. О примитивном значении массива или Строки сообщают после того, как объект посетили; об этом сообщают, вызывая агент предоставленная функция обратного вызова jvmtiArrayPrimitiveValueCallback или jvmtiStringPrimitiveValueCallback. О примитивном поле сообщают после того, как объект с тем полем посещают; об этом сообщают, вызывая агент предоставленная функция обратного вызова jvmtiPrimitiveFieldCallback. Если итерация не прерывается Флагами Управления Посещением "Кучи", возвращенными обратным вызовом, все объекты в "куче" посещают. Обеспечивается ли обратный вызов или NULL только определяет, будет ли обратный вызов вызван, он не влияет, какие объекты посещают, ни делает он влияет, будут ли другие обратные вызовы вызваны. Флаги фильтра "кучи" и klass если, поскольку параметры к этой функции не управляют, какие объекты посещают, но они действительно управляют, о каких объектах и примитивных значениях сообщают обратные вызовы. Например, если единственный обратный вызов, который был установлен, array_primitive_value_callback и klass устанавливается в массив класса байтов, тогда только о массивах байта сообщат. Таблица ниже суммирует, это (противопоставьте это с FollowReferences):
Во время выполнения этой функции не изменяется состояние "кучи": никакие объекты не выделяются, никакие объекты не собираются "мусор", и состояние объектов (включая сохраненные значения) не изменяется. В результате потоки, выполняющие код языка программирования Java, потоки, пытающиеся возобновлять выполнение кода языка программирования Java, и потоки, пытающиеся выполнить функции JNI, обычно останавливаются.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Этот битовый вектор "кучи" фильтрует флаги. ограничивает объекты, для которых вызывают функцию обратного вызова. Это применяется к и объектным и примитивным обратным вызовам.
Об обратных вызовах только сообщают, когда объект является экземпляром этого класса. Объекты, которые являются экземплярами подкласса klass не сообщаются. Если klass интерфейс, ни о каких объектах не сообщают. Это применяется к и объектным и примитивным обратным вызовам. Если klassNULL, обратные вызовы не ограничиваются экземплярами определенного класса.
Структура, определяющая функции обратного вызова набора. Агент передает в указателе на jvmtiHeapCallbacks.
user_data
const void *
Пользователь данные, которыми снабжают, которые передадут к обратному вызову. Агент передает в указателе. Если user_dataNULL, NULL передается как пользователь данные, которыми снабжают.
Получите тег, связанный с объектом. Тег является длинным значением, обычно используемым, чтобы сохранить уникальный идентификатор или указатель, чтобы возразить информации. Тег устанавливается с SetTag. Объекты, для которых не были установлены никакие теги, возвращают значение тега нуля.
май только быть вызванным во время запуска или живой фазы
Нет
106
1.0
Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Установите тег, связанный с объектом. Тег является длинным значением, обычно используемым, чтобы сохранить уникальный идентификатор или указатель, чтобы возразить информации. Тег видим с GetTag.
май только быть вызванным во время запуска или живой фазы
Нет
107
1.0
Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возвращает массив объектов с любым из тегов в tags. Агент передает указатель на a jobject*. По возврату, jobject* точки недавно выделенному массиву размера *count_ptr. Массив должен быть освобожден с Deallocate. Если object_result_ptrNULL, эта информация не возвращается. Объекты, возвращенные object_result_ptr JNI локальные ссылки и должен управляться.
Для каждого объекта в object_result_ptr, возвратите тег по соответствующему индексу. Агент передает указатель на a jlong*. По возврату, jlong* точки недавно выделенному массиву размера *count_ptr. Массив должен быть освобожден с Deallocate. Если tag_result_ptrNULL, эта информация не возвращается.
Вынудите VM выполнить сборку "мусора". Сборка "мусора" столь же полна насколько возможно. Эта функция не заставляет финализаторы быть выполненными. Эта функция не возвращается, пока сборка "мусора" не заканчивается. Хотя сборка "мусора" столь же полна насколько возможно нет никакой гарантии что все ObjectFree события будут отправлены к тому времени, когда эта функция возвращается. В частности объекту можно препятствовать быть освобожденным, потому что он ждет завершения.
Перечисление Ссылки на объект (jvmtiObjectReferenceKind)
Постоянный
Значение
Описание
JVMTI_REFERENCE_CLASS
1
Ссылка от объекта до его класса.
JVMTI_REFERENCE_FIELD
2
Ссылка от объекта до значения одного из его полей экземпляра. Для ссылок этого вида referrer_index параметр к jvmtiObjectReferenceCallback является индексом поле экземпляра. Индекс основан на порядке полей всего объекта. Это включает все поля непосредственно объявленных статических и полей экземпляра в классе, и включает все поля (и общественные и частные) поля, объявленные в суперклассах и суперинтерфейсах. Индекс таким образом вычисляется, суммируя индекс поля в непосредственно объявленном классе (см. GetClassFields), с общим количеством полей (и общественных и частных) объявленный во всех суперклассах и суперинтерфейсах. Индекс запускается в нуле.
JVMTI_REFERENCE_ARRAY_ELEMENT
3
Ссылка от массива к одному из его элементов. Для ссылок этого вида referrer_index параметр к jvmtiObjectReferenceCallback является индексом массива.
JVMTI_REFERENCE_CLASS_LOADER
4
Ссылка от класса до его загрузчика класса.
JVMTI_REFERENCE_SIGNERS
5
Ссылка от класса до его массива подписывающих лиц.
JVMTI_REFERENCE_PROTECTION_DOMAIN
6
Ссылка от класса до его домена защиты.
JVMTI_REFERENCE_INTERFACE
7
Ссылка от класса до одного из его интерфейсов.
JVMTI_REFERENCE_STATIC_FIELD
8
Ссылка от класса до значения одного из его статических полей. Для ссылок этого вида referrer_index параметр к jvmtiObjectReferenceCallback является индексом статическое поле. Индекс основан на порядке полей всего объекта. Это включает все поля непосредственно объявленных статических и полей экземпляра в классе, и включает все поля (и общественные и частные) поля, объявленные в суперклассах и суперинтерфейсах. Индекс таким образом вычисляется, суммируя индекс поля в непосредственно объявленном классе (см. GetClassFields), с общим количеством полей (и общественных и частных) объявленный во всех суперклассах и суперинтерфейсах. Индекс запускается в нуле. Отметьте: это определение отличается от этого в JVM
Объяснение: Никакие известные реализации, используемые 1.0 определения.
JVMTI_REFERENCE_CONSTANT_POOL
9
Ссылка от класса до разрешенной записи в постоянном пуле. Для ссылок этого вида referrer_index параметр к jvmtiObjectReferenceCallback является индексом в постоянный бильярдный стол для пула класса, запускающегося в 1. См. Спецификацию Виртуальной машины Java™, Главу 4.4.
Итеративное Перечисление Управления (jvmtiIterationControl)
Постоянный
Значение
Описание
JVMTI_ITERATION_CONTINUE
1
Продолжайте итерацию. Если это - ссылочная итерация, следуйте за ссылками этого объекта.
JVMTI_ITERATION_IGNORE
2
Продолжайте итерацию. Если это - ссылочная итерация, проигнорируйте ссылки этого объекта.
Агент предоставленная функция обратного вызова. Описывает (но не передает в), объект в "куче". Возвращаемое значение должно быть JVMTI_ITERATION_CONTINUE продолжать итерацию, или JVMTI_ITERATION_ABORT остановить итерацию. См. ограничения функции обратного вызова "кучи".
Тег класса объекта (обнуляют, если класс не тегируется). Если объект представляет класс времени выполнения, class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
Объектное значение тега, или нуль, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
user_data
void*
Данные пользователя, которыми снабжают, которые передали в итеративную функцию.
Агент предоставленная функция обратного вызова. Описывает (но не передает в), объект, который является корнем в целях сборки "мусора". Возвращаемое значение должно быть JVMTI_ITERATION_CONTINUE продолжать итерацию, JVMTI_ITERATION_IGNORE чтобы продолжать итерацию, не преследуя ссылки от referree возражают или JVMTI_ITERATION_ABORT остановить итерацию. См. ограничения функции обратного вызова "кучи".
Тег класса объекта (обнуляют, если класс не тегируется). Если объект представляет класс времени выполнения, class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
Объектное значение тега, или нуль, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
user_data
void*
Данные пользователя, которыми снабжают, которые передали в итеративную функцию.
Агент предоставленная функция обратного вызова. Описывает (но не передает в), объект на стеке, который является корнем в целях сборки "мусора". Возвращаемое значение должно быть JVMTI_ITERATION_CONTINUE продолжать итерацию, JVMTI_ITERATION_IGNORE чтобы продолжать итерацию, не преследуя ссылки от referree возражают или JVMTI_ITERATION_ABORT остановить итерацию. См. ограничения функции обратного вызова "кучи".
Тег класса объекта (обнуляют, если класс не тегируется). Если объект представляет класс времени выполнения, class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
Объектное значение тега, или нуль, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
Агент предоставленная функция обратного вызова. Описывает ссылку от объекта (referrer) к другому объекту (referree). Возвращаемое значение должно быть JVMTI_ITERATION_CONTINUE продолжать итерацию, JVMTI_ITERATION_IGNORE чтобы продолжать итерацию, не преследуя ссылки от referree возражают или JVMTI_ITERATION_ABORT остановить итерацию. См. ограничения функции обратного вызова "кучи".
Тег класса объекта referree (обнуляют, если класс не тегируется). Если объект referree представляет класс времени выполнения, class_tag тег, связанный с java.lang.Class (нуль, если java.lang.Class не тегируется).
referree возражают значению тега, или нулю, если объект не тегируется. Чтобы установить значение тега, которое будет связано с объектом, агент устанавливает jlong указанный параметром.
Для ссылок типа 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 индекс в постоянный пул класса - видит JVMTI_REFERENCE_CONSTANT_POOL для дальнейшего описания. Для ссылок других видов referrer_index-1.
user_data
void*
Данные пользователя, которыми снабжают, которые передали в итеративную функцию.
Выполните итерации По Объектам, Достижимым От Объекта
Эта функция выполняет итерации по всем объектам, которые являются непосредственно и косвенно достижимы от указанного объекта. Для каждого объекта (известный как referrer) со ссылкой, чтобы возразить B указанную функцию обратного вызова вызывают, чтобы описать ссылку на объект. Однажды обратный вызов вызывают точно для каждой ссылки от referrer; это - истина, даже если есть ссылочные циклы или разнообразные пути к referrer. Может быть больше чем одна ссылка между referrer и referree, Их можно отличить jvmtiObjectReferenceCallback.reference_kind и jvmtiObjectReferenceCallback.referrer_index. Обратный вызов для объекта будет всегда происходить после обратного вызова для его referrer. См. FollowReferences для ссылок на объект, о которых сообщают. Во время выполнения этой функции не изменяется состояние "кучи": никакие объекты не выделяются, никакие объекты не собираются "мусор", и состояние объектов (включая сохраненные значения) не изменяется. В результате потоки, выполняющие код языка программирования Java, потоки, пытающиеся возобновлять выполнение кода языка программирования Java, и потоки, пытающиеся выполнить функции JNI, обычно останавливаются.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Обратный вызов, который вызовут, чтобы описать каждую ссылку на объект.
user_data
const void *
Пользователь данные, которыми снабжают, которые передадут к обратному вызову. Агент передает в указателе. Если user_dataNULL, NULL передается как пользователь данные, которыми снабжают.
Эта функция выполняет итерации по корневым объектам и всем объектам, которые являются непосредственно и косвенно достижимы от корневых объектов. Корневые объекты включают набор системных классов, глобальных переменных 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, обычно останавливаются.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Функция обратного вызова, которую вызовут для каждого корня "кучи" типа JVMTI_HEAP_ROOT_JNI_GLOBAL, JVMTI_HEAP_ROOT_SYSTEM_CLASS, JVMTI_HEAP_ROOT_MONITOR, JVMTI_HEAP_ROOT_THREAD, или JVMTI_HEAP_ROOT_OTHER. Если heap_root_callbackNULL, не сообщайте о корнях "кучи".
Функция обратного вызова, которую вызовут для каждого корня "кучи" JVMTI_HEAP_ROOT_STACK_LOCAL или JVMTI_HEAP_ROOT_JNI_LOCAL. Если stack_ref_callbackNULL, не сообщайте о ссылках стека.
Функция обратного вызова, которую вызовут для каждой ссылки на объект. Если object_ref_callbackNULL, не следуйте за ссылками от корневых объектов.
user_data
const void *
Пользователь данные, которыми снабжают, которые передадут к обратному вызову. Агент передает в указателе. Если user_dataNULL, NULL передается как пользователь данные, которыми снабжают.
Выполните итерации по всем объектам в "куче". Это включает и достижимые и недостижимые объекты. object_filter параметр указывает на объекты, для которых вызывают функцию обратного вызова. Если этот параметр JVMTI_HEAP_OBJECT_TAGGED тогда обратный вызов только вызовут для каждого объекта, который тегируется. Если параметр JVMTI_HEAP_OBJECT_UNTAGGED тогда обратный вызов только будет для объектов, которые не тегируются. Если параметр JVMTI_HEAP_OBJECT_EITHER тогда обратный вызов вызовут для каждого объекта в "куче", независимо от того, тегируется ли это или нет. Во время выполнения этой функции не изменяется состояние "кучи": никакие объекты не выделяются, никакие объекты не собираются "мусор", и состояние объектов (включая сохраненные значения) не изменяется. В результате потоки, выполняющие код языка программирования Java, потоки, пытающиеся возобновлять выполнение кода языка программирования Java, и потоки, пытающиеся выполнить функции JNI, обычно останавливаются.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
iterator функционируют, чтобы быть вызванными для каждого объекта, соответствующего object_filter.
user_data
const void *
Пользователь данные, которыми снабжают, которые передадут к обратному вызову. Агент передает в указателе. Если user_dataNULL, NULL передается как пользователь данные, которыми снабжают.
Выполните итерации по всем объектам в "куче", которые являются экземплярами указанного класса. Это включает прямые экземпляры указанного класса и экземпляры всех подклассов указанного класса. Это включает и достижимые и недостижимые объекты. object_filter параметр указывает на объекты, для которых вызывают функцию обратного вызова. Если этот параметр JVMTI_HEAP_OBJECT_TAGGED тогда обратный вызов только вызовут для каждого объекта, который тегируется. Если параметр JVMTI_HEAP_OBJECT_UNTAGGED тогда обратный вызов только вызовут для объектов, которые не тегируются. Если параметр JVMTI_HEAP_OBJECT_EITHER тогда обратный вызов вызовут для каждого объекта в "куче", независимо от того, тегируется ли это или нет. Во время выполнения этой функции не изменяется состояние "кучи": никакие объекты не выделяются, никакие объекты не собираются "мусор", и состояние объектов (включая сохраненные значения) не изменяется. В результате потоки, выполняющие код языка программирования Java, потоки, пытающиеся возобновлять выполнение кода языка программирования Java, и потоки, пытающиеся выполнить функции JNI, обычно останавливаются.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
iterator функционируют, чтобы быть вызванными для каждого klass экземпляр, соответствующий object_filter.
user_data
const void *
Пользователь данные, которыми снабжают, которые передадут к обратному вызову. Агент передает в указателе. Если user_dataNULL, NULL передается как пользователь данные, которыми снабжают.
Эти функции используются, чтобы получить или установить значение локальной переменной. Переменная идентифицируется глубиной фрейма, содержащего его значение и число слота переменной в пределах того фрейма. Отображение переменных к числам слота может быть получено с функцией GetLocalVariableTable.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
По возврату, точкам к значению переменной. Агент передает указатель на a jobject. По возврату, jobject был установлен. Объект, возвращенный value_ptr JNI локальная ссылка и должен управляться.
Эта функция может использоваться, чтобы получить значение локальной переменной объекта в слоте 0 ("this"объект) от нестатических фреймов. Эта функция может получить"this"объект от собственных фреймов метода, тогда как GetLocalObject() возвратился бы JVMTI_ERROR_OPAQUE_FRAME в тех случаях.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
По возврату, точкам к значению переменной. Агент передает указатель на a jobject. По возврату, jobject был установлен. Объект, возвращенный value_ptr JNI локальная ссылка и должен управляться.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Установите точку останова в инструкции, обозначенной method и location. У инструкции может только быть одна точка останова. Всякий раз, когда определяемая инструкция собирается быть выполненной, a Breakpoint событие сгенерировано.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Генерируйте a FieldAccess событие, когда поле, определенное klass и field собирается быть полученным доступ. Событие будет сгенерировано для каждого доступа поля, пока это не будет отменено с ClearFieldAccessWatch. Доступы к полю от кода языка программирования Java или от кода JNI наблюдаются, поля, измененные другими средствами, не наблюдаются. Отметьте ту JVM SetFieldModificationWatch контролировать модификации.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Генерируйте a FieldModification событие, когда поле, определенное klass и field собирается быть измененным. Событие будет сгенерировано для каждой модификации поля, пока это не будет отменено с ClearFieldModificationWatch. Полевые модификации от кода языка программирования Java или от кода JNI наблюдаются, поля, измененные другими средствами, не наблюдаются. Отметьте ту JVM
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Возвратите массив всех классов, загруженных в виртуальной машине. Число классов в массиве возвращается через class_count_ptr, и массив непосредственно через classes_ptr. Классы массива всех типов (включая массивы типов примитивов) включаются в возвращенный список. Примитивные классы (например, java.lang.Integer.TYPE) не включаются в этот список.
По возврату, точкам массиву ссылок, один для каждого класса. Агент передает указатель на a jclass*. По возврату, jclass* точки недавно выделенному массиву размера *class_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные classes_ptr JNI локальные ссылки и должен управляться.
Возвращает массив тех классов, для которых этот загрузчик класса был записан как загрузчик инициирования. Каждый класс в возвращенном массиве создавался этим загрузчиком класса, или определяя это непосредственно или делегацией другого загрузчика класса. См. Спецификацию Виртуальной машины Java™, Главу 5.3. Для реализаций версии 1.1 JDK, которые не распознают различие между инициированием и определением загрузчиков класса, эта функция должна возвратить все классы, загруженные в виртуальной машине. Число классов в массиве возвращается через class_count_ptr, и массив непосредственно через classes_ptr.
По возврату, точкам массиву ссылок, один для каждого класса. Агент передает указатель на a jclass*. По возврату, jclass* точки недавно выделенному массиву размера *class_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные classes_ptr JNI локальные ссылки и должен управляться.
Для класса, обозначенного klass, возвратите подпись типа JNI и универсальную подпись класса. Например, java.util.List"Ljava/util/List;" и int[]"[I" Возвращенное имя для примитивных классов является символом подписи типа соответствующего типа примитива. Например, java.lang.Integer.TYPE"I".
По возврату, точкам к подписи типа JNI класса, закодированного как измененная строка UTF-8. Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если signature_ptrNULL, подпись не возвращается.
generic_ptr
char **
По возврату, точкам к универсальной подписи класса, закодированного как измененная строка UTF-8. Если нет никакого универсального атрибута подписи для класса, то, по возврату, точкам к NULL. Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если generic_ptrNULL, универсальная подпись не возвращается.
По возврату, точкам к текущему состоянию этого класса как один или больше флагов состояния класса. Агент передает указатель на a jint. По возврату, jint был установлен.
Для класса, обозначенного klass, возвратите имя исходного файла через source_name_ptr. Возвращенная строка является именем файла только и никогда не содержит имя каталога. Для примитивных классов (например, java.lang.Integer.TYPE) и для массивов эта функция возвраты JVMTI_ERROR_ABSENT_INFORMATION.
май только быть вызванным во время запуска или живой фазы
Нет
50
1.0
Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
По возврату, точкам к имени исходного файла класса, закодированному как измененная строка UTF-8. Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate.
Для класса, обозначенного klass, возвратите флаги доступа через modifiers_ptr. Флаги доступа определяются в Спецификации Виртуальной машины Java™, Главе 4. Если класс является классом массива, то его общедоступные, частные, и защищенные модификаторы являются тем же самым как таковыми из его компонентного типа. Для массивов примитивов этот компонентный тип представляется одним из примитивных классов (например, java.lang.Integer.TYPE). Если класс является примитивным классом, его общедоступный модификатор всегда является истиной, и его защищенные и частные модификаторы всегда являются ложью. Если класс является классом массива или примитивным классом тогда, его заключительный модификатор всегда является истиной, и его интерфейсный модификатор всегда является ложью. Значения его других модификаторов не определяются этой спецификацией.
Для класса, обозначенного klass, возвратите количество методов через method_count_ptr и список ID метода через methods_ptr. Список метода содержит конструкторов и статические инициализаторы так же как истинные методы. Только непосредственно объявленные методы возвращаются (не наследованные методы). Пустой список метода возвращается для классов массива и примитивных классов (например, java.lang.Integer.TYPE).
По возврату, точкам массиву ID метода. Агент передает указатель на a jmethodID*. По возврату, jmethodID* точки недавно выделенному массиву размера *method_count_ptr. Массив должен быть освобожден с Deallocate.
Для класса, обозначенного klass, возвратите количество полей через field_count_ptr и список полевых ID через fields_ptr. Только непосредственно объявленные поля возвращаются (не наследованные поля). Поля возвращаются в порядке, они происходят в файле класса. Пустой cписок полей возвращается для классов массива и примитивных классов (например, java.lang.Integer.TYPE). Используйте JNI, чтобы определить длину массива.
По возврату, точкам полевому массиву ID. Агент передает указатель на a jfieldID*. По возврату, jfieldID* точки недавно выделенному массиву размера *field_count_ptr. Массив должен быть освобожден с Deallocate.
Возвратите прямые суперинтерфейсы этого класса. Для класса эта функция возвращает интерфейсы, объявленные в implements пункт. Для интерфейса эта функция возвращает интерфейсы, объявленные в extends пункт. Пустой интерфейсный список возвращается для классов массива и примитивных классов (например, java.lang.Integer.TYPE).
По возврату, точкам интерфейсному массиву. Агент передает указатель на a jclass*. По возврату, jclass* точки недавно выделенному массиву размера *interface_count_ptr. Массив должен быть освобожден с Deallocate. Объекты, возвращенные interfaces_ptr JNI локальные ссылки и должен управляться.
Для класса, обозначенного klass, возвратите номера вспомогательной версии и номера основной версии, как определено в Спецификации Виртуальной машины Java™, Главе 4.
По возврату, точкам к значению minor_version элемент Формата файла Класса. Отметьте: чтобы быть непротиворечивым с Форматом файла Класса, номер вспомогательной версии является первым параметром. Агент передает указатель на a jint. По возврату, jint был установлен.
Для класса, обозначенного klass, возвратите необработанные байты постоянного пула в формате constant_pool элемент Спецификации Виртуальной машины Java™, Главы 4. Формат постоянного пула может отличаться между версиями Формата файла Класса, таким образом, незначительные и главные номера версий класса должны быть проверены на совместимость. У возвращенного постоянного пула не могло бы быть того же самого расположения или содержания как постоянный пул в файле класса определения. Постоянный пул, возвращенный GetConstantPool (), может иметь больше или меньше записей чем определяющий постоянный пул. Записи могут быть в различном порядке. Постоянный пул, возвращенный GetConstantPool (), будет соответствовать постоянный пул, используемый GetBytecodes (). Таким образом, у байт-кодов, возвращенных GetBytecodes (), будут постоянные индексы пула, которые обращаются к постоянным записям пула, возвращенным GetConstantPool (). Отметьте это с тех пор RetransformClasses и RedefineClasses может изменить постоянный пул, постоянный пул, возвращенный этой функцией, может измениться соответственно. Таким образом корреспонденция между GetConstantPool () и GetBytecodes () не содержит, если есть прошедшее перепреобразование класса или переопределение. Значение постоянной записи пула, используемой данным байт-кодом, будет соответствовать значение файла класса определения (даже если индексы не будут соответствовать). Постоянные записи пула, которые не используются прямо или косвенно байт-кодами (например, строки UTF-8, связанные с аннотациями), не обязаны существовать в возвращенном постоянном пуле.
май только быть вызванным во время запуска или живой фазы
Нет
146
1.1
Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
По возврату, точкам к числу записей в постоянном бильярдном столе для пула плюс один. Это соответствует constant_pool_count элемент Формата файла Класса. Агент передает указатель на a jint. По возврату, jint был установлен.
По возврату, точкам к числу байтов в возвращенном необработанном постоянном пуле. Агент передает указатель на a jint. По возврату, jint был установлен.
constant_pool_bytes_ptr
unsigned char**
По возврату, точкам к необработанному постоянному пулу, который является байтами, определенными constant_pool элемент Формата файла Класса Агент передает указатель на a unsigned char*. По возврату, unsigned char* точки недавно выделенному массиву размера *constant_pool_byte_count_ptr. Массив должен быть освобожден с Deallocate.
Определяет, представляет ли ссылка на объект класса интерфейс. jboolean результат JNI_TRUE если "класс" является фактически интерфейсом, JNI_FALSE иначе.
Определяет, является ли класс поддающимся изменению. Если класс является поддающимся изменению (is_modifiable_class_ptr возвраты JNI_TRUE) класс может быть пересмотрен с RedefineClasses (принятие агента обладает can_redefine_classes возможность) или повторно преобразованный с RetransformClasses (принятие агента обладает can_retransform_classes возможность). Если класс не является поддающимся изменению (is_modifiable_class_ptr возвраты JNI_FALSE) класс ни не может быть пересмотрен, ни повторно преобразован. Примитивные классы (например, java.lang.Integer.TYPE) и классы массива никогда не являются поддающимися изменению.
По возврату, точкам к загрузчику класса, который загрузил этот класс. Если класс не создавался загрузчиком класса или если загрузчик класса является загрузчиком класса начальной загрузки, точками к NULL. Агент передает указатель на a jobject. По возврату, jobject был установлен. Объект, возвращенный classloader_ptr JNI локальная ссылка и должен управляться.
Для класса, обозначенного klass, возвратите расширение отладки через source_debug_extension_ptr. Возвращенная строка содержит точно информацию о расширении отладки, существующую в файле класса klass.
май только быть вызванным во время запуска или живой фазы
Нет
90
1.0
Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
По возврату, точкам к расширению отладки класса, закодированному как измененная строка UTF-8. Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate.
Эта функция облегчает инструментарий байт-кода уже загруженных классов. Заменять определение класса независимо от существующих байт-кодов, как можно было бы сделать, перекомпилировав из источника для отладки фиксировать-и-продолжать, RedefineClasses функция должна использоваться вместо этого. Когда классы первоначально загружаются или когда они пересматриваются, начальные байты файла класса могут быть преобразованы с ClassFileLoadHook событие. Эта функция запускает повторно процесс преобразования (произошло ли преобразование ранее). Это перепреобразование следует за этими шагами:
запуск с начальных байтов файла класса
для каждого перепреобразования неспособный агент, который получил a ClassFileLoadHook событие во время предыдущей загрузки или пересматривает, байты, которые это возвратило (через new_class_data параметр), снова используются как вывод преобразования; отметьте, что это эквивалентно повторному применению предыдущего преобразования, неизменно. за исключением того, что ClassFileLoadHook событие не отправляется этим агентам
для каждого перепреобразования способный агент, ClassFileLoadHook событие отправляется, позволяя новое преобразование быть примененным
преобразованные байты файла класса устанавливаются как новое определение класса
См. ClassFileLoadHook событие для большего количества деталей. Начальные байты файла класса представляют байты, которым передают ClassLoader.defineClass или RedefineClasses (прежде, чем любые преобразования были применены), однако они, возможно, не точно соответствуют им. Постоянный пул может отличаться способами, описанными в GetConstantPool. Будут соответствовать постоянные индексы пула в байт-кодах методов. Некоторые атрибуты, возможно, не присутствуют. Где порядок не значим, например порядок методов, порядок не может быть сохранен. Перепреобразование может заставить новые версии методов быть установленными. Старые версии метода могут стать устаревшими, новая версия метода будет использоваться на новом, вызывает. Если у метода есть активные стековые фреймы, те активные фреймы продолжают выполнять байт-коды исходной версии метода. Эта функция не вызывает инициализации за исключением того, что, который произошел бы под общепринятой семантикой JVM. Другими словами перепреобразование класса не заставляет свои инициализаторы быть выполненными. Значения статических полей останутся, как они были до вызова. Потоки не должны быть приостановлены. Все точки останова в классе очищаются. Все атрибуты обновляются. На экземпляры повторно преобразованного класса не влияют - поля сохраняют свои предыдущие значения. Наклеивает экземпляры, также незатронуты. В ответ на этот вызов, никакие события кроме ClassFileLoadHook событие будет отправлено. Перепреобразование может изменить тела метода, постоянный пул и атрибуты. Перепреобразование не должно добавить, удалить или переименовать поля или методы, изменить подписи методов, модификаторов изменения, или наследования изменения. Эти ограничения могут быть сняты в будущих версиях. См. ошибочное описание возврата ниже для информации о кодах ошибки, возвращенных, если неподдерживаемое перепреобразование предпринимается. Байты файла класса не проверяются или устанавливаются, пока они не прошли через цепочку ClassFileLoadHook события, таким образом возвращенный код ошибки отражает результат преобразований. Если какой-либо код ошибки возвращается кроме JVMTI_ERROR_NONE, ни одному из классов, которые будут повторно преобразованы, не установят новое определение. Когда эта функция возвращается (с кодом ошибки JVMTI_ERROR_NONE) всем классам, которые будут повторно преобразованы, установят их новые определения.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Может повторно преобразовать классы с RetransformClasses. В дополнение к ограничениям, введенным определенной реализацией для этой возможности (см. раздел Возможности), эта возможность должна быть установлена перед ClassFileLoadHook событие включается впервые в этой среде. Среда, которая обладает этой возможностью в то время, когда ClassFileLoadHook включается впервые, как говорят, способное перепреобразование. Среда, которая не обладает этой возможностью в то время, когда ClassFileLoadHook включается впервые, как говорят, неспособное перепреобразование.
Все данные классы пересматриваются согласно предоставленным определениям. Эта функция используется, чтобы заменить определение класса с новым определением, как мог бы быть необходим в отладке фиксировать-и-продолжать. Где существующие байты файла класса должны быть преобразованы, например в инструментарии байт-кода, RetransformClasses должен использоваться. Переопределение может заставить новые версии методов быть установленными. Старые версии метода могут стать устаревшими, новая версия метода будет использоваться на новом, вызывает. Если у метода есть активные стековые фреймы, те активные фреймы продолжают выполнять байт-коды исходной версии метода. Если сброс стековых фреймов требуется, использовать PopFrame выталкивать фреймы с устаревшими версиями метода. Эта функция не вызывает инициализации за исключением того, что, который произошел бы под общепринятой семантикой JVM. Другими словами пересмотр класса не заставляет свои инициализаторы быть выполненными. Значения статических полей останутся, как они были до вызова. Потоки не должны быть приостановлены. Все точки останова в классе очищаются. Все атрибуты обновляются. На экземпляры пересмотренного класса не влияют - поля сохраняют свои предыдущие значения. Наклеивает экземпляры, также незатронуты. В ответ на этот вызов Рычаг Загрузки Файла Класса JVM будет отправлен (если включено), но никакая другая JVM Переопределение может изменить тела метода, постоянный пул и атрибуты. Переопределение не должно добавить, удалить или переименовать поля или методы, изменить подписи методов, модификаторов изменения, или наследования изменения. Эти ограничения могут быть сняты в будущих версиях. См. ошибочное описание возврата ниже для информации о кодах ошибки, возвращенных, если неподдерживаемое переопределение предпринимается. Байты файла класса не проверяются или устанавливаются, пока они не прошли через цепочку ClassFileLoadHook события, таким образом возвращенный код ошибки отражает результат преобразований, которым применяются к байты, в которые передают class_definitions. Если какой-либо код ошибки возвращается кроме JVMTI_ERROR_NONE, ни одному из классов, которые будут пересмотрены, не установят новое определение. Когда эта функция возвращается (с кодом ошибки JVMTI_ERROR_NONE) всем классам, которые будут пересмотрены, установят их новые определения.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Для объекта, обозначенного object, возвратитесь через size_ptr размер объекта. Этот размер является специфичным для реализации приближением количества хранения, использованного этим объектом. Это может включать некоторых или все издержки объекта, и таким образом полезно для сравнения в пределах реализации, но не между реализациями. Оценка может измениться во время единственного вызова JVM.
Для объекта, обозначенного object, возвратитесь через hash_code_ptr хэш-код. Этот хэш-код мог использоваться, чтобы поддержать хэш-таблицу ссылок на объект, однако, на некоторых реализациях, это может вызвать существенные воздействия производительности - в большинстве случаев тегирует, будет больше действенных средств связывающейся информации с объектами. Эта функция гарантирует то же самое значение хэш-кода для определенного объекта в течение его жизни
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
По возврату, заполненному информацией о мониторе для указанного объекта. Агент передает указатель на a jvmtiMonitorUsage. По возврату, jvmtiMonitorUsage был установлен. Объект возвратился в поле owner из jvmtiMonitorUsage JNI локальная ссылка и должен управляться. Указатель возвратился в поле waiters из jvmtiMonitorUsage недавно выделенный массив. Массив должен быть освобожден с Deallocate. Объекты возвратились в поле waiters из jvmtiMonitorUsage JNI локальные ссылки и должен управляться. Указатель возвратился в поле notify_waiters из jvmtiMonitorUsage недавно выделенный массив. Массив должен быть освобожден с Deallocate. Объекты возвратились в поле notify_waiters из jvmtiMonitorUsage JNI локальные ссылки и должен управляться.
Для поля, обозначенного klass и field, возвратите имя поля через name_ptr и полевая подпись через signature_ptr. Полевые подписи определяются в Спецификации JNI и упоминаются как field descriptors в Спецификации Виртуальной машины Java™, Главе 4.3.2.
По возврату, точкам к имени поля, закодированному как измененная строка UTF-8. Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если name_ptrNULL, имя не возвращается.
signature_ptr
char **
По возврату, точкам к полевой подписи, закодированной как измененная строка UTF-8. Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если signature_ptrNULL, подпись не возвращается.
generic_ptr
char **
По возврату, точкам к универсальной подписи поля, закодированного как измененная строка UTF-8. Если нет никакого универсального атрибута подписи для поля, то, по возврату, точкам к NULL. Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если generic_ptrNULL, универсальная подпись не возвращается.
Для поля, обозначенного klass и field возвратите класс, который определил это через declaring_class_ptr. Класс объявления или будет klass, суперкласс, или реализованный интерфейс.
По возврату, точкам к классу объявления Агент передает указатель на a jclass. По возврату, jclass был установлен. Объект, возвращенный declaring_class_ptr JNI локальная ссылка и должен управляться.
Для поля, обозначенного klass и field возвратите флаги доступа через modifiers_ptr. Флаги доступа определяются в Спецификации Виртуальной машины Java™, Главе 4.
Для поля, обозначенного klass и field, возвратите значение, указывающее, является ли поле синтетическим через is_synthetic_ptr. Синтетические поля сгенерированы компилятором, но не существующие в коде первоисточника.
май только быть вызванным во время запуска или живой фазы
Нет
63
1.0
Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Эти функции предоставляют информацию о методе (представленный как a jmethodID) и набор, как обрабатываются методы.
Устаревшие Методы
Функции RetransformClasses и RedefineClasses может заставить новые версии методов быть установленными. Оригинальную версию метода считают эквивалентной новой версии если:
их байт-коды являются тем же самым за исключением индексов в постоянный пул и
константы, на которые ссылаются, равны.
Исходную версию метода, которая не эквивалентна новой версии метода, вызывают устаревшая и присваивается новый ID метода; исходный ID метода теперь обращается к новой версии метода. ID метода может быть протестирован на устаревание с IsMethodObsolete.
Для метода, обозначенного method, возвратите имя метода через name_ptr и сигнатура метода через signature_ptr. Сигнатуры методов определяются в Спецификации JNI и упоминаются как method descriptors в Спецификации Виртуальной машины Java™, Главе 4.3.3. Отметьте, что это отличается чем сигнатуры методов как определено в Спецификации языка Java.
По возврату, точкам к имени метода, закодированному как измененная строка UTF-8. Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если name_ptrNULL, имя не возвращается.
signature_ptr
char **
По возврату, точкам к сигнатуре метода, закодированной как измененная строка UTF-8. Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если signature_ptrNULL, подпись не возвращается.
generic_ptr
char **
По возврату, точкам к универсальной подписи метода, закодированного как измененная строка UTF-8. Если нет никакого универсального атрибута подписи для метода, то, по возврату, точкам к NULL. Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate. Если generic_ptrNULL, универсальная подпись не возвращается.
По возврату, точкам к классу объявления Агент передает указатель на a jclass. По возврату, jclass был установлен. Объект, возвращенный declaring_class_ptr JNI локальная ссылка и должен управляться.
Для метода, обозначенного method, возвратите флаги доступа через modifiers_ptr. Флаги доступа определяются в Спецификации Виртуальной машины Java™, Главе 4.
Для метода, обозначенного method, возвратите число слотов локальной переменной, используемых методом, включая локальные переменные, используемые, чтобы передать параметры к методу на его вызове. См. max_locals в Спецификации Виртуальной машины Java™, Главе 4.7.3.
Для метода, обозначенного method, возвратитесь через max_ptr число слотов локальной переменной используется параметрами метода. Отметьте, что параметры с двумя словами используют два слота.
Для метода, обозначенного method, возвратите таблицу исходных записей номера строки. Размер таблицы возвращается через entry_count_ptr и сама таблица возвращается через table_ptr.
май только быть вызванным во время запуска или живой фазы
Нет
70
1.0
Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
По возврату, точкам к табличному указателю номера строки. Агент передает указатель на a jvmtiLineNumberEntry*. По возврату, jvmtiLineNumberEntry* точки недавно выделенному массиву размера *entry_count_ptr. Массив должен быть освобожден с Deallocate.
Для метода, обозначенного method, возвратите начало и конечные адреса через start_location_ptr и end_location_ptr. В стандартной схеме индексации кода байта, start_location_ptr будет всегда указывать на нуль и end_location_ptr будет всегда указывать на количество кода байта минус один.
По возврату, точкам к первому расположению, или -1 если информация о расположении не доступна. Если информация доступна и GetJLocationFormat возвраты JVMTI_JLOCATION_JVMBCI тогда это всегда будет нулем. Агент передает указатель на a jlocation. По возврату, jlocation был установлен.
По возврату, точкам к последнему расположению, или -1 если информация о расположении не доступна. Агент передает указатель на a jlocation. По возврату, jlocation был установлен.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Длина допустимого раздела для этой локальной переменной. Последний код выстраивает индекс, где локальная переменная допустима, start_location + length.
name
char*
Имя локальной переменной, закодированное как измененная строка UTF-8.
signature
char*
Подпись типа локальной переменной, закодированная как измененная строка UTF-8. Формат подписи является тем же самым, поскольку это определило в Спецификации Виртуальной машины Java™, Главе 4.3.2.
generic_signature
char*
Универсальная подпись локальной переменной, закодированная как измененная строка UTF-8. Значение этого поля будет NULL для любой локальной переменной, у которой нет универсального типа.
По возврату, точкам массиву записей таблицы локальной переменной. Агент передает указатель на a jvmtiLocalVariableEntry*. По возврату, jvmtiLocalVariableEntry* точки недавно выделенному массиву размера *entry_count_ptr. Массив должен быть освобожден с Deallocate. Указатели возвратились в поле name из jvmtiLocalVariableEntry недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле signature из jvmtiLocalVariableEntry недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле generic_signature из jvmtiLocalVariableEntry недавно выделяются массивы. Массивы должны быть освобождены с Deallocate.
Для метода, обозначенного method, возвратите коды байта, которые реализуют метод. Число байт-кодов возвращается через bytecode_count_ptr. Коды самого байта возвращаются через bytecodes_ptr.
май только быть вызванным во время запуска или живой фазы
Нет
75
1.0
Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
По возврату, точкам к длине массива кода байта Агент передает указатель на a jint. По возврату, jint был установлен.
bytecodes_ptr
unsigned char**
По возврату, точкам к указателю на массив кода байта Агент передает указатель на a unsigned char*. По возврату, unsigned char* точки недавно выделенному массиву размера *bytecode_count_ptr. Массив должен быть освобожден с Deallocate.
Для метода, обозначенного method, возвратите значение, указывающее, является ли метод синтетическим через is_synthetic_ptr. Синтетические методы сгенерированы компилятором, но не существующие в коде первоисточника.
май только быть вызванным во время запуска или живой фазы
Нет
77
1.0
Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Эта функция изменяет обработку отказа собственного разрешения метода, позволяя повторную попытку с префиксом, которому применяются к имя. Когда использующийся с событием ClassFileLoadHook, это позволяет собственным методам быть инструментованными. Так как собственные методы не могут быть непосредственно инструментованы (у них нет никаких байт-кодов), они должны быть обернуты с несобственным методом, который может быть инструментован. Например, если мы имели:
native boolean foo(int x);
Мы могли преобразовать файл класса (с событием ClassFileLoadHook) так, чтобы это стало:
boolean foo(int x) {
... record entry to foo ...
return wrapped_foo(x);
}
native boolean wrapped_foo(int x);
Где foo становится оберткой для фактического собственного метода с добавленным префиксом, "обернутым _ ". Отметьте, что "обернутый _" был бы плохой выбор префикса, так как он мог бы очевидно сформировать имя существующего метода таким образом, что-то как" $ $ $MyAgentWrapped$ $ $ _" будет лучше, но сделало бы эти примеры менее читаемыми. Обертка позволит данным быть собранными на собственном вызове метода, но теперь проблема становится соединяющим обернутого метода с собственной реализацией. Таким образом, метод wrapped_foo потребности, которые будут разрешены к собственной реализации foo, который мог бы быть:
Эта функция позволяет префиксу быть определенным и надлежащее разрешение, чтобы произойти. Определенно, когда стандартное разрешение перестало работать, разрешение повторяется, принимая префикс во внимание. Есть два способа, которыми разрешение происходит, явное разрешение с функцией JNI RegisterNatives и нормальное автоматическое разрешение. Для RegisterNatives, VM будет делать попытку этой ассоциации:
method(foo) -> nativeImplementation(foo)
Когда это перестанет работать, разрешение будет повторено с указанным префиксом, предварительно ожидаемым к имени метода, приводя к корректному разрешению:
Когда это перестанет работать, разрешение будет повторено с указанным префиксом, удаленным из имени реализации, приводя к корректному разрешению:
method(wrapped_foo) -> nativeImplementation(foo)
Отметьте, что, так как префикс только используется, когда стандартное разрешение перестало работать, собственные методы могут быть обернуты выборочно. Начиная с каждой JVM ClassFileLoadHook событие. Таким образом, если три среды примененные обертки, foo мог бы стать $env3_$env2_$env1_foo. Но если, скажем, вторая среда не применяла обертку к foo это было бы справедливо $env3_$env1_foo. Чтобы быть в состоянии эффективно определить последовательность префиксов, промежуточный префикс только применяется, если его несобственная обертка существует. Таким образом, в последнем примере, даже при том, что $env1_foo не собственный метод, $env1_ префикс применяется с тех пор $env1_foo существует. Так как префиксы используются во время разрешения и так как разрешение может быть произвольно задержано, собственный префикс метода должен остаться установленным, пока есть соответствующие снабженные префиксом собственные методы.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Префикс, чтобы применяться, закодированный как измененная строка UTF-8. Агент передает в массиве char. Если prefixNULL, любой существующий префикс в этой среде отменяется.
Для нормального агента, SetNativeMethodPrefix обеспечит все необходимое собственное добавление префикса метода. Для метаагента, который выполняет многократные независимые преобразования файла класса (например как прокси для другого уровня агентов) эта функция позволяет каждому преобразованию иметь свой собственный префикс. Префиксы применяются в предоставленном порядке и обрабатываются в том же самом поместье как описано для приложения префиксов от многократной JVM SetNativeMethodPrefix. Заменяются любые предыдущие префиксы. Таким образом, вызывая эту функцию с a prefix_count из 0 добавление префикса отключений в этой среде.
SetNativeMethodPrefix и эта функция является этими двумя способами установить префиксы. Вызов SetNativeMethodPrefix с префиксом то же самое как вызывающий эту функцию с prefix_count из 1. Вызов SetNativeMethodPrefix с NULL то же самое как вызывающий эту функцию с prefix_count из 0.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Уничтожьте необработанный монитор. Если уничтожаемый монитор был введен этим потоком, из него выйдут прежде, чем он будет уничтожен. Если уничтожаемый монитор был введен другим потоком, ошибка будет возвращена, и монитор не будет уничтожен.
Получите монопольное владение необработанного монитора. Тот же самый поток может ввести монитор более тогда однажды. Поток должен выйти из монитора то же самое число раз, как это вводится. Если монитор вводится во время OnLoad (прежде, чем присоединенные потоки будут существовать), и не вышел, когда присоединенные потоки появляются, введение, как полагают, произошло на основном потоке.
Ожидайте уведомления о необработанном мониторе. Заставляет текущий поток ожидать до любого другого потока вызовы RawMonitorNotify или RawMonitorNotifyAll для указанного необработанного монитора, или указанного тайм-аута протек.
Обеспечивает возможность прервать и снова послать Java Собственный Интерфейс (JNI) вызовы функции, управляя таблицей функции JNI. См. Функции JNI в Java Собственная Интерфейсная Спецификация. Следующий пример иллюстрирует прерывание NewGlobalRef Вызов JNI, чтобы считать ссылочное создание.
Когда-то после myInit вызывается код JNI пользователя выполняется, который выполняет вызов, чтобы создать новую глобальную ссылку. Вместо того, чтобы идти в нормальную реализацию JNI вызов идет в myNewGlobalRef. Отметьте, что копия исходной функциональной таблицы сохраняется так, чтобы нормальная функция JNI могла быть вызвана после того, как данные собираются. Отметьте также, что любые функции JNI, которые не перезаписываются, будут обычно вести себя.
Накройте на стол функции JNI во всех текущих и будущих средах JNI. В результате все будущие вызовы JNI направляются к указанным функциям. Использовать GetJNIFunctionTable заставить функциональную таблицу передавать к этой функции. Для этой функции, чтобы вступить в силу обновленные записи таблицы должны использоваться клиентами JNI. Так как таблица определяется const некоторые компиляторы могут оптимизировать далеко доступ к таблице, таким образом препятствуя тому этой функции вступить в силу. Таблица копируется - изменяется на локальную копию таблицы, не имеют никакого эффекта. Эта функция влияет только на функциональную таблицу, все другие аспекты среды незатронуты. См. примеры выше.
Получите таблицу функции JNI. Таблица функции JNI копируется в выделенную память. Если SetJNIFunctionTable был вызван, измененный (не оригинал), функциональная таблица возвращается. Только функциональная таблица копируется, никакие другие аспекты среды не копируются. См. примеры выше.
По возврату, *function_table указывает на недавно выделенную копию таблицы функции JNI. Агент передает указатель на a jniNativeInterface*. По возврату, jniNativeInterface* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate.
Установите функции, которые вызовут для каждого события. Обратные вызовы определяются, предоставляя заменяющую таблицу функции. Функциональная таблица копируется - изменяется на локальную копию таблицы, не имеют никакого эффекта. Это - атомарное действие, все обратные вызовы устанавливаются сразу. Никакие события не отправляются прежде, чем эта функция вызывается. Когда запись NULL или когда событие вне size_of_callbacks никакое событие не отправляется. Детали о событиях описываются позже в этом документе. Событие должно быть включено и иметь обратный вызов, чтобы быть отправленным - порядок в который эта функция и SetEventNotificationMode вызываются не влияет на результат.
Если modeJVMTI_DISABLE, событие event_type будет отключен
Если threadNULL, событие включается или отключается глобально; иначе, это включается или отключается для определенного потока. Событие сгенерировано для определенного потока, если оно включается или в потоке или в глобальных уровнях. См. ниже для информации об определенных событиях. Следующими событиями нельзя управлять на уровне потока через эту функцию.
Первоначально, никакие события не включаются или на уровне потока или на глобальном уровне. Любые необходимые возможности (см., что Событие Включает Возможностям ниже) должны находиться в собственности прежде, чем вызвать эту функцию. Детали о событиях описываются ниже.
Генерируйте события, чтобы представить текущее состояние VM. Например, если event_typeJVMTI_EVENT_COMPILED_METHOD_LOAD, a CompiledMethodLoad событие будет отправлено за каждым в настоящий момент скомпилированным методом. Методы, которые были загружены и теперь были разгружены, не отправляются. История того, что были ранее отправлены события, не производит то, что события отправляются этой функцией - например, все в настоящий момент скомпилированные методы будут отправлены каждый раз, когда эта функция вызывается. Эта функция полезна, когда события, возможно, были пропущены из-за агента, присоединяющего после того, как выполнение программы начинается; эта функция генерирует пропущенные события. Попытки выполнить код языка программирования Java или функции JNI могут быть приостановлены до этой функции возвраты - таким образом, ни одного нельзя вызвать от потока, отправляющего событие. Эта функция возвращается только после того, как пропущенные события были отправлены, обработаны и возвратились. Событие может быть отправлено на различном потоке чем поток, на котором событие имело место. Обратный вызов для события должен быть установлен с SetEventCallbacks и с событием нужно включить SetEventNotificationMode или события не будут иметь место. Если у VM больше нет информации, чтобы генерировать некоторых или все требуемые события, события просто не отправляются - никакая ошибка не возвращается. Только следующие события поддерживаются:
Эти функции позволяют JVM У и функций расширения и событий расширения есть параметры, у каждого из которых есть 'тип' и 'вид', выбранный из следующих таблиц:
Типы Параметра Функции/События расширения (jvmtiParamTypes)
Постоянный
Значение
Описание
JVMTI_TYPE_JBYTE
101
Тип примитива языка программирования Java - byte. Тип JNI jbyte.
JVMTI_TYPE_JCHAR
102
Тип примитива языка программирования Java - char. Тип JNI jchar.
JVMTI_TYPE_JSHORT
103
Тип примитива языка программирования Java - short. Тип JNI jshort.
JVMTI_TYPE_JINT
104
Тип примитива языка программирования Java - int. Тип JNI jint.
JVMTI_TYPE_JLONG
105
Тип примитива языка программирования Java - long. Тип JNI jlong.
JVMTI_TYPE_JFLOAT
106
Тип примитива языка программирования Java - float. Тип JNI jfloat.
JVMTI_TYPE_JDOUBLE
107
Тип примитива языка программирования Java - double. Тип JNI jdouble.
JVMTI_TYPE_JBOOLEAN
108
Тип примитива языка программирования Java - boolean. Тип JNI jboolean.
JVMTI_TYPE_JOBJECT
109
Язык программирования Java возражает типу - java.lang.Object. Тип JNI jobject. Возвращенные значения являются JNI локальные ссылки и должны управляться.
JVMTI_TYPE_JTHREAD
110
Язык программирования Java возражает типу - java.lang.Thread. JVM jthread. Возвращенные значения являются JNI локальные ссылки и должны управляться.
JVMTI_TYPE_JCLASS
111
Язык программирования Java возражает типу - java.lang.Class. Тип JNI jclass. Возвращенные значения являются JNI локальные ссылки и должны управляться.
JVMTI_TYPE_JVALUE
112
Объединение всего языка программирования Java примитивные и объектные типы - тип JNI jvalue. Возвращенные значения, которые представляют объектные типы, являются JNI локальные ссылки и должны управляться.
JVMTI_TYPE_JFIELDID
113
Полевой идентификатор языка программирования Java - тип JNI jfieldID.
JVMTI_TYPE_JMETHODID
114
Идентификатор метода языка программирования Java - тип JNI jmethodID.
JVMTI_TYPE_CCHAR
115
C тип языка программирования - char.
JVMTI_TYPE_CVOID
116
C тип языка программирования - void.
JVMTI_TYPE_JNIENV
117
Среда JNI - JNIEnv. Должен использоваться с корректным jvmtiParamKind сделать это типом указателя.
Виды Параметра Функции/События расширения (jvmtiParamKind)
Постоянный
Значение
Описание
JVMTI_KIND_IN
91
Входящий параметр - foo.
JVMTI_KIND_IN_PTR
92
Входящий параметр указателя - const foo*.
JVMTI_KIND_IN_BUF
93
Входящий параметр массива - const foo*.
JVMTI_KIND_ALLOC_BUF
94
Исходящий выделенный параметр массива - foo**. Свободный с Deallocate.
Идентификатор для функции расширения, закодированной как измененная строка UTF-8. Соглашения о присвоении имен пакета использования. Например, com.sun.hotspot.bar
short_description
char*
Одно описание предложения функции, закодированной как измененная строка UTF-8.
Возвращает массив информации функции расширения, один на функцию Агент передает указатель на a jvmtiExtensionFunctionInfo*. По возврату, jvmtiExtensionFunctionInfo* точки недавно выделенному массиву размера *extension_count_ptr. Массив должен быть освобожден с Deallocate. Указатели возвратились в поле id из jvmtiExtensionFunctionInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле short_description из jvmtiExtensionFunctionInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле params из jvmtiExtensionFunctionInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле name из jvmtiParamInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле errors из jvmtiExtensionFunctionInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate.
Идентификатор для события расширения, закодированного как измененная строка UTF-8. Соглашения о присвоении имен пакета использования. Например, com.sun.hotspot.bar
short_description
char*
Одно описание предложения события, закодированного как измененная строка UTF-8.
Возвращает массив информации события расширения, один на событие Агент передает указатель на a jvmtiExtensionEventInfo*. По возврату, jvmtiExtensionEventInfo* точки недавно выделенному массиву размера *extension_count_ptr. Массив должен быть освобожден с Deallocate. Указатели возвратились в поле id из jvmtiExtensionEventInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле short_description из jvmtiExtensionEventInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле params из jvmtiExtensionEventInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate. Указатели возвратились в поле name из jvmtiParamInfo недавно выделяются массивы. Массивы должны быть освобождены с Deallocate.
Это - специфичное для реализации событие. Обработчик событий устанавливается с SetExtensionEventCallback. Обработчики событий для событий расширения должны быть объявлены varargs, чтобы соответствовать это определение. Отказ сделать так мог привести к несоответствию соглашения о вызовах и неопределенному поведению на некоторых платформах. Например, если jvmtiParamInfo возвращенный GetExtensionEvents указывает, что есть a jint параметр, обработчик событий должен быть объявлен:
Устанавливает функцию обратного вызова для события расширения и включает событию. Или, если обратный вызов NULL, отключает событие. Отметьте, что в отличие от стандартных событий, устанавливая обратный вызов и включая событию единственная работа.
Функции возможностей позволяют Вам изменять функциональность, доступную JVM Раздел "Возможностей" каждой функции и события описывает, с какими возможностями, если таковые вообще имеются, они связываются. "Необходимая Функциональность" означает, что это доступно для использования, и никакие возможности не должны быть добавлены, чтобы использовать это. "Дополнительная Функциональность" означает, что агент должен обладать возможностью прежде, чем это сможет использоваться. Чтобы обладать возможностью, агент должен добавить возможность. "Дополнительные функции" описывают возможности, которые, если добавлено, расширяют набор функций. Потенциально доступные возможности каждой JVM
май никогда быть добавленным
может быть добавлен в любом OnLoad или живая фаза в любой среде
может быть добавлен только во время OnLoad фаза
может находиться в собственности только одной средой за один раз
может находиться в собственности только одной средой за один раз, и только во время OnLoad фаза
и так далее...
Часто, добавление возможности может подвергнуться стоимости в скорости выполнения, время запуска, и/или место памяти. Отметьте, что издержки использования возможности абсолютно отличаются чем издержки обладания возможностью. Возьмите единственное продвижение в качестве примера. Когда единственное продвижение идет (то есть, когда событие включается и таким образом активно передающие события), издержки отправки и обработки события на каждой инструкции огромны в любой реализации. Однако, издержки обладания возможностью могут быть маленькими или большими, в зависимости от реализации. Кроме того, когда и если возможность потенциально доступна, зависит от реализации. Некоторые примеры:
Один VM мог бы выполнить все выполнение, компилируя байт-коды в собственный код и быть неспособен генерировать единственные инструкции шага. В этой реализации не может быть добавлена возможность.
Другой VM может быть в состоянии переключить выполнение на единственный ступающий интерпретатор в любое время. В этой реализации, имея возможность не имеет никаких издержек и мог быть добавлен в любое время.
Еще один VM мог бы быть в состоянии выбрать компиляцию байт-кода или единственный ступающий способный интерпретируемый механизм выполнения при запуске, но быть неспособным переключиться между ними. В этой реализации возможность должна была бы быть добавлена во время OnLoad фаза (прежде, чем выполнение байт-кода начнется) и оказала бы большое влияние на скорость выполнения, даже если бы единственное продвижение никогда не использовалось.
Все еще другой VM мог бы быть в состоянии добавить, "единственное продвижение на", зарегистрировались в скомпилированных байт-кодах или сгенерированном интерпретаторе. Снова в этой реализации возможность должна была бы быть добавлена во время OnLoad фаза, но издержки (тест и ответвление по каждой инструкции) была бы значительно меньше.
Например, недавно запущенный агент (в OnLoad функция), хочет включить всем возможным возможностям. Отметьте, что, вообще, это не желательно, поскольку агент может перенести потерю производительности для функциональности, это не использует. Код мог бы быть похожим на это в C:
Например, если агент хочет проверить, может ли это получить байт-коды метода (то есть, это хочет проверить, добавило ли это ранее эту возможность и не оставило это), код мог бы быть похожим на это в 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;
Может повторно преобразовать классы с RetransformClasses. В дополнение к ограничениям, введенным определенной реализацией для этой возможности (см. раздел Возможности), эта возможность должна быть установлена перед ClassFileLoadHook событие включается впервые в этой среде. Среда, которая обладает этой возможностью в то время, когда ClassFileLoadHook включается впервые, как говорят, способное перепреобразование. Среда, которая не обладает этой возможностью в то время, когда ClassFileLoadHook включается впервые, как говорят, неспособное перепреобразование.
Возвраты через capabilities_ptrфаза JVM жива, и определенные возможности могут только быть добавлены во время OnLoad фаза. AddCapabilities функция может использоваться, чтобы установить любого или эти возможности. Включаются в настоящий момент находившиеся в собственности возможности. Обычно эта функция используется в OnLoad функция. Некоторые виртуальные машины могут позволить ограниченному набору возможностей быть добавленным в живой фазе. В этом случае набор потенциально доступных возможностей будет, вероятно, отличаться от OnLoad фазовый набор. См. Примеры Возможности.
Установите новые возможности, добавляя возможности, значения которых устанавливаются в один (1) в *capabilities_ptr. Сохраняются все предыдущие возможности. Обычно эта функция используется в OnLoad функция. Некоторые виртуальные машины могут позволить ограниченному набору возможностей быть добавленным в живой фазе. См. Примеры Возможности.
Оставьте возможности, значения которых устанавливаются в один (1) в *capabilities_ptr. Некоторые реализации могут позволить только одной среде иметь возможность (см. введение возможности). Эта функция выпускает возможности так, чтобы они могли использоваться другими агентами. Все другие возможности сохраняются. Возможность больше не будет присутствовать в GetCapabilities. Попытка оставить возможность, которой не обладает агент, не является ошибкой.
Возвраты через capabilities_ptr дополнительная JVM 1) в соответствующем поле структуры возможностей. Среда не обладает возможностью, если она не была успешно добавлена с AddCapabilities. Среда только теряет владение возможностью, если это было оставлено с RelinquishCapabilities. Таким образом эта функция возвращает конечный результат AddCapabilities и RelinquishCapabilities вызовы, которые были выполнены. См. Примеры Возможности.
Эти функции предоставляют информацию о синхронизации. Разрешение, в котором обновляется время, не определяется. Они обеспечивают точность наносекунды, но не обязательно точность наносекунды. К деталям о таймерах, таких как их максимальные значения, можно получить доступ с функциями информации о таймере.
Информация таймера
Информационная функция для каждого таймера возвращает эту структуру данных.
Значение максимума таймер может достигнуть. После того, как это значение достигается обертки таймера назад, чтобы обнулить. Это - значение без знака. Если тестирующийся или печатающийся как jlong (подписанное значение) это, может казаться, отрицательное число.
Если это правда, таймер может быть внешне скорректирован и в результате пропустить вперед. Если ложь, значение таймера никогда не будет увеличиваться быстрее чем реальное время.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
По возврату, заполненному информацией, описывающей время, возвращенное GetCurrentThreadCpuTime. Агент передает указатель на a jvmtiTimerInfo. По возврату, jvmtiTimerInfo был установлен.
Возвратите процессорное время, используемое текущим потоком. Отметьте что GetThreadCpuTime функция обеспечивает процессорное время для любого потока, включая текущий поток. GetCurrentThreadCpuTime существует, чтобы поддерживать платформы, которые не могут предоставить процессорное время для потоков кроме текущего потока или у которых есть более точная информация для текущего потока (см. GetCurrentThreadCpuTimerInfo по сравнению с GetThreadCpuTimerInfo). На многих платформах этот вызов будет эквивалентен:
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Может получить процессорное время текущего потока. Если эта возможность включается после того, как потоки запустились, реализация может выбрать любое время до и включая время, когда возможность включается как точка, где набор процессорного времени запускается. Эта возможность должна быть потенциально доступной на любой платформе где can_get_thread_cpu_time потенциально доступно.
По возврату, точкам к процессорному времени, используемому этим потоком в наносекундах. Это - значение без знака. Если тестирующийся или печатающийся как jlong (подписанное значение) это, может казаться, отрицательное число. Агент передает указатель на a jlong. По возврату, jlong был установлен.
Получите информацию о GetThreadCpuTime таймер. Поля jvmtiTimerInfo структура заполнена в деталями о таймере. Эта информация является определенной для платформы и реализации GetThreadCpuTime и таким образом не изменяется потоком, и при этом он не изменяется во время определенного вызова VM. Отметьте что реализации GetCurrentThreadCpuTime и GetThreadCpuTime может отличаться, и таким образом значения, возвращенные GetCurrentThreadCpuTimerInfo и GetThreadCpuTimerInfo может отличаться - см. GetCurrentThreadCpuTime для получения дополнительной информации.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
По возврату, заполненному информацией, описывающей время, возвращенное GetThreadCpuTime. Агент передает указатель на a jvmtiTimerInfo. По возврату, jvmtiTimerInfo был установлен.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать эту функцию.
Может получить процессорное время потока. Если эта возможность включается после того, как потоки запустились, реализация может выбрать любое время до и включая время, когда возможность включается как точка, где набор процессорного времени запускается.
По возврату, точкам к процессорному времени, используемому указанным потоком в наносекундах. Это - значение без знака. Если тестирующийся или печатающийся как jlong (подписанное значение) это, может казаться, отрицательное число. Агент передает указатель на a jlong. По возврату, jlong был установлен.
Получите информацию о GetTime таймер. Поля jvmtiTimerInfo структура заполнена в деталями о таймере. Эта информация не будет изменяться во время определенного вызова VM.
По возврату, заполненному информацией, описывающей время, возвращенное GetTime. Агент передает указатель на a jvmtiTimerInfo. По возврату, jvmtiTimerInfo был установлен.
Возвратите текущую стоимость системного таймера в наносекундах. Возвращенное значение представляет наносекунды с некоторого фиксированного, но произвольного времени (возможно, в будущем, таким образом, значения могут быть отрицательными). Эта функция обеспечивает точность наносекунды, но не обязательно точность наносекунды. Никакие гарантии не делаются о том, как часто значения изменяются. Получите информацию об этом таймере с GetTimerInfo.
По возврату, точкам ко времени в наносекундах. Это - значение без знака. Если тестирующийся или печатающийся как jlong (подписанное значение) это, может казаться, отрицательное число. Агент передает указатель на a jlong. По возврату, jlong был установлен.
Возвращает число процессоров, доступных виртуальной машине Java. Это значение может измениться во время определенного вызова виртуальной машины. Приложения, которые чувствительны к числу доступных процессоров, должны поэтому иногда опрашивать это свойство.
По возврату, точкам к максимальному количеству процессоров, доступных виртуальной машине; никогда меньший чем один. Агент передает указатель на a jint. По возврату, jint был установлен.
Эти функции позволяют агенту добавлять к расположениям, что загрузчик класса ищет класс. Это полезно для установки инструментария под корректным загрузчиком класса.
Добавьте К Поиску Загрузчика Класса Начальной загрузки
Эта функция может использоваться, чтобы заставить классы инструментария быть определенными загрузчиком класса начальной загрузки. См. Спецификацию Виртуальной машины Java™, Главу 5.3.1. После того, как загрузчик класса начальной загрузки неудачно ищет класс, указанный зависимый от платформы путь поиска segment будет искаться также. Только один сегмент может быть определен в segment. Эта функция может быть вызвана многократно, чтобы добавить многократные сегменты, сегменты будут искаться в порядке, что эта функция была вызвана. В OnLoad поэтапно осуществите функцию, может использоваться, чтобы определить любой зависимый от платформы сегмент пути поиска, который будет искаться после того, как загрузчик класса начальной загрузки неудачно ищет класс. Сегмент обычно является файлом JAR или каталогом. В живой фазе segment может использоваться, чтобы определить любой зависимый от платформы путь к файлу JAR. Агент должен заботиться, что файл JAR не содержит классов или ресурсов кроме тех, чтобы быть определенным загрузчиком класса начальной загрузки в целях инструментария.
Спецификация Виртуальной машины Java™ определяет, что последующая попытка разрешить символьную ссылку, что виртуальная машина Java ранее неудачно попыталась разрешить всегда сбои с той же самой ошибкой, которая была брошена в результате начальной попытки разрешения. Следовательно, если файл JAR содержит запись, которая соответствует классу, для которого виртуальная машина Java неудачно попыталась разрешить ссылку, тогда последующие попытки разрешить, что ссылка перестанет работать с той же самой ошибкой как начальная попытка.
Эта функция может использоваться, чтобы заставить классы инструментария быть определенными системным загрузчиком класса. См. Спецификацию Виртуальной машины Java™, Главу 5.3.2. После того, как загрузчик класса неудачно ищет класс, указанный зависимый от платформы путь поиска segment будет искаться также. Только один сегмент может быть определен в segment. Эта функция может быть вызвана многократно, чтобы добавить многократные сегменты, сегменты будут искаться в порядке, что эта функция была вызвана. В OnLoad поэтапно осуществите функцию, может использоваться, чтобы определить любой зависимый от платформы сегмент пути поиска, который будет искаться после того, как системный загрузчик класса неудачно ищет класс. Сегмент обычно является файлом JAR или каталогом. В живой фазе segment зависимый от платформы путь к файлу JAR, который будет искаться после того, как системный загрузчик класса неудачно ищет класс. Агент должен заботиться, что файл JAR не содержит классов или ресурсов кроме тех, чтобы быть определенным системным загрузчиком класса в целях инструментария. В живой фазе системный загрузчик класса поддерживает добавление файла JAR, который будет искаться, если системный загрузчик класса реализует имя метода appendToClassPathForInstrumentation который берет единственный параметр типа java.lang.String. Метод не обязан иметь public доступ.
Спецификация Виртуальной машины Java™ определяет, что последующая попытка разрешить символьную ссылку, что виртуальная машина Java ранее неудачно попыталась разрешить всегда сбои с той же самой ошибкой, которая была брошена в результате начальной попытки разрешения. Следовательно, если файл JAR содержит запись, которая соответствует классу, для которого виртуальная машина Java неудачно попыталась разрешить ссылку, тогда последующие попытки разрешить, что ссылка перестанет работать с той же самой ошибкой как начальная попытка.
Список системных ключей свойства VM, которые могут использоваться с GetSystemProperty возвращается. Строго рекомендуется, чтобы виртуальные машины обеспечили следующие ключи свойства:
java.vm.vendor
java.vm.version
java.vm.name
java.vm.info
java.library.path
java.class.path
Обеспечивает доступ к системным свойствам, определенным и используемый VM. Набор свойств на командной строке включается. Это позволяет получать и устанавливать этих свойств прежде, чем VM даже начнет выполнять байт-коды. Так как это - представление VM системных свойств, набор доступных свойств будет обычно отличаться чем это в java.lang.System.getProperties. Вызов метода JNI может привыкнуть к доступу java.lang.System.getProperties. Набор свойств может вырасти во время выполнения.
По возврату, точкам к числу возвращенных ключей свойства. Агент передает указатель на a jint. По возврату, jint был установлен.
property_ptr
char***
По возврату, точкам массиву ключей свойства, закодированных как изменено строки UTF-8. Агент передает указатель на a char**. По возврату, char** точки недавно выделенному массиву размера *count_ptr, каждый элемент которого также недавно выделяется. Массив должен быть освобожден с Deallocate. Каждый из элементов должен быть освобожден с Deallocate.
Возвратите системное значение свойства VM, данное ключ свойства. Функция GetSystemProperties возвращает набор ключей свойства, которые могут использоваться. Свойства, которые могут быть получены, могут вырасти во время выполнения. Так как это - представление VM системных свойств, значения свойств могут отличаться от возвращенного java.lang.System.getProperty(String). Типичный VM мог бы скопировать значения системных свойств VM в Properties сохраненный java.lang.System во время инициализации того класса. После того любые изменения к системным свойствам VM (с SetSystemProperty) или java.lang.System системные свойства (с java.lang.System.setProperty(String,String)) заставил бы значения отклоняться. Вызов метода JNI может привыкнуть к доступу java.lang.System.getProperty(String).
май только быть вызванным во время OnLoad или живой фазы
Нет
131
1.0
Возможности
Необходимая Функциональность
Параметры
Имя
Ввести
Описание
property
const char*
Ключ свойства, чтобы получить, закодированный как измененная строка UTF-8. Агент передает в массиве char.
value_ptr
char**
По возврату, точкам к значению свойства, закодированному как измененная строка UTF-8. Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate.
Установите системное значение свойства VM. Функция GetSystemProperties возвращает набор ключей свойства, некоторые из них могут быть устанавливаемыми. См. GetSystemProperty.
Ключ свойства, закодированного как измененная строка UTF-8. Агент передает в массиве char.
value_ptr
const char *
Значение свойства, чтобы установить, закодированный как измененная строка UTF-8. Агент передает в массиве char. Если value_ptrNULL, не устанавливайте значение, но возврат JVMTI_ERROR_NOT_AVAILABLE если свойство не является writeable.
Возвратите текущую фазу выполнения VM. Фазы продолжаются в последовательности:
Фазы выполнения (jvmtiPhase)
Постоянный
Значение
Описание
JVMTI_PHASE_ONLOAD
1
OnLoad фаза: в то время как в Agent_OnLoad функция.
JVMTI_PHASE_PRIMORDIAL
2
Исконная фаза: между возвратом из Agent_OnLoad и VMStart событие.
JVMTI_PHASE_START
6
Запустите фазу: когда VMStart событие отправляется и до VMInit событие отправляется.
JVMTI_PHASE_LIVE
4
Живая фаза: когда VMInit событие отправляется и до VMDeath возвраты события.
JVMTI_PHASE_DEAD
8
Мертвая фаза: после VMDeath событие возвращается или после отказа запуска.
В случае отказа запуска VM продолжится непосредственно к мертвой фазе, пропускающей промежуточные фазы и ни одного a VMInit ни VMDeath событие будет отправлено. Большинство JVM OnLoad или живые фазы:
Завершите работу JVM GetEnv (см. JVM ). Избавьтесь от любых ресурсов, сохраненных средой. Потоки, приостановленные этой средой, не возобновляются этим вызовом, это должно быть сделано явно агентом. Память, выделенная этой средой через звонки в JVM Deallocate. Необработанные мониторы, создаваемые этой средой, не уничтожаются, это может быть сделано явно агентом, вызывая DestroyRawMonitor. На состояние потоков, ожидающих на необработанных мониторах, создаваемых этой средой, не влияют. Будут сброшены любые собственные префиксы метода для этой среды; агент должен удалить любые снабженные префиксом собственные методы прежде, чем расположат, вызывается. Оставляются любые возможности, сохраненные этой средой. События, включенные этой средой, больше не будут отправлены, однако в настоящий момент рабочие обработчики событий будут продолжать работать. Предостережение должно быть осуществлено в проекте обработчиков событий, среда которых может быть расположена и таким образом становиться недопустимой во время их выполнения. Эта среда не может использоваться после этого вызова. Этот вызов возвращается к вызывающей стороне.
VM хранит значение указателя, связанное каждой средой. Это значение указателя вызывают локальным для среды хранением. Это значение NULL если не установлено с этой функцией. Агенты могут выделить память, в которой они хранят среду определенная информация. Устанавливая локальное для среды хранение с этим можно тогда получить доступ GetEnvironmentLocalStorage. Вызванный агентом, чтобы установить значение JVM
Указатель, через который значение среды возвращается локальное хранение. Если локальное для среды хранение не было установлено с SetEnvironmentLocalStorage возвращенный указатель NULL.
Возвратите JVM version_ptr. Возвращаемое значение является идентификатором версии. Идентификатор версии включает главную, незначительную и микро версию так же как интерфейсный тип.
Типы Интерфейса версии
Постоянный
Значение
Описание
JVMTI_VERSION_INTERFACE_JNI
0x00000000
Значение JVMTI_VERSION_MASK_INTERFACE_TYPE для JNI.
JVMTI_VERSION_INTERFACE_JVMTI
0x30000000
Значение JVMTI_VERSION_MASK_INTERFACE_TYPE для JVM
Маски версии
Постоянный
Значение
Описание
JVMTI_VERSION_MASK_INTERFACE_TYPE
0x70000000
Маска, чтобы извлечь интерфейсный тип. Значение версии, возвращенной этой функцией, замаскированной с JVMTI_VERSION_MASK_INTERFACE_TYPEвсегда JVMTI_VERSION_INTERFACE_JVMTI так как это - JVM
JVMTI_VERSION_MASK_MAJOR
0x0FFF0000
Маска, чтобы извлечь номер основной версии.
JVMTI_VERSION_MASK_MINOR
0x0000FF00
Маска, чтобы извлечь номер вспомогательной версии.
JVMTI_VERSION_MASK_MICRO
0x000000FF
Маска, чтобы извлечь микро номер версии.
Сдвиги версии
Постоянный
Значение
Описание
JVMTI_VERSION_SHIFT_MAJOR
16
Сдвиг, чтобы извлечь номер основной версии.
JVMTI_VERSION_SHIFT_MINOR
8
Сдвиг, чтобы извлечь номер вспомогательной версии.
Возвратите символьное имя для кода ошибки. Например GetErrorName(env, JVMTI_ERROR_NONE, &err_name) возвратился бы в err_name строка "JVMTI_ERROR_NONE".
По возврату, точкам к ошибочному имени. Имя кодируется как измененная строка UTF-8, но ограничивается подмножеству ASCII. Агент передает указатель на a char*. По возврату, char* точки недавно выделенному массиву. Массив должен быть освобожден с Deallocate.
Хотя самая большая функциональность достигается с информацией о расположении, ссылающейся на индекс байт-кода виртуальной машины, определение jlocation был преднамеренно оставлен неограниченным, чтобы позволить реализации VM, у которых нет этой информации. Эта функция описывает представление jlocation используемый в этом VM. Если возвращенный формат JVMTI_JLOCATION_JVMBCI, jlocations может использоваться в качестве в индексах в массив, возвращенный GetBytecodes.
Перечисление Формата JLocation (jvmtiJlocationFormat)
Постоянный
Значение
Описание
JVMTI_JLOCATION_JVMBCI
1
jlocation значения представляют индексы байт-кода виртуальной машины - то есть, смещения в код виртуальной машины для метода.
JVMTI_JLOCATION_MACHINEPC
2
jlocation значения представляют собственные машинные значения счетчика программы.
JVMTI_JLOCATION_OTHER
0
jlocation у значений есть некоторое другое представление.
По возврату, точкам к идентификатору формата для jlocation значения. Агент передает указатель на a jvmtiJlocationFormat. По возврату, jvmtiJlocationFormat был установлен.
Каждая 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)
Класс был загружен, но еще не подготовлен.
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)
Класс не может быть изменен.
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)
Загрузчик класса не поддерживает эту работу.
Функционально-специализированные Ошибки Агента
Следующие ошибки возвращаются некоторой 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)
Недопустимый класс.
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)
У нового файла класса есть номер версии, не поддерживаемый этим VM.
JVMTI_ERROR_INVALID_CLASS_FORMAT (60)
Новый файл класса уродлив (VM возвратил бы a ClassFormatError).
JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION (61)
Новые определения файла класса привели бы к круговому определению (VM возвратит a ClassCircularityError).
64 битовых значения, представляя монотонно увеличивающуюся исполнимую позицию в пределах метода. -1 указывает на собственный метод. См. GetJLocationFormat для формата на данном VM.
Идентификатор для типа события. См. раздел События для возможных значений. Гарантируется, что будущие версии этой спецификации никогда не будут присваивать нуль как идентификатор типа события.
См. одиночные соревнования для определения функции обратного вызова.
jniNativeInterface
Определение типа для таблицы функции JNI JNINativeInterface определенный в Спецификации JNI. Ссылочная реализация JNI определяет это с помощью подчеркивания.
Агентам можно сообщить о многих событиях, которые происходят в прикладных программах. Чтобы обработать события, определяйте ряд функций обратного вызова с SetEventCallbacks. Для каждого события вызовут соответствующую функцию обратного вызова. Параметры функции обратного вызова обеспечивают дополнительную информацию о событии. Функцию обратного вызова обычно вызывают изнутри потока приложения. JVM
Любое исключение, выданное во время выполнения обратного вызова события, может перезаписать любое текущее исключение на ожидании в текущем потоке приложения. Забота должна быть проявлена, чтобы сохранить исключение на ожидании, когда обратный вызов события выполняет вызов JNI, который мог бы генерировать исключение.
Функции обратного вызова события должны быть повторно используемыми. JVM
Функции обратного вызова события, которые выполняют функцию FindClass JNI, чтобы загрузить классы, должны отметить, что FindClass определяет местоположение загрузчика класса, связанного с текущим собственным методом. В целях загрузки класса обратный вызов события, который включает среду JNI в качестве параметра в обратный вызов, будет обработанный, как будто это - собственный вызов, где собственный метод находится в классе текущего фрейма потока события.
Некоторая JVM Кроме где утверждено иначе, события поставляются на потоке, который вызвал событие. События отправляются в то время, когда они происходят. Спецификация для каждого события включает набор фаз, в которых это может быть отправлено; если действие инициирования события происходит во время другой фазы, никакое событие не отправляется. Поток, который генерирует событие, не изменяет свое состояние выполнения (например, событие не заставляет поток быть приостановленным). Если агент хочет, чтобы событие привело к приостановке, то агент ответственен за явную приостановку потока с SuspendThread. Если событие будет включено в многократных средах, то событие будет отправлено каждому агенту в порядке, что среды создавались.
Включение Событиям
Все события первоначально отключаются. Чтобы получить любое событие:
Если событие требует возможности, та возможность должна быть добавлена с AddCapabilities.
Обратный вызов для события должен быть установлен с SetEventCallbacks.
Во многих ситуациях для многократных событий возможно произойти в том же самом расположении в одном потоке. Когда это происходит, обо всех событиях сообщают посредством обратных вызовов события в порядке, определенном в этом разделе. Если текущее расположение в точке входа метода, MethodEntry о событии сообщают перед любым другим событием в текущем расположении в том же самом потоке. Если выгода исключения была обнаружена в текущем расположении, или потому что это - начало пункта выгоды или собственного метода, который очистил исключение на ожидании, возвратился, exceptionCatch о событии сообщают перед любым другим событием в текущем расположении в том же самом потоке. Если a singleStep событие или breakpoint событие инициировано в текущем расположении, событие определяется, чтобы сразу произойти прежде, чем код в текущем расположении будет выполнен. Об этих событиях сообщают перед любыми событиями, которые инициированы выполнением кода в текущем расположении в том же самом потоке (определенно: exception, fieldAccess, и fieldModification). Если и шаг и событие точки останова инициированы для того же самого потока и расположения, о событии шага сообщают перед событием точки останова. Если текущее расположение является точкой выхода метода (то есть, последнее расположение прежде, чем возвратиться к вызывающей стороне), MethodExit событие и FramePop о событии (если требующийся) сообщают после всех других событий в текущем расположении в том же самом потоке. Нет никакого указанного упорядочивания этих двух событий друг относительно друга. Cо-расположенные события могут быть инициированы во время обработки некоторого другого события агентом в том же самом расположении в том же самом потоке. Если такое событие, типа y, инициировано во время обработки события типа x, и если x предшествует y в упорядочивании, определенном выше, о cо-расположенном событии y сообщают для текущего потока и расположения. Если x не предшествует y, о y не сообщают для текущего потока и расположения. Например, если точка останова устанавливается в текущем расположении во время обработки SingleStep, о той точке останова сообщат прежде, чем поток отъезжает текущее расположение. Следующие события, как никогда полагают, не cо-располагаются с другими событиями.
Структура обратного вызова события ниже используется, чтобы определить функцию-обработчик для событий. Это устанавливается с SetEventCallbacks функция.
Единственные события шага позволяют агенту прослеживать выполнение потока при самой прекрасной гранулярности, позволенной VM. Единственное событие шага сгенерировано всякий раз, когда поток достигает нового расположения. Как правило, единственные события шага представляют завершение одной инструкции VM как определено в Спецификации Виртуальной машины Java™. Однако, некоторые реализации могут определить расположения по-другому. В любом случае method и location параметры однозначно определяют текущее расположение и позволяют отображение на исходный файл и номер строки, когда та информация доступна. Никакие единственные события шага не сгенерированы изнутри собственных методов.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
События точки останова сгенерированы всякий раз, когда поток достигает расположения, определяемого как точка останова с SetBreakpoint. method и location параметры однозначно определяют текущее расположение и позволяют отображение на исходный файл и номер строки, когда та информация доступна.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
События доступа к полю сгенерированы всякий раз, когда поток получает доступ к полю, которое определялось как контрольная точка с SetFieldAccessWatch. method и location параметры однозначно определяют текущее расположение и позволяют отображение на исходный файл и номер строки, когда та информация доступна.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Полевые события модификации сгенерированы всякий раз, когда поток изменяет поле, которое определялось как контрольная точка с SetFieldModificationWatch. method и location параметры однозначно определяют текущее расположение и позволяют отображение на исходный файл и номер строки, когда та информация доступна.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Фрейм появляется, события сгенерированы на выход от единственного метода в единственном фрейме как определено в звонке NotifyFramePop. Это - истина, вызывается ли завершение, выполняя его инструкцию возврата или выдавая исключение к его вызывающей стороне (см. was_popped_by_exception). Однако, фрейм появляется вызванный PopFrame о функции не сообщают. Расположение, о котором сообщают GetFrameLocation идентифицирует исполнимое расположение в методе возврата, сразу до возврата.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
События записи метода сгенерированы после записи методов языка программирования Java (включая собственные методы). Расположение, о котором сообщают GetFrameLocation идентифицирует начальное исполнимое расположение в методе. Включение записи метода или событиям выхода значительно ухудшит производительность на многих платформах и таким образом не советуется для производительности критическое использование (такое как профилирование). Инструментарий байт-кода должен использоваться в этих случаях.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
События выхода метода сгенерированы на выход от методов языка программирования Java (включая собственные методы). Это - истина, вызывается ли завершение, выполняя его инструкцию возврата или выдавая исключение к его вызывающей стороне (см. was_popped_by_exception). method поле однозначно определяет метод, из которого, вводимый или выходят. frame поле обеспечивает доступ к стековому фрейму для метода. Расположение, о котором сообщают GetFrameLocation идентифицирует исполнимое расположение в методе возврата сразу до возврата. Включение записи метода или событиям выхода значительно ухудшит производительность на многих платформах и таким образом не советуется для производительности критическое использование (такое как профилирование). Инструментарий байт-кода должен использоваться в этих случаях.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Событие Native Method Bind отправляется, когда VM связывает язык программирования Java собственный метод с адресом функции, которая реализует собственный метод. Это произойдет, когда собственный метод вызовут впервые и также происходит, когда JNI функционирует RegisterNatives вызывается. Это событие позволяет связыванию быть перенаправленным к определенной агентом функции прокси. Это событие не отправляется, когда собственный метод несвязанный. Как правило, эта функция прокси должна будет быть определенной для определенного метода или, чтобы обработать общий случай, автоматически сгенерированный код блока, так как после кода инструментария выполняется, функция в исходном обязательном адресе будет обычно вызываться. Исходная привязка может быть восстановлена или перенаправление, измененное при помощи функции JNI RegisterNatives. Некоторые события могут быть отправлены во время исконной фазы, JNI и большей части JVM
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Адрес VM собирается связать с - то есть, адрес реализации собственного метода
new_address_ptr
void**
если адрес, на который ссылаются, изменяется (то есть, если *new_address_ptr устанавливается), привязка будет вместо этого сделана к предоставленному адресу.
События исключения сгенерированы всякий раз, когда исключение сначала обнаруживается в методе языка программирования Java. Где "исключение" означает любого java.lang.Throwable. Исключение, возможно, было выдано языком программирования Java или собственным методом, но в случае собственных методов, событие не сгенерировано, пока исключение сначала не замечается методом языка программирования Java. Если исключение устанавливается и очищается в собственном методе (и таким образом никогда не видимо к коду языка программирования Java), никакое событие исключения не сгенерировано. method и location параметры однозначно определяют текущее расположение (где исключение было обнаружено), и позвольте отображение на исходный файл и номер строки, когда та информация доступна. exception поле идентифицирует брошенный объект исключения. catch_method и catch_location идентифицируйте расположение пункта выгоды, если таковые вообще имеются, который обрабатывает выданное исключение. Если нет такого пункта выгоды, каждое поле устанавливается в 0. Нет никакой гарантии, что поток будет когда-либо достигать этого пункта выгоды. Если есть собственные методы на стеке вызовов между расположением броска и пунктом выгоды, исключение может быть сброшено одним из тех собственных методов. Точно так же исключения, о которых сообщают как непойманные (catch_klass и др. набор к 0) может фактически быть пойман собственным кодом. Агенты могут проверить на эти возникновения, контролируя ExceptionCatch события. Отметьте, что наконец пункты реализуются как выгода и перебросок. Поэтому о них сообщат в расположении выгоды.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
События выгоды исключения сгенерированы всякий раз, когда выданное исключение поймано. Где "исключение" означает любого java.lang.Throwable. Если исключение поймано в методе языка программирования Java, событие сгенерировано, когда пункт выгоды достигается. Если исключение поймано в собственном методе, событие сгенерировано, как только управление возвращается к методу языка программирования Java. События выгоды исключения сгенерированы для любого исключения, для которого бросок был обнаружен в методе языка программирования Java. Отметьте, что наконец пункты реализуются как выгода и перебросок. Поэтому они генерируют события выгоды исключения. method и location параметры однозначно определяют текущее расположение и позволяют отображение на исходный файл и номер строки, когда та информация доступна. Для исключений, пойманных в методе языка программирования Java, exception объект идентифицирует объект исключения. Исключения, пойманные в собственных методах, не обязательно доступны к тому времени, когда о выгоде исключения сообщают, таким образом, exception поле устанавливается в NULL.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Поток запускается, события сгенерированы новым потоком прежде, чем его начальный метод выполнится. Поток может быть перечислен в массиве, возвращенном GetAllThreads перед его потоком запускаются, событие сгенерировано. Для других событий возможно быть сгенерированным на потоке прежде, чем его поток запустит событие. Событие пересылается недавно запущенный thread.
События конца потока сгенерированы завершающимся потоком после того, как его начальный метод закончил выполнение. Поток может быть перечислен в массиве, возвращенном GetAllThreads после того, как его событие конца потока сгенерировано. Никакие события не сгенерированы на потоке после его события конца потока. Событие отправляется на смерти thread.
Событие загрузки класса сгенерировано, когда класс сначала загружается. Порядок событий загрузки класса, сгенерированных определенным потоком, как гарантируют, будет соответствовать порядок класса, загружающегося в пределах того потока. Создание класса массива не генерирует событие загрузки класса. Создание примитивного класса (например, java.lang. Целое число. ВВЕДИТЕ), не генерирует событие загрузки класса. Это событие отправляется на ранней стадии в загрузке класса. В результате класс должен использоваться тщательно. Отметьте, например, что методы и поля еще не загружаются, таким образом, запросы для методов, поля, подклассы, и так далее не будут давать корректные результаты. См. "Загрузку Классов и Интерфейсов" в Спецификации языка Java. Поскольку большинство имеет целью ClassPrepare событие будет более полезным.
Класс готовится, событие сгенерировано, когда подготовка к классу полна. В этой точке поля класса, методы, и реализованные интерфейсы доступны, и никакой код от класса не был выполнен. Так как у классов массива никогда нет полей, или методы, класс готовится, события не сгенерированы для них. Класс готовится, события не сгенерированы для примитивных классов (например, java.lang.Integer.TYPE).
Это событие отправляется, когда VM получает данные файла класса, но прежде, чем это создаст представление в памяти для того класса. Это событие также отправляется, когда класс изменяется RetransformClasses функционируйте или RedefineClasses функция, вызванная в любом инструментарии байт-кода JVM для информации об использовании. Это событие может быть отправлено прежде, чем VM инициализируется (исконная фаза). В это время никакие ресурсы VM не должны быть созданы. Некоторые классы не могли бы быть совместимыми с функцией (eg. Классы ROMized), и это событие не будет сгенерировано для этих классов. Агент должен выделить место для измененного буфера данных файла класса, используя функцию выделения памяти Allocate потому что VM ответственен за освобождение нового использования буфера данных файла класса Deallocate. Отметьте это Allocate разрешается во время исконной фазы. Если агент хочет изменить файл класса, он должен установить new_class_data указать на недавно инструментованный буфер данных файла класса и установить new_class_data_len к длине того буфера прежде, чем возвратиться из этого вызова. Если никакая модификация не требуется, агент просто не устанавливает new_class_data. Если многократные агенты включили этому событию, результаты объединяются в цепочку. Таким образом, если new_class_data был установлен, это становится class_data для следующего агента. Порядок, который это событие отправляется каждой среде, отличается от других событий. Это событие отправляется средам в следующем порядке:
Загрузчик класса, загружающий класс. NULL если загрузчик класса начальной загрузки.
name
const char*
Имя класса, загружаемого как внутреннее полностью определенное имя VM (например, "java/util/List"), закодированный как измененная строка UTF-8. Отметьте: если класс определяется с помощью a NULL имя или без определенного имени, name будет NULL.
Событие инициализации VM сигнализирует запуск VM. В это время JNI жив, но VM полностью еще не инициализируется. Как только это событие сгенерировано, агент свободен вызвать любую функцию JNI. Это событие сигнализирует начало фазы запуска, JVM В случае отказа запуска VM не будет отправлено это событие.
Событие инициализации VM сигнализирует завершение инициализации VM. Как только это событие сгенерировано, агент свободен вызвать любой JNI или JVM В случае отказа запуска VM не будет отправлено это событие.
Смертельное событие VM уведомляет агент завершения VM. Никакие события не будут иметь место после события VMDeath. В случае отказа запуска VM не будет отправлено это событие. Отметьте, что Agent_OnUnload все еще вызовут в этих случаях.
Отправленный, когда метод компилируется и загружается в память VM. Если это разгружается, CompiledMethodUnload событие отправляется. Если это перемещается, CompiledMethodUnload событие отправляется, сопровождается новым CompiledMethodLoad событие. Отметьте, что у единственного метода могут быть многократные скомпилированные формы, и что это событие будет отправлено за каждой формой. Отметьте также, что несколько методов могут быть встроены в единственное адресное пространство, и что это событие будет отправлено за каждым методом. Эти события могут быть отправлены после их начального возникновения с GenerateEvents.
Соответствующее расположение. См. GetJLocationFormat для значения расположения.
Возможности
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Карта от собственных адресов до расположения. Собственное адресное пространство каждой записи от start_address к start_address-1 из следующей записи. NULL если отображение информации не может быть предоставлено.
compile_info
const void*
Информация о компиляции VM-specific. Информацией о компиляции, на которую ссылаются, управляет VM и не должна зависеть от агента для набора. Реализация VM определяет контент и время жизни информации.
Отправленный, когда скомпилированный метод разгружается из памяти. Это событие не могло бы быть отправлено на потоке, который выполнял разгружение. Это событие может быть отправлено когда-то после того, как разгружение происходит, но будет отправлено прежде, чем память снова используется недавно сгенерированным скомпилированным методом. Это событие может быть отправлено после того, как класс разгружается.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Скомпилированный разгружаемый метод. Для идентификации скомпилированного метода только - может быть разгружен класс, и поэтому метод не должен использоваться в качестве параметра дальнейшему JNI или JVM
code_addr
const void*
Адрес, где скомпилированный код метода был загружен. Для идентификации скомпилированного метода только - возможно, было исправлено пространство.
Отправленный, когда компонент виртуальной машины сгенерирован динамически. Это не соответствует коду языка программирования Java, который компилируется - см. CompiledMethodLoad. Это для собственного кода - например, интерпретатор, который сгенерирован по-другому в зависимости от параметров командной строки. Отметьте, что у этого события нет никакой возможности управления. Если VM не может генерировать эти события, он просто не отправляет никому. Эти события могут быть отправлены после их начального возникновения с GenerateEvents.
Отправленный VM, чтобы запросить агент вывести свои данные. Это - только подсказка, и агент не должен реагировать на это событие. Это полезно для обработки сигналов командной строки от пользователей. Например, в Java 2 SDK CTRL-Break на Win32 и CTRL-\на Солярисе заставляют VM отправлять это событие агенту.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Отправленный, когда ресурс VM, необходимый рабочему приложению, был исчерпан. За исключением необходимого дополнительными возможностями, набор ресурсов, которые сообщают об исчерпании, является зависящим от реализации. Следующие битовые флаги определяют свойства исчерпания ресурса:
Флаги Исчерпания ресурса
Постоянный
Значение
Описание
JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR
0x0001
После этого события возвраты VM бросит a java.lang.OutOfMemoryError.
JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP
0x0002
VM был неспособен выделить память от "кучи" платформы JavaTM. "Куча" является областью данных времени выполнения, от которой выделяется память для всех экземпляров класса и массивов.
Отправленный то, когда метод заставляет виртуальную машину выделять Объект, видимый коду языка программирования Java и выделению, не обнаруживаемо другими intrumentation механизмами. Обычно объектное выделение должно быть обнаружено, инструментуя байт-коды выделения методов. Объектное выделение, сгенерированное в собственном коде вызовами функции JNI, должно быть обнаружено, используя перехват функции JNI. Некоторые методы, возможно, не связали байт-коды и не являются собственными методами, они вместо этого выполняются непосредственно VM. Эти методы должны отправить это событие. Виртуальные машины, которые неспособны к инструментарию байт-кода для некоторых или всех их методов, могут отправить это событие. Типичные примеры, куда это событие могло бы быть отправлено:
Отражение - например, java.lang.Class.newInstance()
Методы, не представленные байт-кодами - например, VM intrinsics и J2ME предварительно загруженные классы
Случаи, где это событие не было бы сгенерировано:
Выделение из-за байт-кодов - например, new и newarray Инструкции VM
Выделение из-за вызовов функции JNI - например, AllocObject
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Объектное Бесплатное мероприятие отправляется, когда сборщик "мусора" освобождает объект. События только отправляются за теговыми объектами - см. функции "кучи". Обработчик событий не должен использовать функции JNI и не должен использовать JVM
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Событие Garbage Collection Start отправляется, когда пауза сборки "мусора" начинается. Только остановитесь - о мировых наборах сообщают - то есть, наборы, во время которых все потоки прекращают изменять состояние виртуальной машины Java. Это означает, что некоторые коллекторы никогда не будут генерировать эти события. Это событие отправляется, в то время как VM все еще останавливается, таким образом обработчик событий не должен использовать функции JNI и не должен использовать JVM Это событие всегда отправляется как соответствующая пара с GarbageCollectionFinish (принимающий оба события включаются), и никакие события сборки "мусора" не будут иметь место между ними.
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Событие Garbage Collection Finish отправляется, когда пауза сборки "мусора" заканчивается. Это событие отправляется, в то время как VM все еще останавливается, таким образом обработчик событий не должен использовать функции JNI и не должен использовать JVM Некоторые агенты, возможно, должны сделать операции сборки "мусора" сообщения, которые требуют использования отвергнутой JVM Это событие всегда отправляется как соответствующая пара с GarbageCollectionStart (принимающий оба события включаются).
Дополнительная Функциональность: не мог бы быть реализован для всех виртуальных машин. Следующая возможность (как возвращено GetCapabilities) должна быть истина, чтобы использовать это событие.
Добавьте добавленные функции профилирования "кучи": получите/установите аннотацию, выполните итерации живых объектов/"кучи". Добавьте "кучу", профилирующую добавленного заполнителя функций: корни "кучи". Событие профилирования "кучи" добавило: свободный объект. Событие профилирования "кучи" перепроектировало: 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).
Константы изменения, таким образом, они находятся под 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 возвратите НУЛЬ для загрузчика класса начальной загрузки. Добавить 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. Не у живых потоков должен быть различный ошибочный возврат чем недопустимый поток.
Технические исправления Отдела Публикаций. Позвольте поток и среду, которую устанавливает в NULL локальное хранение, чтобы быть.
v75 23 июля 2003
Используйте новый Agent_OnLoad, а не перегруженный JVM_OnLoad. Добавьте JNICALL к обратным вызовам (XSL). Документ требование JNICALL и для событий и для обратных вызовов (XSL). Ограничьте RedefineClasses методами и атрибутами. Игнорируйте событие VerboseOutput. VMObjectAlloc: ограничьте, когда событие отправляется, и удалите параметр метода. Конец свободные концы от Технического редактирования Пабов.
v76 24 июля 2003
Событие ClassFileLoadHook изменения, чтобы отправить класс вместо булевской переменной пересматривает.
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
Документ, что значения наносекунды таймера без знака. Разъясните текст, имеющий отношение к собственным методам.
Добавьте JVMTI_ERROR_MUST_POSSESS_CAPABILITY к SetEventNotificationMode.
0.3.12 8 марта 2004
Разъясненный CompiledMethodUnload так, чтобы это было четким событие, может быть отправлен после того, как класс был разгружен.
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
Создание класса массива не генерирует событие загрузки класса.
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
Разъяснения для перепреобразования, на анализ. Привяжите "перепреобразование, способное" во время включения загрузки класса.
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 () должен возвратить ошибку на массиве или примитивном классе.
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.