logo

한국어

출처: https://www.hunskorea.com/docs/ko/platform/jvmti/jvmti.html

JavaTM Virtual Machine Tool Interface

Version 1.1

 


 

 

JVMTI 란

JavaTM Virtual Machine Tool Interface (JVM TI)는, 개발툴이나 감시 툴로 사용되는 프로그래밍 인터페이스입니다. JVMTI 는, JavaTM 가상 머신 (VM)으로 동작하는 어플리케이션 상태 검사와 실행 제어의 양쪽 모두의 기능을 제공해,

 

프로 파일링 툴, 디버그 툴, 감시 툴, thread 분석 툴, 커버리지(coverage) 분석 툴 등, VM 상태 그 외에 액세스 할 필요가 있는 각종 툴의 VM 인터페이스로서 기능합니다.

 

JVMTI 는, JavaTM 가상 머신의 모든 구현으로 사용할 수 있다고는 할 수 없습니다.

 

JVM TI 는, 쌍방향의 인터페이스입니다. 이하에서는, JVM TI 의 클라이언트를 「에이전트」라고 부릅니다. 에이전트는,이벤트로부터, 다양한 상태의 발생 통지를 받을 수가 있습니다. JVM TI 는, 이벤트에 응답해, 또는 이벤트로부터는 독립해, 많은함수를 사용해 어플리케이션에의 조회 및 제어를 실행할 수 있습니다.

 

개개의 에이전트는 동일한 프로세스로 실행되어 검사 대상의 어플리케이션을 실행하는 가상 머신과 직접 통신합니다. 이 통신에는, 네이티브 인터페이스 (JVM TI)가 사용됩니다. 네이티브의 인 프로세스 인터페이스에 의해, 툴측에게로의 침입은 최소한으로 억제하면서, 최대한의 제어가 가능하게 됩니다. 일반적으로, 에이전트는 비교적 컴팩트합니다. 에이전트는, 타겟 어플리케이션의 일반적으로의 실행을 방해하는 일 없이, 툴의 기능의 대부분을 구현하는 다른 프로세스에 의해 제어할 수 있습니다.

아키텍쳐(architecture)

툴에의 기입은, JVM TI 를 사용해 직접 행해지는지, Java 플랫폼 툴 아키텍쳐(architecture)의 고도 인터페이스를 사용해 간접적으로 행해집니다. Java Platform Debugger Architecture 에는, JVM TI 외에, 보다 높은 레벨의 아웃 프로세스 디버거 인터페이스도 포함되어 있습니다. 많은 툴에는, JVM TI 보다 높은 레벨의 인터페이스가 적합합니다. Java Platform Debugger Architecture 의 상세한 것에 대하여는,Java Platform Debugger Architecture 의 Web 사이트를 참조해 주세요.

에이전트의 작성

에이전트의 작성에는, 각종 규칙과 C/C++ 의 정의를 호출하는 C 언어를 지원하는 임의의 네이티브 언어를 사용할 수 있습니다.

 

JVM TI 를 사용하기 위해서 필요한 함수, 이벤트, 데이터형, 정수의 정의는, 인클루드 파일 jvmti.h 로 정의됩니다. 이러한 정의를 사용하려면 , J2SETM 인클루드 디렉토리를 인클루드 패스에 추가해,

#include <jvmti.h>
    

(을)를 원시 코드에 추가해 주세요.

에이전트의 배치

에이전트는 플랫폼 고유의 방법으로 배치됩니다만, 일반적으로은 그 플랫폼에서 다이나믹 라이브러리에 상당하는 것이 됩니다. 예를 들어, WindowsTM operating system의 경우, 에이전트 라이브러리는 「동적 링크 라이브러리」(DLL)이 됩니다. SolarisTM 오퍼레이팅(operating) 환경의 경우, 에이전트 라이브러리는 공유 객체 (. so 파일)이 됩니다.

 

VM 기동시에 에이전트를 기동하려면 ,커멘드행 옵션을 사용해 에이전트 라이브러리의 이름을 지정합니다. 구현에 따라서는, 라이브단계에서에이전트를 기동하는 기구를 지원하고 있을 가능성이 있습니다. 그 기동 방법의 자세한 것은, 구현에 고유가 됩니다.

JVMTI 에이전트의 커멘드행 옵션

이하의 「커멘드행 옵션」이라고 하는 말은, JNI 호출 API 의 JNI_CreateJavaVM 함수에 대해,JavaVMInitArgs 인수로 지정되는 옵션을 의미합니다.

 

에이전트를 적절히 로드해 실행하려면 , VM 의 기동시에 다음의 몇개의 커멘드행 옵션이 필요합니다. 이러한 인수는, 에이전트를 포함한 라이브러리와 기동시에게 건네지는 옵션의 캐릭터 라인을 지정합니다.

-agentlib:<agent-lib-name>=<options>
-agentlib: 의 뒤에는, 로드하는 라이브러리의 이름을 지정합니다. 라이브러리의 풀네임과 장소의 검색 방법은, 플랫폼에 따라서 다릅니다. 일반적으로,<agent-lib-name> 는, operating system 고유의 파일명에 전개됩니다. (은)는, 기동시에 에이전트에게 건네집니다. 예를 들어, 옵션 -agentlib:foo=opt1, opt2 가 지정되었을 경우, VM 는, WindowsTM 에서는 시스템 패스 PATH 로부터 공유 라이브러리 foo.dll 를 로드하려고 합니다. SolarisTM 오퍼레이팅(operating) 환경에서는,LD_LIBRARY_PATH 로부터 libfoo.so 를 로드하려고 합니다.
-agentpath:<path-to-agent>=<options>
-agentpath: 의 뒤에는, 라이브러리를 로드하는 절대 패스를 지정합니다. 라이브러리명의 전개는 행해지지 않습니다. (은)는, 기동시에 에이전트에게 건네집니다. 예를 들어, 옵션 -agentpath:c:\myLibs\foo.dll=opt1, opt2 가 지정되었을 경우, VM 는, 공유 라이브러리 c:\myLibs\foo.dll 를 로드하려고 합니다.

라이브러리내의 기동 루틴 Agent_OnLoad 가 불려 갑니다.

 

바이트코드Instrumentation (bytecode instrumentation) 을 위해서(때문에) 필요한 경우, 툴내에서 Java 프로그램 언어 코드를 사용하기 쉽게하기 위해(때문에),-agentlib: 또는 -agentpath: 를 지정해 로드 된 라이브러리로부터, JNI 네이티브 메소드 구현이 검색됩니다.

 

에이전트 라이브러리는, 그 외의 모든 라이브러리가 검색된 뒤 검색됩니다. 비에이전트 메소드의 네이티브 메소드 구현을 덧쓰기 또는 차단하는 에이전트는,NativeMethodBind 이벤트를 사용할 수 있습니다.

 

이러한 스윗치는, 상기의 처리만을 실시합니다. VM 나 JVM TI 상태를 변경할 것은 없습니다. JVM TI 나 JVM TI 의 일부를 유효하게 하는 처리는,권한 (capability) 에 의해, 프로그램을 통해 행해집니다. 커멘드행 옵션은 필요 없습니다.

에이전트의 기동

VM 는, 기동 함수를 호출하는 것으로 각 에이전트를 기동합니다. OnLoad 단계에서 에이전트를 기동하는 경우는, 함수 Agent_OnLoad 가 불려 갑니다. 라이브단계에서 에이전트를 기동하는 경우는, 함수 Agent_OnAttach 가 불려 갑니다. 기동 함수의 호출은, 에이전트 마다 1 회만 행해집니다.

에이전트의 기동 (OnLoad 단계)

OnLoad 단계에서 에이전트를 기동하는 경우, 그 에이전트 라이브러리는 다음의 prototype를 가지는 기동 함수를 export 할 필요가 있습니다.

JNIEXPORT jint JNICALL
Agent_OnLoad(JavaVM *vm, char *options, void *reserved)

VM 는, 이 함수를 호출하는 것으로 에이전트를 기동합니다. 이 호출은 VM 초기화의 빠른 단계에서 행해지기 (위해)때문에, 다음 일을 말할 수 있습니다.

  • 시스템 프로퍼티은,VM 의 기동으로 사용되기 전으로 설정할 수 있다
  • 모든권한을 사용할 수 있다 (다만, VM 를 구성하는 권한은 이 때 밖에 사용할 수 없다. 자세한 것은「권한 함수」섹션을 참조)
  • 바이트 코드가 실행되어 있지 않다
  • 클래스가 로드되어 있지 않다
  • 객체가 작성되어 있지 않다

 

VM 는, 2 번째의 인수로서 를 지정해 Agent_OnLoad 함수를 호출합니다. 즉, 커멘드행 옵션의 예를 사용해,"opt1, opt2"Agent_OnLoadchar *options 인수에게 건네집니다. options 인수는,수정 UTF-8 캐릭터 라인으로서 encode 됩니다. = 하지만 지정되어 있지 않은 경우,options 에는 길이 0 의 캐릭터 라인이 건네받습니다. options 캐릭터 라인은,Agent_OnLoad 호출동안 유효합니다. 필요한 경우는, 이 기간이 지나도, 캐릭터 라인 또는 캐릭터 라인의 일부를 카피할 필요가 있습니다. Agent_OnLoad 가 불려 가고 나서 종료할 때까지의 기간을 「로드 단계」라고 부릅니다. VM 는 로드단계에서는 초기화되지 않습니다. 이 때문에,Agent_OnLoad 내부에서 허가된 조작은 한정되고 있습니다 (이 시점에서 사용 가능한 기능에 대해서는 함수의 설명을 참조). 에이전트를 안전하게 실행할 수 있는 것은, 옵션의 처리나,SetEventCallbacks 를 사용해 이벤트 콜백을 설정하는 처리입니다. VM 초기화 이벤트를 받고 나서 (즉,VMInit 콜백이 불려 가고 나서), 에이전트는 초기화를 완료할 수 있습니다.

원리의 설명: 빠른 단계에서의 기동이 필요한 것은, 에이전트가 필요한 권한을 설정할 수 있도록(듯이) 하기 (위해)때문에입니다. 많은 권한은, VM 의 초기화전으로 설정할 필요가 있습니다. JVMDI 에서는, -Xdebug 커멘드행 옵션으로 권한을 제어할 수 있었습니다. 다만, 이 제어는 매우 대범한 것입니다. JVMPI 구현은, 다양한 테크닉을 사용해 단일의 「JVMPI 온」스윗치를 제공합니다. 필요한 권한과 퍼포먼스에의 영향의 밸런스를 취하기 위해서(때문에) 필요한 세세한 제어를 제공하는데 적합한 커멘드행 옵션은 없습니다. 빠른 단계에서의 기동에는, 에이전트가 각종 기능을 인스톨 하기 위한(해), 파일 시스템이나 시스템 프로퍼티으로 변경을 더해 실행 환경을 제어할 수 있도록(듯이) 하는 목적도 있습니다.

 

Agent_OnLoad 의 반환값은, 에러를 나타내기 위해서(때문에) 사용됩니다. 제로 이외의 값은 에러를 나타냅니다. 에러가 발생하면(자), VM 는 종료합니다.

에이전트의 기동 (라이브 단계)

VM 에 따라서는, 그 VM 내에서 라이브단계에서 에이전트를 기동하는 기구를 지원하고 있을 가능성이 있습니다. 그 지원 방법의 자세한 것은, 구현에 고유가 됩니다. 예를 들어, 어느 툴에서는, 하등의 플랫폼 고유의 기구나 구현 고유의 API 를 사용하는 것으로, 실행중의 VM 에 접속해 특정의 에이전트의 기동을 요구할 가능성이 있습니다.

 

라이브 단계에서 에이전트를 기동하는 경우, 그 에이전트 라이브러리는 다음의 prototype를 가지는 기동 함수를 export 할 필요가 있습니다.

JNIEXPORT jint JNICALL
Agent_OnAttach(JavaVM* vm, char *options, void *reserved)

 

VM 는, 이 함수를 호출하는 것으로 에이전트를 기동합니다. 이 호출은, VM 에 접속된 thread의 문맥내에서 행해집니다. 제 1 인수의 것 은, Java VM 입니다. 인수는, 에이전트로 지정된 기동 옵션입니다. (은)는,수정 UTF-8 캐릭터 라인으로서 encode 됩니다. 기동 옵션이 지정되지 않았던 경우,options 에는 길이 0 의 캐릭터 라인이 건네받습니다. options 캐릭터 라인은,Agent_OnAttach 호출동안 유효합니다. 필요한 경우는, 이 기간이 지나도, 캐릭터 라인 또는 캐릭터 라인의 일부를 카피할 필요가 있습니다.

 

라이브 단계에서는권한의 일부를 사용할 수 없을 가능성이 있습니다.

 

Agent_OnAttach 함수는, 에이전트를 초기화해, 에러가 발생했는지의 여부를 나타내는 값을 VM 에 돌려줍니다. 제로 이외의 값은 모두, 에러를 나타냅니다. 에러가 발생해도 VM 는 종료하지 않습니다. 대신에 VM 는, 그 에러를 무시하는지, 그 에러를 표준 에러에 출력하거나 시스템 로그에 기록하거나 하는 등, 하등의 구현 고유의 액션을 실행합니다.

에이전트의 정지

라이브러리는, 옵션으로, 다음의 prototype를 가지는 정지 함수를 export 할 수 있습니다.

JNIEXPORT void JNICALL
Agent_OnUnload(JavaVM *vm)

이 함수는, 라이브러리의 언로드의 직전에 VM 에 의해 불려 갑니다. 플랫폼 고유의 기구에 문제가 있는 경우, 언로드가 일으켜져 이 함수가 불려 갑니다 (본서에서는 언로드 기구는 지정하지 않는다). 정상적인 처리 혹은 VM 의 장해 (기동시의 장해를 포함한다)에 의해 VM 가 종료되었을 경우, 라이브러리는 실제로 언로드됩니다. 물론, 제어할 수 없는 정지는, 이 규칙에 들어맞지 않습니다. 이 함수와 VM Death 이벤트에는 차이가 있습니다. VM Death 이벤트를 송신하기 위해서는, 초기화전에 VM 를 실행했던 적이 있어, VMDeath 의 콜백을 설정한 유효한 JVM TI 환경이 존재해, 이벤트가 유효하게 되어 있을 필요가 있습니다. 이러한 조건은,Agent_OnUnload 에는 불필요합니다. 이 함수는, 라이브러리가 그 외의 이유에 의해 언로드되었을 때도 불려 갑니다. VM Death 이벤트는, 이 함수가 불려 가기 전에 송신됩니다 (이 함수가 VM 의 종료에 의해 불려 가는 경우). 이 함수를 사용해, 에이전트에 의해 할당할 수 있었던 자원을 클린 업 할 수가 있습니다.

JAVA_TOOL_OPTIONS

매입 VM 나 단지 스크립트내의 깊은 장소에서 기동되는 VM 등에서는, 커멘드행의 액세스나 변경이 항상 가능하다라고는 한정되지 않기 때문에,JAVA_TOOL_OPTIONS 변수가 준비되어 있습니다. 이것을 사용하면, 그러한 경우에서도 에이전트를 기동할 수 있습니다.

 

환경 변수나 그 외의 이름 첨부 캐릭터 라인을 지원하는 플랫폼에서는,JAVA_TOOL_OPTIONS 변수에 대응하고 있는 경우가 있습니다. 이 변수는, 옵션을 공백 문자로 단락지은 캐릭터 라인입니다. 공백 문자에는, 스페이스, 탭, 복귀 (CR), 복귀 개행 (NL), 수직 탭, 용지 보내 (FF)등이 있습니다. 연속하는 공백 문자는 공백 문자 1 문자와 같다라고 보입니다. 옵션에 공백 문자를 포함하는 경우는, 인용부호로 다음과 같이 둘러싸 주세요.

  • 홑겹 인용부호의 조 ('')에 둘러싸인, 홑겹 인용부호를 제외한 모든 문자는 인용으로서 둘러싸인다.
  • 홑겹 인용부호의 조의 내부에 있는 이중 인용부호에는, 특수한 의미는 없다.
  • 이중 인용부호의 조 ('')에 둘러싸인, 이중 인용부호를 제외한 모든 문자는 인용으로서 둘러싸인다.
  • 이중 인용부호의 조의 내부에 있는 홑겹 인용부호에는, 특수한 의미는 없다.
  • 변수내의 임의의 장소를 인용부호로 둘러쌀 수가 있다.
  • 인용부호로 둘러싸인 공백 문자에는, 특수한 의미는 없다. 그 외의 문자와 같게 옵션에 포함할 수가 있어 단락 문자로서 기능하지 않는다.
  • 인용부호의 조자체는 옵션에 포함되지 않는다.

JNI_CreateJavaVM (JNI 호출 API 내)는, 이러한 옵션을 그 JavaVMInitArgs 인수로 지정된 옵션의 선두에 부가합니다. 플랫폼에 따라서는, 시큐리티상의 이유로써 이 기능을 무효로 하고 있습니다. 예를 들어 레퍼런스 구현에서는, 유효한 사용자 또는 그룹의 ID 가 실제의 ID 와 다른 경우에, Unix 시스템상에서 이 기능이 무효가 됩니다. 이 기능은 툴의 초기화, 특히 네이티브 또는 Java 프로그램 언어 에이전트의 기동을 지원하기 위한의 것입니다. 복수의 툴로 이 기능을 사용할 가능성이 있습니다. 그 때문에, 변수는 덧쓰기하지 않고, 옵션을 변수에 추가하도록 해 주세요. 변수가 처리되는 것은 JNI 호출 API 의 VM 작성 호출시이기 (위해)때문에, 기동측이 처리하는 옵션 (VM 선택 옵션등)은 다루어지지 않습니다.

JVMTI 환경

JVM TI 스펙은, 동시에 복수의 JVM TI 에이전트를 사용하는 것을 허가합니다. 각 에이전트에는 고유의 JVM TI 환경을 할당할 수 있습니다. 즉, JVM TI 상태는 에이전트 마다 차이가 납니다. 어느 환경으로 변경을 더해도, 그 외의 환경에 영향은 없습니다. JVM TI 환경에는, 다음 상태가 있습니다.

JVM TI 상태는 독립하고 있습니다만, 에이전트는 VM 의 공유 상태를 검사해, 변경합니다. 또, 에이전트가 실행되는 네이티브 환경을 공유합니다. 이 때문에, 어느 에이전트가 그 외의 에이전트의 실행 결과에 영향을 미치거나 그 외의 에이전트의 실패의 원인이 되는 일이 있습니다. 에이전트의 작성자에게는, 이 에이전트와 그 외의 에이전트와의 호환성의 레벨을 지정할 책임이 있습니다. JVM TI 구현은, 에이전트간의 악영향을 막을 수 없습니다. 이러한 문제의 발생을 막는 기술에 대해서는, 본서에서는 설명하지 않습니다.

 

에이전트는, JNI 호출 API 함수 GetEnv 에 인터페이스 ID 로서 JVM TI 의 버젼 정보를 건네주는 것에 의해, JVM TI 환경을 작성합니다. JVM TI 환경의 작성과 사용의 상세한 것에 대하여는,「JVM TI 함수의 액세스」를 참조해 주세요. 일반적으로, JVM TI 환경은,Agent_OnLoad 로부터 GetEnv 를 호출하는 것에 의해 작성됩니다.

바이트코드Instrumentation

이 인터페이스는, 프로 파일링을 지원하는 인터페이스로 발생하는 이벤트의 일부를 포함하지 않습니다. 해당하는 이벤트로서 객체 할당 이벤트나 풀 스피드 메소드 입력/출력 이벤트가 있습니다. 이 인터페이스는, 타겟 프로그램을 구성하는 Java 가상 머신의 바이트 코드 명령을 변경하는 「바이트코드Instrumentation (bytecode instrumentation)」기능을 지원합니다. 일반적으로, 이러한 변경에서는, 메소드의 코드에 「이벤트」가 추가됩니다. 예를 들어, 메소드의 선두에,MyProfiler.methodEntered() 의 호출이 추가됩니다. 변경은 순수하게 추가이기 (위해)때문에, 어플리케이션 상태나 동작을 변경할 필요는 없습니다. 삽입되는 에이전트 코드는 표준 바이트 코드이므로, VM 를 풀 스피드로 실행할 수 있습니다. 이 때문에, 타겟 프로그램 뿐만이 아니라, Instrumentation도 최적화됩니다. Instrumentation에 바이트 코드의 실행으로부터의 변환이 포함되지 않는 경우, 효율이 나쁜 상태의 변환은 불필요합니다. 결과적으로, 이벤트의 퍼포먼스는 높아집니다. 이 방법에서는, 에이전트를 완전하게 제어할 수 있습니다. Instrumentation은, 코드의 「중요한」부분 (최종 사용자의 코드등)에 한정 가능해, 조건부로 할 수 있습니다. Instrumentation은, 완전하게 Java 프로그램 언어 코드내에서 실행할 수 있습니다. 또는, 네이티브 에이전트내에서 호출할 수도 있습니다. Instrumentation은, 카운터를 보관 유지할 뿐(만큼)의 설정으로 해도, 이벤트의 통계 샘플을 취하는 설정으로 해도 괜찮습니다.

 

Instrumentation의 삽입은, 다음의 3 으로 우리 가운데 몇개의 방법으로 실시합니다.

  • 정적 Instrumentation: 클래스 파일은 VM 에 로드하기 전에 계측 됩니다. 이 때문에, 예를 들어, Instrumentation을 추가하기 위해서 변경되었다 *. class 파일의 중복 디렉토리를 작성할 수 있습니다. 이 방법은 매우 귀찮습니다. 일반적으로, 에이전트는 로드 되는 클래스 파일의 출처(소)를 인식하지 않습니다.
  • 로드시의 Instrumentation: 클래스 파일이 VM 에 로드 될 때, 클래스 파일의 raw 바이트는, Instrumentation용으로서 에이전트에 송신됩니다. 클래스의 로드에 의해 발생한 ClassFileLoadHook 이벤트가, 이 기능을 제공합니다. 이 방법은 효율이 좋고, 1 회 한정의 Instrumentation에 완전하게 액세스 할 수 있습니다.
  • 동적 Instrumentation: 벌써 로드 되어 경우에 따라서는 실행되고 있는 일도 있는 클래스를 변경합니다. 이 옵션 기능은,RetransformClasses 함수의 호출에 의해 발생한 ClassFileLoadHook 이벤트에 의해 제공됩니다. 클래스는 몇회에서도 변경할 수 있습니다. 원 상태에 되돌리는 것도 간단합니다. 이 방법에서는, 실행중의 Instrumentation의 변경이 가능합니다.

 

이 인터페이스에 준비된 클래스 변경 기능은, Instrumentation의 기구를 제공해 (ClassFileLoadHook 이벤트와 RetransformClasses 함수), 개발시에는 수정하면서 debug를 계속해 가는 (RedefineClasses 함수) 위해(때문에) 준비되어 있습니다.

 

의존관계(dependencies)가 혼란하지 않게, 특히 코어 클래스를 계측 하는 경우는, 주의가 필요합니다. 예를 들어, 각 객체 할당의 통지를 받는 어프로치에서는,Object 로 생성자 을 계측 합니다. 생성자 이 처음은 빈 상태(empty)이다고 하면(자), 이 생성자 을 다음과 같이 변경합니다.

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

그러나,ClassFileLoadHook 이벤트를 사용해 이 변경을 실시했을 경우는, 일반적으로의 VM 에 다음과 같은 영향이 있습니다. 최초로 작성된 객체가 생성자 을 호출해,MyProfiler 의 클래스가 로드 됩니다. 이것에 의해 객체가 작성됩니다만,MyProfiler 는 아직 로드되어 있지 않기 때문에, 무한 회귀가 발생해 버려, 스택 오버플로우가 됩니다. 이것을 변경해, 안전한 타이밍이 될 때까지 트랙킹 메소드의 호출을 늦춥니다. 예를 들어 trackAllocationsVMInit 이벤트의 핸들러로 설정할 수가 있습니다.

      static boolean trackAllocations = false;

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

 

SetNativeMethodPrefix 를 사용하면, 래퍼 메소드에 의한 네이티브 메소드의 계측이 가능해집니다.

수정 UTF-8 의 캐릭터 라인 인코딩

JVM TI 는, 수정 UTF-8 를 사용해 캐릭터 라인을 encode 합니다. 이것은, JNI 가 사용하는 것과 같은 인코딩입니다. 수정 UTF-8 와 표준의 UTF-8 와의 차이는, 보조 문자와 null 문자의 표현 방법에 있습니다. 상세한 것에 대하여는, JNI 스펙의 「Modified UTF-8 Strings」섹션을 참조해 주세요.

스펙의 문맥

이 인터페이스는 Java 가상 머신으로 실행되는 어플리케이션 상태에 액세스 하기 위한(해), 용어는 JavaTM 플랫폼에 관한 것이며, 특히 언급하고 있는 경우를 제외해 네이티브 플랫폼에 관한 것이 아닙니다. 예를 나타냅니다.

  • 「thread」는 JavaTM 프로그램 언어의 thread를 의미한다.
  • 「스택 프레임」은 Java 가상 머신의 스택 프레임을 의미한다.
  • 「클래스」는 Java 프로그램 언어의 클래스를 의미한다.
  • 「heap」는 Java 가상 머신의 heap를 의미한다.
  • 「모니터」는 Java 프로그램 언어의 객체 모니터를 의미한다.

 

Sun, Sun Microsystems, Sun 의 로고, Java, 및 JVM 는, 미국 및 그 외의 나라에 있어서의 미국 Sun Microsystems, Inc. 의 등록상표입니다.

 

 


함수

JVMTI 함수의 액세스

native code는, JVM TI 함수를 호출해 JVM TI 기능에 액세스 합니다. JVM TI 함수에는,Java Native Interface (JNI) 함수의 액세스시와 같게, 인터페이스 포인터를 사용해 액세스 합니다. JVM TI 인터페이스 포인터를 「환경 포인터」라고 부릅니다.

 

환경 포인터는,jvmtiEnv* 형의 환경에의 포인터입니다. 환경에는, JVM TI 접속에 관한 정보가 있습니다. 환경내의 최초의 값은, 함수 테이블에의 포인터입니다. 함수 테이블은, JVM TI 함수에의 포인터의 배열입니다. 어느 함수 포인터도 배열내의 사전에 정의된 오프셋(offset)에 있습니다.

 

C 언어로부터 사용되는 경우: 함수에의 액세스시에 이중 간접 지정이 사용됩니다. 즉 환경 포인터는, 문맥을 제공함과 함께, 각 함수 호출의 최초의 파라미터가 됩니다. 다음에 예를 나타냅니다.

jvmtiEnv *jvmti;
...
jvmtiError err = (*jvmti)->GetLoadedClasses(jvmti, &class_count, &classes);
    

 

C++ 언어로부터 사용되는 경우: 각 함수는 jvmtiEnv 의 멤버 함수로서 액세스 되어 환경 포인터가 함수 호출에게 건네질 것은 없습니다. 다음에 예를 나타냅니다.

jvmtiEnv *jvmti;
...
jvmtiError err = jvmti->GetLoadedClasses(&class_count, &classes);
    

특히 지정하지 않는 한, 이 스펙에 포함되는 예나 선언은 모두, C 언어를 사용하고 있습니다.

 

JVM TI 환경은, JNI 호출 API 의 GetEnv 함수를 사용해 취득할 수 있습니다.

jvmtiEnv *jvmti;
...
(*jvm)->GetEnv(jvm, &jvmti, JVMTI_VERSION_1_0);
    

GetEnv 를 호출할 때마다, 새로운 JVM TI 접속이 작성되어 새로운 JVM TI 환경이 작성됩니다. GetEnv 는, JVM TI 판의 version 인수를 필요로 합니다. 반환되는 환경의 버젼이 요구된 버젼과 다르고 있어도, 요구된 버젼과 호환성이 있으면, 문제는 없습니다. JVM TI 가 지원되어 있지 않은지, 현재의 VM 구성으로 JVM TI 가 지원되어 있지 않은 경우, 호환 버젼을 얻을 수 없으면GetEnvJNI_EVERSION 를 돌려줍니다. 특정의 문맥에서는, JVM TI 환경을 작성하기 위해서 그 외의 인터페이스를 추가할 수 있습니다. 각 환경에는, 고유 상태가 있습니다. 예를 들어,필수 이벤트,이벤트 처리 함수,권한 등입니다. 환경은,DisposeEnvironment 에 의해 릴리스 됩니다. 이 때문에, thread 마다 환경을 가지는 JNI 과는 달리, JVM TI 환경은 동적으로 작성되어 복수의 thread에 걸쳐 기능합니다.

함수의 반환값

JVM TI 함수는, 항상 jvmtiError 함수의 반환값으로부터에러 코드를 돌려줍니다. 함수에 따라서는, 호출측의 함수로 지정된 포인터에 의해, 이외의 값을 돌려주는 일도 가능합니다. JVM TI 의 함수안에는 메모리를 할당하는 것이 있습니다만, 이 경우는 프로그램내에서 그 메모리를 명시적으로 해제하지 않으면 안됩니다. 이것에 대해서는, 개개의 JVM TI 함수의 설명에 명기되어 있습니다. 빈 상태(empty)의 리스트, 배열, 순서 등은,NULL 로서 돌려주어집니다.

 

JVM TI 함수가 에러에 조우했을 경우는 (반환값이 JVMTI_ERROR_NONE 이외), 인수 포인터에 의해 참조되는 메모리치는 미정도리입니다. 그러나, 메모리 및 글로벌 참조는 아무것도 할당할 수 없습니다. 무효인 입력에 의해 에러가 발생했을 경우, 액션은 발생하지 않습니다.

JNI 객체 참조의 관리

JVM TI 함수는, JNI 참조 (jobjectjclass )와 그 파생 (jthreadjthreadGroup )에 의해 객체를 식별합니다. JVM TI 의 함수에게 건네지는 참조는, 글로벌에서도 로컬에서도 괜찮습니다가, 강한 참조가 아니면 안됩니다. JVM TI 함수로부터 반환되는 모든 참조는, 로컬 참조입니다. 이러한 로컬 참조는, JVM TI 의 호출시에 작성됩니다. 로컬 참조는, 관리 대상으로 해야 할 자원입니다 (JNI 의 메뉴얼을 참조). thread가 native code로부터 반환되는 경우, 모든 로컬 참조는 해제됩니다. 전형적인 에이전트 thread를 포함한 일부의 thread는, 결코 native code로부터는 돌려주어지지 않습니다. 각 thread는, 명시적 관리없이 16 개의 로컬 참조를 작성할 수가 있습니다. native code로부터 돌려주어지기 전에, 한정된 수의 JVM TI 호출을 실행하는 thread (이벤트 처리 thread등)의 경우, 명시적 관리는 불필요하다라고 판단됩니다. 그러나, 장시간 실행되는 에이전트 thread는, 명시적 로컬 참조 관리를 필요로 합니다. 일반적으로, 이 관리에는, JNI 함수 PushLocalFramePopLocalFrame 를 사용합니다. 반대로 말하면, native code로부터 반환된 뒤도 참조를 보존하는 경우는, 글로벌 참조로 변환할 필요가 있습니다. 이러한 규칙은 jmethodIDjfieldID 에는 적용되지 않습니다. 이것들은 jobject 는 아니기 때문입니다.

함수 호출의 필요 조건

함수에, thread 또는 VM 를 특정 상태 (중단등)로 하는 것은 에이전트이라고 명시적으로 지정되어 있지 않은 한, 함수를 실행하기 위해서 VM 를 일정한 안전한 상태로 하는 것은, JVM TI 구현이 됩니다.

예외와 함수

JVM TI 함수는 예외를 throw 하지 않습니다. 에러 상태의 전달은,함수의 반환값을 개입시켜 행해집니다. JVM TI 함수가 불려 가도, 그 전후로 기존의 예외 상태는 모두 보관 유지됩니다. 예외의 처리 방법에 대해서는, JNI 스펙의 「Java Exceptions」섹션을 참조해 주세요.

함수의 색인

 


메모리 관리

메모리 관리 함수:

이러한 함수는, JVM TI 기능이 사용하는 메모리의 할당/할당 해제를 행하기 위한 기능을 제공합니다. 또, 이것들을 사용하면, 에이전트의 작업 메모리를 제공할 수 있습니다. JVM TI 가 관리하는 메모리와 다른 메모리 할당 라이브러리 및 기구에는, 호환성이 없습니다.

 


Allocate

jvmtiError
Allocate(jvmtiEnv* env,
            jlong size,
            unsigned char** mem_ptr)

JVM TI 의 allocater를 사용해, 메모리의 영역을 할당합니다. 할당할 수 있었던 메모리는,Deallocate 에 의해 해제해 주세요.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 이 함수는,heap 반복 함수의 콜백으로부터 호출할 수 있다. GarbageCollectionStart 이벤트,GarbageCollectionFinish 이벤트, 및 ObjectFree 이벤트의 이벤트 핸들러로부터의 호출도 가능하다. 46 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
size jlong 할당하는 바이트수.

원리의 설명: jlong 는 JVMDI 와의 호환성을 실현하기 위해서(때문에) 사용된다.

mem_ptr unsigned char** 돌아왔을 때, 할당할 수 있었던 메모리의 선두를 가리키는 포인터. size 가 제로의 경우,NULL 가 반환된다.

 

에이전트는 unsigned char* 에 포인터를 건네준다. 돌아왔을 때,unsigned char* 는, 사이즈 size 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_OUT_OF_MEMORY 메모리 요구를 이행할 수 없다.
JVMTI_ERROR_ILLEGAL_ARGUMENT size 가 제로보다 작다.
JVMTI_ERROR_NULL_POINTER mem_ptrNULL.

Deallocate

jvmtiError
Deallocate(jvmtiEnv* env,
            unsigned char* mem)

JVM TI 의 allocater를 사용해,mem 를 해제합니다. 이 함수는, JVM TI 의 함수에 의해 할당할 수 있어 반환된 메모리 (Allocate 를 사용해 할당할 수 있었던 메모리를 포함한다)를 해제하기 위해서 사용합니다. 할당할 수 있던 모든 메모리를 해제할 때까지, 메모리를 재생할 수 없습니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 이 함수는,heap 반복 함수의 콜백으로부터 호출할 수 있다. GarbageCollectionStart 이벤트,GarbageCollectionFinish 이벤트, 및 ObjectFree 이벤트의 이벤트 핸들러로부터의 호출도 가능하다. 47 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
mem unsigned char * 할당할 수 있었던 메모리의 선두를 가리키는 포인터. [On return, the elements are set] 는 무시해도 좋다.

 

에이전트는 unsigned char 에 배열을 건네준다. 배열의 요소의 값은 무시된다. 돌아왔을 때, 요소가 설정되어 있다. memNULL 의 경우, 호출이 무시된다.

 

에러
이 함수는,범용 에러를 돌려준다

 


thread

thread 함수:

thread의 함수형:

thread의 형태:

thread의 플래그 및 정수:

 


thread 상태의 취득

jvmtiError
GetThreadState(jvmtiEnv* env,
            jthread thread,
            jint* thread_state_ptr)

thread 상태를 가져옵니다. thread 상태는, 이하의 일련의 질문에 답하는 것으로 압니다.

 

대답은다음의 비트 벡터로 나타내집니다.

thread 상태의 플래그
정수 설명
JVMTI_THREAD_STATE_ALIVE 0x0001 thread는 활동 상태. thread가 신규 (기동하고 있지 않다) 또는 종료했을 경우는, 0.
JVMTI_THREAD_STATE_TERMINATED 0x0002 thread는 실행을 완료했다.
JVMTI_THREAD_STATE_RUNNABLE 0x0004 thread는 실행 가능.
JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER 0x0400 thread는 동기 블록 또는 메소드의 입력을 대기중. 또는 Object.wait() 의 나중에, 동기 블록 또는 메소드의 재입력을 대기중.
JVMTI_THREAD_STATE_WAITING 0x0080 thread는 대기중.
JVMTI_THREAD_STATE_WAITING_INDEFINITELY 0x0010 thread는 타임 아웃없이 대기중. 예를 들어 Object.wait().
JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT 0x0020 thread는, 지정된 최대 대기 시간에 대기중. 예를 들어 Object.wait(long).
JVMTI_THREAD_STATE_SLEEPING 0x0040 thread는 sleeve중 - Thread.sleep(long).
JVMTI_THREAD_STATE_IN_OBJECT_WAIT 0x0100 thread는 객체 모니터를 대기중 - Object.wait.
JVMTI_THREAD_STATE_PARKED 0x0200 thread는 일시정지중. 예를 들어 LockSupport.park,LockSupport.parkUtil, 및 LockSupport.parkNanos.
JVMTI_THREAD_STATE_SUSPENDED 0x100000 thread가 중단되었다. java.lang.Thread.suspend() 또는 JVM TI 의 중단 함수 (SuspendThread 등)가 thread로 불려 갔다. 이 비트가 설정되었을 경우, 그 외의 비트는, thread의 중단전 상태를 참조한다.
JVMTI_THREAD_STATE_INTERRUPTED 0x200000 thread 인터럽트가 발생했다.
JVMTI_THREAD_STATE_IN_NATIVE 0x400000 thread는 native code내에 있다. 즉, VM 또는 Java 프로그램 언어 코드에 귀환시켜지지 않았던 네이티브 메소드가 실행중.

 

이 플래그는, VM 로 컴파일 된 Java 프로그램 언어 코드의 실행중, VM 코드의 실행중, VM 지원 코드의 실행중은 설정되지 않는 JNI 및 JVM TI 함수등의 네이티브 VM 인터페이스 함수는, VM 코드로서 구현하는 일도 가능.
JVMTI_THREAD_STATE_VENDOR_1 0x10000000 VM 벤더가 정의한다.
JVMTI_THREAD_STATE_VENDOR_2 0x20000000 VM 벤더가 정의한다.
JVMTI_THREAD_STATE_VENDOR_3 0x40000000 VM 벤더가 정의한다.

다음의 정의는, JVM TI thread 상태를 java.lang.Thread.State 형식 상태로 변환하기 위해서(때문에) 사용합니다.

java.lang.Thread.State 변환 마스크
정수 설명
JVMTI_JAVA_LANG_THREAD_STATE_MASK JVMTI_THREAD_STATE_TERMINATED | JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT 비교전에, 이 값으로 상태를 마스크 한다
JVMTI_JAVA_LANG_THREAD_STATE_NEW 0 java.lang.Thread.State.NEW
JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED JVMTI_THREAD_STATE_TERMINATED java.lang.Thread.State.TERMINATED
JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_RUNNABLE java.lang.Thread.State.RUNNABLE
JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER java.lang.Thread.State.BLOCKED
JVMTI_JAVA_LANG_THREAD_STATE_WAITING JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_INDEFINITELY java.lang.Thread.State.WAITING
JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING JVMTI_THREAD_STATE_ALIVE | JVMTI_THREAD_STATE_WAITING | JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT java.lang.Thread.State.TIMED_WAITING

규칙

 

의문에 대한 회답은 1 개 이상은 없습니다만, 회답이 없는 것도 있습니다. 그것은 회답을 모르는지, 들어맞지 않는가, 회답의 어느 것도 올바르지 않기 때문입니다. 답은, 괄호내의 회답이 일치했을 때에만 설정됩니다. 즉, 다음의 어느쪽이든 1 개(살) 이상은 설정할 수 없습니다.

  • JVMTI_THREAD_STATE_RUNNABLE
  • JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER
  • JVMTI_THREAD_STATE_WAITING

JVMTI_THREAD_STATE_ALIVE 가 설정되어 있는 경우, J2SETM 준거 구현에서는, 이상중 한쪽이 항상 설정됩니다. 어느쪽이든가 설정되어 있는 경우는, 괄호에 둘러싸인 회답 JVMTI_THREAD_STATE_ALIVE 가 설정됩니다. 이하의 어느쪽이든 1 개(살) 이상은 설정할 수 없습니다.

  • JVMTI_THREAD_STATE_WAITING_INDEFINITELY
  • JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT

JVMTI_THREAD_STATE_WAITING 가 설정되어 있는 경우, J2SETM 준거 구현에서는, 이상중 한쪽이 항상 설정됩니다. 어느쪽이든가 설정되어 있는 경우, 괄호에 둘러싸인 답 JVMTI_THREAD_STATE_ALIVEJVMTI_THREAD_STATE_WAITING 가 설정됩니다. 이하의 어느쪽이든 1 개(살) 이상은 설정할 수 없습니다.

  • JVMTI_THREAD_STATE_IN_OBJECT_WAIT
  • JVMTI_THREAD_STATE_PARKED
  • JVMTI_THREAD_STATE_SLEEPING

어느쪽이든가 설정되어 있는 경우, 괄호에 둘러싸인 회답 JVMTI_THREAD_STATE_ALIVEJVMTI_THREAD_STATE_WAITING 가 설정됩니다. 또 JVMTI_THREAD_STATE_SLEEPING 가 설정되어 있는 경우는,JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT 가 설정됩니다. 상태 A 가 상태 B 의 기구를 사용해 구현되고 있는 경우, 이 함수로 반환되는 것은 상태 A 입니다. 예를 들어 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_TERMINATEDJVMTI_THREAD_STATE_ALIVE 가 설정될 때까지는 설정되지 않습니다.

 

thread 상태의 표현은, 장래의 스펙으로 확장되는 것을 고려해 설계되고 있습니다. thread 상태의 값은, 거기에 응해 사용 되는 것이 당연해, 서수로서는 사용하지 말아 주세요. 대부분의 조회는, 단일 비트를 테스트해 행해지고 있습니다. switch 문으로 사용하는 경우는, 해당하는 비트로 상태 비트를 마스크 해 주세요. 상기로 정의되어 있지 않은 모든 비트는, 장래 사용하기 위해서 예약되고 있습니다. 현재의 스펙에 호환의 VM 에서는, 예약 비트를 0 으로 설정할 필요가 있습니다. 에이전트는 예약 비트를 무시하지 않으면 안됩니다. 예약 비트는 0 이라고 상정하지 말아 주세요. 또 그 때문에 비교에는 포함하지 말아 주세요.

 

 

지금부터 설명하는 값은, 예약 비트와 벤더 비트를 제외하고 있습니다.

 

synchronized 문으로 블록 된 thread 상태는 다음과 같이 됩니다.

            JVMTI_THREAD_STATE_ALIVE + JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER
        

개시하고 있지 않는 thread 상태는 다음과 같이 됩니다.

            0
        

Object.wait(3000) 에 의한 thread 상태는 다음과 같이 됩니다.

            JVMTI_THREAD_STATE_ALIVE + JVMTI_THREAD_STATE_WAITING +
                JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT +
                JVMTI_THREAD_STATE_MONITOR_WAITING
        

실행 가능중에 중단된 thread 상태는 다음과 같이 됩니다.

            JVMTI_THREAD_STATE_ALIVE + JVMTI_THREAD_STATE_RUNNABLE + JVMTI_THREAD_STATE_SUSPENDED
        

 

상태의 테스트

 

대부분의 경우, thread 상태는 해당하는 상태에 대응하는 1 비트를 테스트하면 판명됩니다. 예를 들어, thread가 sleeve 상태인가 어떤가를 테스트하는 코드는 다음과 같습니다.

        jint state;
        jvmtiError err;

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

 

대기중 (Object.wait, 일시정지중, 또는 sleeve중)의 경우는, 다음과 같습니다.

           if (state & JVMTI_THREAD_STATE_WAITING) {  ...
        

상태에 따라서는, 복수 비트를 테스트할 필요가 있습니다. thread가 개시하고 있지 않는지 어떤지를 테스트하는 경우 등입니다.

           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.getState() 로부터 반환되는 java.lang.Thread.State 로 나타나는 thread 상태는, 이 함수로부터 반환되는 정보의 부분집합입니다. 대응하는 java.lang.Thread.State 는, 지정된 변환 마스크를 사용해 결정할 수 있습니다. 예를 들어, 다음의 코드는 java.lang.Thread.State thread 상태의 이름을 돌려줍니다.

            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";
            }
        

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 17 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
thread jthread 조회하는 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
thread_state_ptr jint * 돌아왔을 때,thread 상태 플래그의 정의에 따라 상태 플래그를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_NULL_POINTER thread_state_ptrNULL.

현재의 thread의 취득

jvmtiError
GetCurrentThread(jvmtiEnv* env,
            jthread* thread_ptr)

현재의 thread를 가져옵니다. 현재의 thread란, 이 함수를 호출한 Java 프로그램 언어 thread입니다.

 

thread를 인수에 취하는 JVM TI 함수의 대부분은,NULL 를 현재의 thread를 의미하는 것으로서 받아들입니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 18 1.1

 

권한
필요한 기능

 

파라미터
이름 설명
thread_ptr jthread * 돌아왔을 때, 현재의 thread를 포인트 한다.

 

에이전트는 jthread 에 포인터를 건네준다. 돌아왔을 때,jthread 가 설정되어 있다. thread_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER thread_ptrNULL.

모든 thread의 취득

jvmtiError
GetAllThreads(jvmtiEnv* env,
            jint* threads_count_ptr,
            jthread** threads_ptr)

모든 라이브 thread를 가져옵니다. thread는, Java 프로그램 언어의 thread, 즉 VM 에 접속된 thread입니다. thread가 라이브 thread라면,java.lang.Thread.isAlive() 의 반환값은 true 가 됩니다. 이 경우, thread는, 기동된 뒤, 아직 종료하고 있습니다. thread의 영역은, JVM TI 환경의 문맥에 의해 결정됩니다. 일반적으로, VM 에 접속된 모든 thread가 대상이 됩니다. 이것에는 JVM TI 에이전트의 thread도 포함됩니다 (RunAgentThread 를 참조).

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 4 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
threads_count_ptr jint * 돌아왔을 때, throw 되는 예외의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
threads_ptr jthread ** 돌아왔을 때, 참조 (실행중의 thread 마다 1 개(살)씩)의 배열을 포인트 한다.

 

에이전트는 jthread* 에 포인터를 건네준다. 돌아왔을 때,jthread* 는, 사이즈 *threads_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. threads_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER thread_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER threads__ptrNULL.

thread의 중단

jvmtiError
SuspendThread(jvmtiEnv* env,
            jthread thread)

지정된 thread를 중단합니다. 호출측 thread가 지정되고 있는 경우, 이 함수는, 다른 thread가 ResumeThread 를 호출할 때까지 돌아오지 않습니다. thread가 현재 중단되고 있는 경우, 이 함수는 아무것도 실시하지 않고, 에러를 돌려줍니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 5 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_suspend thread를 중단해, 재개할 수 있다.

 

파라미터
이름 설명
thread jthread 중단하는 thread. threadNULL 의 경우, 현재의 thread가 사용된다

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_suspend 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_THREAD_SUSPENDED thread는 벌써 중단되고 있다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).

threaded list의 중단

jvmtiError
SuspendThreadList(jvmtiEnv* env,
            jint request_count,
            const jthread* request_list,
            jvmtiError* results)

request_list 배열로 지정된 thread request_count 를 중단합니다. thread의 재개에는,ResumeThreadList 또는 ResumeThread 를 사용합니다. request_list 배열에 호출해 옆thread가 지정되고 있는 경우, 이 함수는, 다른 thread에 의해 재개될 때까지 돌아오지 않습니다. thread의 중단중에 발생한 에러는, 이 함수의 반환값은 아니고,results 배열내에 돌려주어집니다. 현재 중단하고 있는 thread 상태는 바뀌지 않습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 92 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_suspend thread를 중단해, 재개할 수 있다

 

파라미터
이름 설명
request_count jint 중단하는 thread의 수.
request_list const jthread * 중단하는 thread의 리스트.

 

에이전트는 jthreadrequest_count 요소의 배열을 건네준다.
results jvmtiError * 에이전트에 의해 제공된 request_count 요소의 배열. 돌아왔을 때, 대응하는 thread의 중단의 에러 코드가 들어가 있다. thread가 이 호출에 의해 중단했을 경우, 에러 코드는 JVMTI_ERROR_NONE . 그 외의 에러 코드는,SuspendThread 로 지정된 에러 코드.

 

에이전트는,jvmtiErrorrequest_count 요소를 충분히 보관 유지할 수 있는 크기의 배열을 건네준다. 배열의 요소의 값은 무시된다. 돌아왔을 때, 요소가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_suspend 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_ILLEGAL_ARGUMENT request_count0 보다 작다.
JVMTI_ERROR_NULL_POINTER request_listNULL.
JVMTI_ERROR_NULL_POINTER resultsNULL.

thread의 재개

jvmtiError
ResumeThread(jvmtiEnv* env,
            jthread thread)

중단되고 있는 thread의 실행을 재개합니다. 현재 JVM TI 중단 함수 (SuspendThread 등) 또는 java.lang.Thread.suspend() 에 의해 중단되고 있는 thread의 실행을 재개합니다. 그 외의 thread에는 영향은 없습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 6 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_suspend thread를 중단해, 재개할 수 있다

 

파라미터
이름 설명
thread jthread 재개하는 thread.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_suspend 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_THREAD_NOT_SUSPENDED thread는 중단되어 있지 않다.
JVMTI_ERROR_INVALID_TYPESTATE thread 상태가 변경되었기 때문에, 부정합이 생기고 있다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).

threaded list의 재개

jvmtiError
ResumeThreadList(jvmtiEnv* env,
            jint request_count,
            const jthread* request_list,
            jvmtiError* results)

request_list 배열로 지정된 thread request_count 를 재개합니다. JVM TI 중단 함수 (SuspendThreadList 등) 또는 java.lang.Thread.suspend() 에 의해 중단되고 있는 thread의 실행을 재개합니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 93 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_suspend thread를 중단해, 재개할 수 있다

 

파라미터
이름 설명
request_count jint 재개하는 thread의 수.
request_list const jthread * 재개하는 thread.

 

에이전트는 jthreadrequest_count 요소의 배열을 건네준다.
results jvmtiError * 에이전트에 의해 제공된 request_count 요소의 배열. 돌아왔을 때, 대응하는 thread의 재개의 에러 코드가 들어가 있다. thread가 이 호출에 의해 중단했을 경우, 에러 코드는 JVMTI_ERROR_NONE . 그 외의 에러 코드는,ResumeThread 로 지정된 에러 코드.

 

에이전트는,jvmtiErrorrequest_count 요소를 충분히 보관 유지할 수 있는 크기의 배열을 건네준다. 배열의 요소의 값은 무시된다. 돌아왔을 때, 요소가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_suspend 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_ILLEGAL_ARGUMENT request_count0 보다 작다.
JVMTI_ERROR_NULL_POINTER request_listNULL.
JVMTI_ERROR_NULL_POINTER resultsNULL.

thread의 정지

jvmtiError
StopThread(jvmtiEnv* env,
            jthread thread,
            jobject exception)

지정된 비동기의 예외가 지정된 thread에 보냅니다 (java.lang.Thread.stop 와 같이). 일반적으로, 이 함수는, 지정된 thread를, 예외 ThreadDeath 의 인스턴스를 사용해 종료시키기 위해서(때문에) 사용합니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 7 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_signal_thread thread에 정지 또는 끼어들어 신호를 송신할 수 있다

 

파라미터
이름 설명
thread jthread 정지하는 thread.
exception jobject 비동기의 예외 객체.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_signal_thread 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_INVALID_OBJECT exception 가 객체는 아니다.

thread의 인터럽트

jvmtiError
InterruptThread(jvmtiEnv* env,
            jthread thread)

지정된 thread에 끼어듭니다 (java.lang.Thread.interrupt 와 같이).

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 8 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_signal_thread thread에 정지 또는 끼어들어 신호를 송신할 수 있다

 

파라미터
이름 설명
thread jthread 끼어드는 thread.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_signal_thread 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).

thread 정보의 취득

typedef struct {
    char* name;
    jint priority;
    jboolean is_daemon;
    jthreadGroup thread_group;
    jobject context_class_loader;
} jvmtiThreadInfo;
jvmtiError
GetThreadInfo(jvmtiEnv* env,
            jthread thread,
            jvmtiThreadInfo* info_ptr)

thread 정보를 가져옵니다. jvmtiThreadInfo 구조체의 필드에, 지정된 thread의 상세가 들어갑니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 9 1.0

 

권한
필요한 기능

 

jvmtiThreadInfo - thread 정보 구조체
필드 설명
name char * thread명. 수정 UTF-8 캐릭터 라인으로서 encode 된다.
priority jint thread의 우선 순위. thread 우선 순위 정수 jvmtiThreadPriority 를 참조.
is_daemon jboolean demon thread인가 어떤가
thread_group jthreadGroup 이 thread가 속하는 thread 그룹. thread가 정지하고 있는 경우는 NULL.
context_class_loader jobject 이 thread에 관련지을 수 있었던 문맥 클래스 로더.

 

파라미터
이름 설명
thread jthread 조회하는 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
info_ptr jvmtiThreadInfo * 돌아왔을 때, 지정된 thread에 대한 정보가 들어가 있다.

 

문맥 클래스 로더를 인식하지 않는 JDK 1.1 의 구현의 경우,context_class_loader 필드는 NULL.

 

에이전트는 jvmtiThreadInfo 에 포인터를 건네준다. 돌아왔을 때,jvmtiThreadInfo 가 설정되어 있다. jvmtiThreadInfoname 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiThreadInfothread_group 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다. jvmtiThreadInfocontext_class_loader 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_NULL_POINTER info_ptrNULL.

소유 모니터 정보의 취득

jvmtiError
GetOwnedMonitorInfo(jvmtiEnv* env,
            jthread thread,
            jint* owned_monitor_count_ptr,
            jobject** owned_monitors_ptr)

지정된 thread가 소유하는 모니터에 대한 정보를 가져옵니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 10 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_get_owned_monitor_info 모니터의 소유에 관한 정보를 취득할 수 있는 - GetOwnedMonitorInfo

 

파라미터
이름 설명
thread jthread 조회하는 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
owned_monitor_count_ptr jint * 반환되는 모니터의 수.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
owned_monitors_ptr jobject ** 소유되는 모니터의 배열.

 

에이전트는 jobject* 에 포인터를 건네준다. 돌아왔을 때,jobject* 는, 사이즈 *owned_monitor_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. owned_monitors_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_get_owned_monitor_info 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_NULL_POINTER owned_monitor_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER owned_monitor_ptrNULL.

소유 모니터의 스택의 깊이 정보의 취득

typedef struct {
    jobject monitor;
    jint stack_depth;
} jvmtiMonitorStackDepthInfo;
jvmtiError
GetOwnedMonitorStackDepthInfo(jvmtiEnv* env,
            jthread thread,
            jint* monitor_info_count_ptr,
            jvmtiMonitorStackDepthInfo** monitor_info_ptr)

지정된 thread가 소유하는 모니터에 관한 정보와 그러한 모니터를 잠그고 있는 스택 프레임의 깊이를 가져옵니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 153 1.1

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_get_owned_monitor_stack_depth_info 소유되고 있는 모니터에 관한 정보와 스택의 깊이를 취득할 수 있는 - GetOwnedMonitorStackDepthInfo

 

jvmtiMonitorStackDepthInfo - 모니터 스택의 깊이 정보 구조체
필드 설명
monitor jobject 소유되는 모니터.
stack_depth jint 스택의 깊이. 스택 프레임 함수로 사용되는 스택의 깊이에 대응하고 있다. 즉, 0 은 현재의 프레임을, 1 은 현재의 프레임을 호출한 프레임을 각각 나타낸다. 또, 구현이 스택의 깊이를 판단할 수 없는 경우는 - 1 이 된다 (JNI 의 MonitorEnter 를 사용해 취득된 모니터의 경우 등).

 

파라미터
이름 설명
thread jthread 조회하는 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
monitor_info_count_ptr jint * 반환되는 모니터의 수.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
monitor_info_ptr jvmtiMonitorStackDepthInfo ** 소유되는 모니터의 깊이 정보의 배열.

 

에이전트는 jvmtiMonitorStackDepthInfo* 에 포인터를 건네준다. 돌아왔을 때,jvmtiMonitorStackDepthInfo* 는, 사이즈 *owned_monitor_depth_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiThreadGroupInfomonitor 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_get_owned_monitor_stack_depth_info 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_NULL_POINTER monitor_info_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER monitor_info_ptrNULL.

현재 경합 하고 있는 모니터의 취득

jvmtiError
GetCurrentContendedMonitor(jvmtiEnv* env,
            jthread thread,
            jobject* monitor_ptr)

지정된 thread가,java.lang.Object.wait 를 사용해 객체의 모니터에 들어가는지, 모니터를 다시 하는 것 를 대기하고 있는 경우에, 그 객체를 가져옵니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 11 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_get_current_contended_monitor GetCurrentContendedMonitor 를 실행할 수 있다

 

파라미터
이름 설명
thread jthread 조회하는 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
monitor_ptr jobject * 돌아왔을 때, 현재 경합 하고 있는 모니터가 들어가 있다. 그러한 모니터가 없는 경우는 NULL 가 들어가 있다.

 

에이전트는 jobject 에 포인터를 건네준다. 돌아왔을 때,jobject 가 설정되어 있다. monitors_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_get_current_contended_monitor 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_NULL_POINTER monitor_ptrNULL.

에이전트 기동 함수

typedef void (JNICALL *jvmtiStartFunction)
    (jvmtiEnv* jvmti_env,
     JNIEnv* jni_env,
     void* arg);
에이전트에 의해 제공되는 콜백 함수. 이 함수는,RunAgentThread 로 개시되는 에이전트 thread의 엔트리 포인트가 됩니다.

 

 

파라미터
이름 설명
jvmti_env jvmtiEnv * JVM TI 환경.
jni_env JNIEnv * JNI 환경
arg void * RunAgentThread 에게 건네진 arg 파라미터.

에이전트 thread의 실행

jvmtiError
RunAgentThread(jvmtiEnv* env,
            jthread thread,
            jvmtiStartFunction proc,
            const void* arg,
            jint priority)

지정된 네이티브 함수를 사용해, 에이전트 thread의 실행을 개시합니다. 파라미터 arg기동 함수 (proc 로 지정)의 단일의 인수로서 전송 됩니다. 이 함수에 의해,java.lang.Thread 의 특별한 서브 클래스나 java.lang.Runnable 의 구현측을 로드하지 않고 , 다른 프로세스와의 통신 처리 또는 이벤트 처리용의 에이전트 thread를 작성할 수 있습니다. 그 대신해, 작성된 thread는 완전하게 native code내에서 실행할 수 있습니다. 다만, 작성하는 thread에는,java.lang.Thread 의 새롭게 작성된 인스턴스 (인수 thread 에 의해 참조된다)가 필요해, 그 인스턴스에 thread를 관련짓습니다. thread 객체는, JNI 호출로 작성할 수 있습니다.

 

다음에 일반적인 thread 우선 순위를 참고로서 가리킵니다.

thread 우선 순위 정수
정수 설명
JVMTI_THREAD_MIN_PRIORITY 1 제일 낮은 우선 순위
JVMTI_THREAD_NORM_PRIORITY 5 중간의 우선 순위
JVMTI_THREAD_MAX_PRIORITY 10 제일 높은 우선 순위

 

새로운 thread는, 지정의우선 순위 로, demon thread로서 기동됩니다. 유효한 경우는,ThreadStart 이벤트가 송신됩니다.

 

thread의 기동이 완료하고 있기 (위해)때문에, 이 thread는 이 함수가 돌아올 때에 라이브 상태가 되어 있습니다. 다만, 이 thread가 곧바로 종료했을 경우는 제외합니다.

 

이 thread의 thread 그룹은 무시됩니다. 구체적으로는, 이 thread는, thread 그룹에 추가되지 않고, Java 프로그램 언어, JVM TI 의 어느 레벨에서도 thread 그룹의 쿼리에는 표시되지 않습니다.

 

이 thread는, Java 프로그램 언어의 쿼리에서는 표시됩니다만,GetAllThreadsGetAllStackTraces 등, JVM TI 의 쿼리에는 포함됩니다.

 

proc 의 실행시에, 새로운 thread는 VM 에 접속됩니다. JNI 의 메뉴얼의「Attaching to the VM」를 참조해 주세요.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 12 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
thread jthread 실행하는 thread.
proc jvmtiStartFunction 기동 함수

 

arg const void * 기동 함수의 인수.

 

에이전트가 포인터를 건네준다. argNULL 의 경우, 기동 함수에 NULL 가 건네받는다.
priority jint 개시되는 thread의 우선 순위. java.lang.Thread.setPriority 로 허가되고 있는 thread 우선 순위를 사용할 수 있다 (jvmtiThreadPriority 의 우선 순위를 포함한다).

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_PRIORITY priorityJVMTI_THREAD_MIN_PRIORITY 보다 낮은가 JVMTI_THREAD_MAX_PRIORITY 보다 높다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_NULL_POINTER procNULL.

thread 로컬인 기억 영역의 설정

jvmtiError
SetThreadLocalStorage(jvmtiEnv* env,
            jthread thread,
            const void* data)

VM 는, 개개의 환경 thread 페어에 관련지을 수 있었던 포인터치를 포함합니다. 이 포인터치를 「thread 로컬인 기억 영역」이라고 부릅니다. 이 함수로 설정되지 않는 경우, 값은 NULL 가 됩니다. 에이전트는, thread 고유의 정보를 포함하기 위해(때문에), 메모리를 할당할 수가 있습니다. thread 로컬인 기억 영역을 설정하는 것으로써,GetThreadLocalStorage 를 사용해 액세스 할 수 있게 됩니다.

 

이 함수는, JVM TI 의 thread 로컬인 기억 영역의 값을 설정하기 위해(때문에), 에이전트에 의해 불려 갑니다. JVM TI 는, 에이전트에 대해서, thread마다의 정보를 기록하기 위해서 이용할 수 있는, 포인터 사이즈의 thread 로컬인 기억 영역을 제공합니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 103 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
thread jthread 이 thread를 포함한다. threadNULL 의 경우, 현재의 thread가 사용된다.
data const void * thread 로컬인 기억 영역에 입력하는 값.

 

에이전트가 포인터를 건네준다. dataNULL 의 경우, 값은 NULL 로 설정된다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).

thread 로컬인 기억 영역의 취득

jvmtiError
GetThreadLocalStorage(jvmtiEnv* env,
            jthread thread,
            void** data_ptr)

JVM TI 의 thread 로컬인 기억 영역의 값을 취득하기 위해(때문에), 에이전트에 의해 불려 갑니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 102 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
thread jthread 이 thread로부터 취득한다. threadNULL 의 경우, 현재의 thread가 사용된다.
data_ptr void** thread 로컬인 기억 영역의 값을 돌려주는 포인터. thread 로컬인 기억 영역이 SetThreadLocalStorage 로 설정되어 있지 않은 경우, 반환되는 포인터는 NULL.

 

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_NULL_POINTER data_ptrNULL.

 


thread 그룹

thread 그룹 함수:

thread 그룹의 형태:

 


톱 레벨의 thread 그룹의 취득

jvmtiError
GetTopThreadGroups(jvmtiEnv* env,
            jint* group_count_ptr,
            jthreadGroup** groups_ptr)

VM 내의 톱 레벨의 (부모가 없다) thread 그룹을 모두 돌려줍니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 13 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
group_count_ptr jint * 돌아왔을 때, 톱 레벨의 thread 그룹의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
groups_ptr jthreadGroup ** 돌아왔을 때, 톱 레벨의 thread 그룹의 배열을 가리키는 포인터를 참조한다.

 

에이전트는 jthreadGroup* 에 포인터를 건네준다. 돌아왔을 때,jthreadGroup* 는, 사이즈 *group_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. groups_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER group_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER groups_ptrNULL.

thread 그룹 정보의 취득

typedef struct {
    jthreadGroup parent;
    char* name;
    jint max_priority;
    jboolean is_daemon;
} jvmtiThreadGroupInfo;
jvmtiError
GetThreadGroupInfo(jvmtiEnv* env,
            jthreadGroup group,
            jvmtiThreadGroupInfo* info_ptr)

thread 그룹의 정보를 가져옵니다. jvmtiThreadGroupInfo 구조체의 필드에, 지정된 thread 그룹의 상세가 들어갑니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 14 1.0

 

권한
필요한 기능

 

jvmtiThreadGroupInfo - thread 그룹 정보 구조체
필드 설명
parent jthreadGroup 친thread 그룹.
name char * thread 그룹의 이름. 수정 UTF-8 캐릭터 라인으로서 encode 된다.
max_priority jint 이 thread 그룹의 최고의 우선 순위.
is_daemon jboolean demon thread 그룹인가 어떤가.

 

파라미터
이름 설명
group jthreadGroup 조회하는 thread 그룹.
info_ptr jvmtiThreadGroupInfo * 돌아왔을 때, 지정된 thread 그룹에 대한 정보가 들어가 있다.

 

에이전트는 jvmtiThreadGroupInfo 에 포인터를 건네준다. 돌아왔을 때,jvmtiThreadGroupInfo 가 설정되어 있다. jvmtiThreadGroupInfoparent 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다. jvmtiThreadGroupInfoname 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_THREAD_GROUP group 는 thread 그룹 객체는 아니다.
JVMTI_ERROR_NULL_POINTER info_ptrNULL.

아이 thread 그룹의 취득

jvmtiError
GetThreadGroupChildren(jvmtiEnv* env,
            jthreadGroup group,
            jint* thread_count_ptr,
            jthread** threads_ptr,
            jint* group_count_ptr,
            jthreadGroup** groups_ptr)

이 thread 그룹내의 액티브 thread와 액티브 소그룹을 가져옵니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 15 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
group jthreadGroup 조회하는 그룹.
thread_count_ptr jint * 돌아왔을 때, 이 thread 그룹내의 액티브 thread의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
threads_ptr jthread ** 돌아왔을 때, 이 thread 그룹내의 액티브 thread의 배열을 포인트 한다.

 

에이전트는 jthread* 에 포인터를 건네준다. 돌아왔을 때,jthread* 는, 사이즈 *thread_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. threads_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다.
group_count_ptr jint * 돌아왔을 때, 액티브한 아이 thread 그룹의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
groups_ptr jthreadGroup ** 돌아왔을 때, 액티브한 아이 thread 그룹의 배열을 포인트 한다.

 

에이전트는 jthreadGroup* 에 포인터를 건네준다. 돌아왔을 때,jthreadGroup* 는, 사이즈 *group_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. groups_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_THREAD_GROUP group 는 thread 그룹 객체는 아니다.
JVMTI_ERROR_NULL_POINTER thread_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER threads__ptrNULL.
JVMTI_ERROR_NULL_POINTER group_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER groups_ptrNULL.

 


스택 프레임

스택 프레임 함수:

스택 프레임의 형태:

이러한 함수는, thread의 스택에 관한 정보를 제공합니다. 스택 프레임은, 깊이로 참조됩니다. 깊이 제로의 프레임이 현재의 프레임입니다.

 

스택 프레임에 대해서는,「Java 가상 머신 스펙」「Frames」섹션에 기재되어 있습니다. 즉, 이러한 프레임은, 네이티브 메소드를 포함한 메소드의 호출에 대응하고 있지만, 플랫폼 고유의 프레임이나 VM 내부의 프레임에는 대응하고 있습니다.

 

JVM TI 구현이 메소드 호출을 사용해 thread를 기동해, 이러한 함수가 제공하는 스택내에, 대응하는 프레임을 포함할 수가 있습니다. 즉,main()run() 보다 깊은 위치에 표시되는 프레임이 존재하게 됩니다. 다만, 이 제공은, 스택 프레임 또는 스택의 깊이를 사용하는 모든 JVM TI 기능과 무결성이 잡힌 것이 아니면 안됩니다.

스택 프레임 정보 구조체

스택 프레임에 관한 정보는 다음의 구조체로 되돌려집니다.

 

typedef struct {
    jmethodID method;
    jlocation location;
} jvmtiFrameInfo;
jvmtiFrameInfo - 스택 프레임 정보 구조체
필드 설명
method jmethodID 이 프레임내에서 실행되고 있는 메소드.
location jlocation 이 프레임내에서 실행되고 있는 명령의 인덱스. 프레임이 네이티브 메소드를 실행하고 있는 경우는 -1.

스택 정보 구조체

스택 프레임 세트에 관한 정보는 다음의 구조체로 되돌려집니다.

 

typedef struct {
jthread thread;
    jint state;
    jvmtiFrameInfo* frame_buffer;
    jint frame_count;
} jvmtiStackInfo;
jvmtiStackInfo - 스택 정보 구조체
필드 설명
thread jthread 돌아왔을 때, 트레이스 된 thread.
state jint 돌아왔을 때, thread 상태. 「GetThreadState」 를 참조.
frame_buffer jvmtiFrameInfo * 돌아왔을 때, 이 에이전트에 의해 할당할 수 있었던 버퍼에, 스택 프레임 정보가 들어가 있다.
frame_count jint 돌아왔을 때, 레코드수가 frame_buffer 에 들어가 있다. 이것은 min(max_frame_count, stackDepth)가 된다.

 


스택 트레이스의 취득

jvmtiError
GetStackTrace(jvmtiEnv* env,
            jthread thread,
            jint start_depth,
            jint max_frame_count,
            jvmtiFrameInfo* frame_buffer,
            jint* count_ptr)

thread의 스택에 관한 정보를 가져옵니다. max_frame_count 가 스택의 깊이보다 작은 경우,max_frame_count 의 맨 위의 프레임이 돌려주어집니다. 그 이외의 경우, 스택 전체가 돌려주어집니다. 마지막에 불려 간 프레임인 최상정도 프레임이, 반환되는 버퍼의 선두가 됩니다.

 

다음의 예에서는, 맨 위의 프레임으로부터 5 개째까지의 프레임이 돌려주어집니다. 게다가 프레임이 있는 경우는, 현재 실행하고 있는 메소드의 이름이 출력됩니다.

jvmtiFrameInfo frames[5];
jint count;
jvmtiError err;

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

 

thread 는, 중단하는 일 없이, 이 함수를 호출할 수가 있습니다.

 

위치와 행 번호의 매핑에는,GetLineNumberTable 함수를 사용할 수 있습니다. 이 매핑은, 지연 해도 괜찮습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 104 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
thread jthread 이 thread의 스택 트레이스를 페치 한다. threadNULL 의 경우, 현재의 thread가 사용된다.
start_depth jint 이 깊이로 프레임의 취득을 개시한다. 부의 수가 아닌 경우, 현재의 프레임으로부터 카운트 한다. 깊이가 start_depth 의 프레임이 최초로 취득된다. 예를 들어, 0 의 경우, 현재의 프레임으로부터 개시한다. 1 의 경우, 현재의 프레임의 호출측으로부터 개시한다. 2 의 경우, 현재의 프레임의 호출측의 호출측으로부터 개시한다. 부의 수의 경우, 제일 낡은 프레임아래로부터 카운트 한다. 깊이가 stackDepth+ start_depth (stackDepth 는 스택상의 프레임의 카운트)의 프레임이 최초로 취득된다. 예를 들어,-1 의 경우, 제일 낡은 프레임만이 취득된다. -2 의 경우, 제일 낡은 프레임에 의해 불려 간 프레임으로부터 개시한다.
max_frame_count jint 취득하는 jvmtiFrameInfo 레코드의 최대수.
frame_buffer jvmtiFrameInfo * 돌아왔을 때, 이 에이전트에 의해 할당할 수 있었던 버퍼에, 스택 프레임 정보가 들어가 있다.

 

에이전트는,jvmtiFrameInfomax_frame_count 요소를 충분히 보관 유지할 수 있는 크기의 배열을 건네준다. 배열의 요소의 값은 무시된다. 돌아왔을 때, 요소의 *count_ptr 가 설정된다.
count_ptr jint * 돌아왔을 때, 정보가 입력되는 레코드의 수를 포인트 한다. start_depth 가 부의 수가 아닌 경우, min(max_frame_count, stackDepth - start_depth). start_depth 가 부의 수의 경우, min(max_frame_count, -start_depth).

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_ILLEGAL_ARGUMENT start_depth 가 정으로,stackDepth 와 동일한가 그것보다 크다. 또는,start_depth 가 부로,-stackDepth 보다 작다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_ILLEGAL_ARGUMENT max_frame_count0 보다 작다.
JVMTI_ERROR_NULL_POINTER frame_bufferNULL.
JVMTI_ERROR_NULL_POINTER count_ptrNULL.

모든 스택 트레이스의 취득

jvmtiError
GetAllStackTraces(jvmtiEnv* env,
            jint max_frame_count,
            jvmtiStackInfo** stack_info_ptr,
            jint* thread_count_ptr)

모든 라이브 thread의 스택에 관한 정보를 가져옵니다 (에이전트 thread를 포함한다). max_frame_count 가 스택의 깊이보다 작은 경우, 그 thread에 대해 max_frame_count 의 맨 위의 프레임이 돌려주어집니다. 그 이외의 경우, 스택 전체가 돌려주어집니다. 마지막에 불려 간 프레임인 최상정도 프레임이, 반환되는 버퍼의 선두가 됩니다.

 

모든 스택은, 동시에 수집됩니다. 즉, 어느 thread의 샘플링과 다음의 thread의 샘플링과의 사이에는, thread 상태 또는 스택으로 변경은 발생하지 않습니다. thread를 중단할 필요는 없습니다.

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);
        

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 100 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
max_frame_count jint thread 마다 취득하는 jvmtiFrameInfo 레코드의 최대수.
stack_info_ptr jvmtiStackInfo ** 돌아왔을 때에, 이 버퍼에 각 thread의 스택 정보가 들어가 있다. jvmtiStackInfo 의 레코드수는,thread_count_ptr 로 결정된다.

 

이 버퍼는,jvmtiStackInfo.frame_buffer 로 포인트 된 jvmtiFrameInfo 버퍼를 포함하도록(듯이) 할당할 수 있고 있다. 이러한 버퍼는, 따로 따로 해제해서는 안 된다.

 

에이전트는 jvmtiStackInfo* 에 포인터를 건네준다. 돌아왔을 때,jvmtiStackInfo* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiStackInfothread 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다.
thread_count_ptr jint * 트레이스 된 thread의 수.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_ILLEGAL_ARGUMENT max_frame_count0 보다 작다.
JVMTI_ERROR_NULL_POINTER stack_info_ptrNULL.
JVMTI_ERROR_NULL_POINTER thread_count_ptrNULL.

threaded list의 스택 트레이스의 취득

jvmtiError
GetThreadListStackTraces(jvmtiEnv* env,
            jint thread_count,
            const jthread* thread_list,
            jint max_frame_count,
            jvmtiStackInfo** stack_info_ptr)

지정된 thread의 스택에 관한 정보를 가져옵니다. max_frame_count 가 스택의 깊이보다 작은 경우, 그 thread에 대해 max_frame_count 의 맨 위의 프레임이 돌려주어집니다. 그 이외의 경우, 스택 전체가 돌려주어집니다. 마지막에 불려 간 프레임인 최상정도 프레임이, 반환되는 버퍼의 선두가 됩니다.

 

모든 스택은, 동시에 수집됩니다. 즉, 어느 thread의 샘플링과 다음의 thread의 샘플링과의 사이에는, thread 상태 또는 스택으로 변경은 발생하지 않습니다. thread를 중단할 필요는 없습니다.

 

thread가 아직 기동되어 있지 않은지, 스택 정보가 수집되기 전에 thread가 종료했을 경우는, 길이 0 의 스택 (jvmtiStackInfo.frame_count 가 0)이 돌려주어지기 (위해)때문에, thread jvmtiStackInfo.state 를 체크할 수 있습니다.

 

예는, 동일한 함수 GetAllStackTraces 를 참조해 주세요.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 101 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
thread_count jint 트레이스 하는 thread의 수.
thread_list const jthread * 트레이스 하는 thread의 리스트.

 

에이전트는 jthreadthread_count 요소의 배열을 건네준다.
max_frame_count jint thread 마다 취득하는 jvmtiFrameInfo 레코드의 최대수.
stack_info_ptr jvmtiStackInfo ** 돌아왔을 때에, 이 버퍼에 각 thread의 스택 정보가 들어가 있다. jvmtiStackInfo 의 레코드수는,thread_count 로 결정된다.

 

이 버퍼는,jvmtiStackInfo.frame_buffer 로 포인트 된 jvmtiFrameInfo 버퍼를 포함하도록(듯이) 할당할 수 있고 있다. 이러한 버퍼는, 따로 따로 해제해서는 안 된다.

 

에이전트는 jvmtiStackInfo* 에 포인터를 건네준다. 돌아왔을 때,vmtiStackInfo* 는, 사이즈 *threads_count 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiStackInfothread 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_THREAD thread 객체가 아닌 요소가 thread_list 내에 존재한다.
JVMTI_ERROR_ILLEGAL_ARGUMENT thread_count0 보다 작다.
JVMTI_ERROR_NULL_POINTER thread_listNULL.
JVMTI_ERROR_ILLEGAL_ARGUMENT max_frame_count0 보다 작다.
JVMTI_ERROR_NULL_POINTER stack_info_ptrNULL.

프레임 카운트의 취득

jvmtiError
GetFrameCount(jvmtiEnv* env,
            jthread thread,
            jint* count_ptr)

지정된 thread의 호출 스택에 현재 들어가 있는 프레임의 수를 가져옵니다.

 

액티브하게 바이트 코드를 실행하고 있는 thread (현재의 thread는 아니고, 중단되어 있지 않은 thread등)를 위해서(때문에) 이 함수가 불려 갔을 경우, 일시적인 정보가 돌려주어집니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 16 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
thread jthread 조회하는 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
count_ptr jint * 돌아왔을 때, 호출 스택내의 프레임의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_NULL_POINTER count_ptrNULL.

프레임의 팝

jvmtiError
PopFrame(jvmtiEnv* env,
            jthread thread)

thread 스택의 현재의 프레임을 팝 합니다. 프레임을 팝 하면(자), 직전의 프레임에 돌아옵니다. thread가 재개되면(자), thread의 실행 상태는, 메소드가 불려 가기 직전 상태에 리셋 됩니다. 「Java 가상 머신 스펙」의 용어로 설명하면(자), 다음과 같이 됩니다.

  • 현재의 프레임이 파기되어 이전의 프레임이 현재의 프레임이 된다
  • 오퍼랜드 스택이 회복한다. 인수의 값이 재차 추가되어 호출이 invokestatic 가 아닌 경우는 objectref 도 재차 추가된다
  • Java 가상 머신의 PC 가 호출해 명령의 조작 코드 (opcode)에 회복한다

다만, 호출처의 메소드로 발생한 인수의 변경 내용은 보관 유지됩니다. 실행을 속행하면(자), 최초의 실행 지시가 호출이 됩니다.

 

PopFrame 의 호출과 thread의 재개동안, 스택 상태는 미정도리입니다. 최초의 프레임보다 전에 프레임을 팝 하려면 , 다음의 3 개의 순서를 반복할 필요가 있습니다.

  • 이벤트를 통해서 thread를 중단한다 (스텝, breakpoint 등)
  • PopFrame 를 호출한다
  • thread를 재개한다

 

피호방편 메소드를 호출하는 것에 의해 획득된 락 (이것이 synchronized 메소드의 경우)과 피호방편 메소드내의 synchronized 블록에 들어가는 것에 의해 획득된 락은 해제됩니다. 주:이것은, 네이티브 락이나 java.util.concurrent.locks 락에는 적용되지 않습니다.

 

최종적으로, 블록은 실행되지 않습니다.

 

글로벌 상태에의 변경에는 대응하지 않기 때문에, 변경은 행해지지 않습니다.

 

지정된 thread는 중단되어 있지 않으면 안됩니다. 이것은, 그 thread가 현재의 thread여선 안 되는 것을 의미합니다.

 

피호방편 메소드라고 불러 방편측의 메소드의 어느쪽이나, 비네이티브의 Java 프로그램 언어의 메소드로 합니다.

 

이 함수는, JVM TI 이벤트를 생성하지 않습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 80 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_pop_frame 스택으로부터 프레임을 팝 할 수 있는 - PopFrame

 

파라미터
이름 설명
thread jthread 팝 하는 현재의 프레임의 thread.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_pop_frame 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_OPAQUE_FRAME 호출처 메소드 또는 호출해 옆메소드가 네이티브 메소드이다. 구현이 이 프레임을 팝 할 수 없다.
JVMTI_ERROR_THREAD_NOT_SUSPENDED thread는 중단되어 있지 않다.
JVMTI_ERROR_NO_MORE_FRAMES 호출 스택상의 스택 프레임의 수가, 2 개보다 적다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).

프레임의 위치의 취득

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

 

Java 프로그램 언어의 프레임에 대해, 현재 실행중의 명령의 위치를 돌려줍니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 19 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
thread jthread 조회하는 프레임의 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
depth jint 조회하는 프레임의 깊이.
method_ptr jmethodID * 돌아왔을 때, 현재의 위치의 메소드를 포인트 한다.

 

에이전트는 jmethodID 에 포인터를 건네준다. 돌아왔을 때,jmethodID 가 설정되어 있다.
location_ptr jlocation * 돌아왔을 때, 현재 실행중의 명령의 인덱스를 포인트 한다. 프레임이 네이티브 메소드를 실행하고 있는 경우는 -1 으로 설정된다.

 

에이전트는 jlocation 에 포인터를 건네준다. 돌아왔을 때,jlocation 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth 가 제로보다 작다.
JVMTI_ERROR_NO_MORE_FRAMES 지정된 depth 에 스택 프레임이 존재하지 않는다.
JVMTI_ERROR_NULL_POINTER method_ptrNULL.
JVMTI_ERROR_NULL_POINTER location_ptrNULL.

프레임의 팝의 통지

jvmtiError
NotifyFramePop(jvmtiEnv* env,
            jthread thread,
            jint depth)

깊이 depth 의 프레임이 스택으로부터 팝 되었을 때,FramePop 이벤트를 생성합니다. 자세한 것은,FramePop 이벤트의 설명을 참조해 주세요. 비네이티브 Java 프로그램 언어의 메소드에 대응하는 프레임만이 통지를 수신할 수 있습니다.

 

지정한 thread는 현재의 thread인지, thread가 중단했는지의 어느 쪽인지입니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 20 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_frame_pop_events FramePop 이벤트를설정해, 취득할 수가 있다

 

파라미터
이름 설명
thread jthread 프레임의 팝 이벤트가 생성되는 프레임의 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
depth jint 프레임의 팝 이벤트가 생성되는 프레임의 깊이.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_generate_frame_pop_events 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_OPAQUE_FRAME depth 의 프레임은 네이티브 메소드를 실행하고 있다.
JVMTI_ERROR_THREAD_NOT_SUSPENDED thread는 중단되지 않고, 현재의 thread는 아니었다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth 가 제로보다 작다.
JVMTI_ERROR_NO_MORE_FRAMES 지정된 depth 에 스택 프레임이 존재하지 않는다.

 


조기 복귀의 강제

조기 복귀의 강제의 함수:

이러한 함수를 사용하면(자), 에이전트는, 실행중의 임의의 포인트에서의 복귀를 메소드에 강제할 수 있습니다. 조기 복귀하는 메소드를 「피호방편 메소드」라고 부릅니다. 피호방편 메소드는,「Java 가상 머신 스펙」「Frames」섹션에 정의되고 있는 대로, 함수의 호출시에, 지정된 thread의 현재의 메소드가 됩니다.

 

지정된 thread는, 중단되고 있는지, 현재의 thread가 아니면 안됩니다. 메소드의 복귀는, Java 프로그램 언어의 코드의 실행이 이 thread상에서 재개되었을 때에 행해집니다. 이러한 함수의 어느쪽이든을 호출하고 나서 thread의 실행이 재개될 때까지 의 스택 상태는 미정도리입니다.

 

피호방편 메소드에서는, 더 이상의 명령은 실행되지 않습니다. 특히, 최종적으로 블록은 실행되지 않습니다. 주:이것에 의해, 어플리케이션내에서 무결성이 없는 상태가 발생하는 일이 있습니다.

 

피호방편 메소드를 호출하는 것에 의해 획득된 락 (이것이 synchronized 메소드의 경우)과 피호방편 메소드내의 synchronized 블록에 들어가는 것에 의해 획득된 락은 해제됩니다. 주:이것은, 네이티브 락이나 java.util.concurrent.locks 락에는 적용되지 않습니다.

 

일반적으로 복귀의 경우와 같게,MethodExit 등의 이벤트가 생성됩니다.

 

피호방편 메소드는, 비네이티브의 Java 프로그램 언어의 메소드로 합니다. 스택상에 프레임이 1 개만 있는 상태로 thread에의 강제 복귀를 행했을 경우, thread가 재개시에 종료합니다.

 


조기 복귀의 강제 - 객체형

jvmtiError
ForceEarlyReturnObject(jvmtiEnv* env,
            jthread thread,
            jobject value)

이 함수를 사용하면(자), 결과의 형태가 Object 또는 Object 의 서브 클래스인 메소드로부터 복귀할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 81 1.1

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_force_early_return 조기 복귀의 강제의 카테고리로 설명하고 있도록(듯이), 메소드로부터 조기 복귀할 수 있다.

 

파라미터
이름 설명
thread jthread 현재의 프레임이 조기 복귀하는 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
value jobject 피호방편 프레임의 반환값. 객체 또는 NULL.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_force_early_return 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_OPAQUE_FRAME 네이티브 메소드에 대응하는 프레임으로부터의 조기 복귀가 시도되었다. 또는, 구현이 이 프레임상에서 이 기능을 제공할 수 없다.
JVMTI_ERROR_TYPE_MISMATCH 피호방편 메소드의 결과의 형태가,Object 에서도,Object 의 서브 클래스도 아니다.
JVMTI_ERROR_TYPE_MISMATCH 지정된 과 피호방편 메소드의 결과의 형태에 호환성이 없다.
JVMTI_ERROR_THREAD_NOT_SUSPENDED thread가 현재의 thread는 아니고, 중단되어 있지 않았다.
JVMTI_ERROR_NO_MORE_FRAMES 호출 스택에 더 이상의 프레임이 없다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_INVALID_OBJECT value 가 객체는 아니다.

조기 복귀의 강제 - 정수형

jvmtiError
ForceEarlyReturnInt(jvmtiEnv* env,
            jthread thread,
            jint value)

이 함수를 사용하면(자), 결과의 형태가 int,short,char,byte,boolean 의 언젠가인 메소드로부터 복귀할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 82 1.1

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_force_early_return 조기 복귀의 강제의 카테고리로 설명하고 있도록(듯이), 메소드로부터 조기 복귀할 수 있다.

 

파라미터
이름 설명
thread jthread 현재의 프레임이 조기 복귀하는 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
value jint 피호방편 프레임의 반환값.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_force_early_return 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_OPAQUE_FRAME 네이티브 메소드에 대응하는 프레임으로부터의 조기 복귀가 시도되었다. 또는, 구현이 이 프레임상에서 이 기능을 제공할 수 없다.
JVMTI_ERROR_TYPE_MISMATCH 피호방편 메소드의 결과의 형태가 int,short,char,byte,boolean 의 머지않아도 아니다.
JVMTI_ERROR_THREAD_NOT_SUSPENDED thread가 현재의 thread는 아니고, 중단되어 있지 않았다.
JVMTI_ERROR_NO_MORE_FRAMES 호출 스택에 프레임이 없다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).

조기 복귀의 강제 - 장 정수형

jvmtiError
ForceEarlyReturnLong(jvmtiEnv* env,
            jthread thread,
            jlong value)

이 함수를 사용하면(자), 결과의 형태가 long 인 메소드로부터 복귀할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 83 1.1

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_force_early_return 조기 복귀의 강제의 카테고리로 설명하고 있도록(듯이), 메소드로부터 조기 복귀할 수 있다.

 

파라미터
이름 설명
thread jthread 현재의 프레임이 조기 복귀하는 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
value jlong 피호방편 프레임의 반환값.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_force_early_return 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_OPAQUE_FRAME 네이티브 메소드에 대응하는 프레임으로부터의 조기 복귀가 시도되었다. 또는, 구현이 이 프레임상에서 이 기능을 제공할 수 없다.
JVMTI_ERROR_TYPE_MISMATCH 피호방편 메소드의 결과의 형태가 long 가 아니다.
JVMTI_ERROR_THREAD_NOT_SUSPENDED thread가 현재의 thread는 아니고, 중단되어 있지 않았다.
JVMTI_ERROR_NO_MORE_FRAMES 호출 스택에 프레임이 없다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).

조기 복귀의 강제 - 부동 소수점수(실수)형

jvmtiError
ForceEarlyReturnFloat(jvmtiEnv* env,
            jthread thread,
            jfloat value)

이 함수를 사용하면(자), 결과의 형태가 float 인 메소드로부터 복귀할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 84 1.1

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_force_early_return 조기 복귀의 강제의 카테고리로 설명하고 있도록(듯이), 메소드로부터 조기 복귀할 수 있다.

 

파라미터
이름 설명
thread jthread 현재의 프레임이 조기 복귀하는 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
value jfloat 피호방편 프레임의 반환값.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_force_early_return 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_OPAQUE_FRAME 네이티브 메소드에 대응하는 프레임으로부터의 조기 복귀가 시도되었다. 또는, 구현이 이 프레임상에서 이 기능을 제공할 수 없다.
JVMTI_ERROR_TYPE_MISMATCH 피호방편 메소드의 결과의 형태가 float 가 아니다.
JVMTI_ERROR_THREAD_NOT_SUSPENDED thread가 현재의 thread는 아니고, 중단되어 있지 않았다.
JVMTI_ERROR_NO_MORE_FRAMES 호출 스택에 프레임이 없다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).

조기 복귀의 강제 - 배정밀도 부동 소수점수(실수)형

jvmtiError
ForceEarlyReturnDouble(jvmtiEnv* env,
            jthread thread,
            jdouble value)

이 함수를 사용하면(자), 결과의 형태가 double 인 메소드로부터 복귀할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 85 1.1

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_force_early_return 조기 복귀의 강제의 카테고리로 설명하고 있도록(듯이), 메소드로부터 조기 복귀할 수 있다.

 

파라미터
이름 설명
thread jthread 현재의 프레임이 조기 복귀하는 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
value jdouble 피호방편 프레임의 반환값.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_force_early_return 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_OPAQUE_FRAME 네이티브 메소드에 대응하는 프레임으로부터의 조기 복귀가 시도되었다. 또는, 구현이 이 프레임상에서 이 기능을 제공할 수 없다.
JVMTI_ERROR_TYPE_MISMATCH 피호방편 메소드의 결과의 형태가 double 가 아니다.
JVMTI_ERROR_THREAD_NOT_SUSPENDED thread가 현재의 thread는 아니고, 중단되어 있지 않았다.
JVMTI_ERROR_NO_MORE_FRAMES 호출 스택에 프레임이 없다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).

조기 복귀의 강제 - void 형

jvmtiError
ForceEarlyReturnVoid(jvmtiEnv* env,
            jthread thread)

이 함수를 사용하면(자), 결과의 형태를 가지지 않는 메소드로부터 복귀할 수 있습니다. 즉, 피호방편 메소드가 void 와 선언되어 있지 않으면 안됩니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 86 1.1

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_force_early_return 조기 복귀의 강제의 카테고리로 설명하고 있도록(듯이), 메소드로부터 조기 복귀할 수 있다.

 

파라미터
이름 설명
thread jthread 현재의 프레임이 조기 복귀하는 thread. threadNULL 의 경우, 현재의 thread가 사용된다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_force_early_return 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_OPAQUE_FRAME 네이티브 메소드에 대응하는 프레임으로부터의 조기 복귀가 시도되었다. 또는, 구현이 이 프레임상에서 이 기능을 제공할 수 없다.
JVMTI_ERROR_TYPE_MISMATCH 피호방편 메소드가 결과의 형태를 가지고 있다.
JVMTI_ERROR_THREAD_NOT_SUSPENDED thread가 현재의 thread는 아니고, 중단되어 있지 않았다.
JVMTI_ERROR_NO_MORE_FRAMES 호출 스택에 프레임이 없다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).

 


heap

heap 함수:

heap의 함수형:

heap의 형태:

heap의 플래그 및 정수:

이러한 함수는, heap의 분석에 사용됩니다. heap내의 객체의 표시, 이러한 객체에의 태그부등의 기능이 있습니다.

객체의 태그

「태그」는, 객체에 관련지을 수 있는 값입니다. 태그는, 에이전트에 의해,태그의 설정 함수를 사용해 명시적으로 설정됩니다. 또는,jvmtiHeapIterationCallback 등의 콜백 함수에 의해 설정됩니다.

 

태그는 환경에 대해서 로컬입니다. 즉, 어느 환경의 태그를 다른 환경에서 표시할 수 없습니다.

 

태그는 jlong 치입니다. 이 값을 사용해, 객체에 마크를 붙이거나 상세 정보의 포인터를 포함하거나 할 수 있습니다. 태그 붙이고되어 있지 않은 객체에는, 제로의 태그가 붙어 있습니다. 태그를 제로로 설정하는 것으로써, 객체의 태그부를 해제할 수 있습니다.

heap 콜백 함수

heap 함수는, heap내에서의 반복 처리와 객체 참조의 재귀적인 추적을 실시해, 에이전트가 지정한 콜백 함수를 사용해 정보 제공을 실시합니다.

 

이러한 heap 콜백 함수는, 다음의 제한에 따릅니다. 이러한 콜백으로 JNI 함수는 사용하지 말아 주세요. 이러한 콜백에서는, 특별히 사용이 허가되고 있는 「콜백 안전」인 함수 이외의 JVM TI 함수를 사용할 수 없습니다 (raw 모니터 함수, 메모리 관리 함수, 환경 로컬 기억 영역 함수를 참조).

 

구현은, 내부 thread상 또는 반복해 함수를 호출한 thread상에서, 콜백을 호출할 수가 있습니다. heap 콜백은 싱글스 레드입니다. 복수의 콜백이 동시에 불려 갈 것은 없습니다.

 

heap 필터 플래그를 사용하면(자), 객체 또는 그 클래스의 태그 상태에 근거해 보고를 실시하지 않게 할 수가 있습니다. 플래그가 설정되어 있지 않은 경우 (jint 가 제로의 경우), 객체의 필터링은 행해지지 않습니다.

heap 필터 플래그
정수 설명
JVMTI_HEAP_FILTER_TAGGED 0x4 태그 첨부의 객체를 필터링 한다. 태그가 붙은 객체가 제외된다.
JVMTI_HEAP_FILTER_UNTAGGED 0x8 태그 없음의 객체를 필터링 한다. 태그가 붙지 않은 객체가 제외된다.
JVMTI_HEAP_FILTER_CLASS_TAGGED 0x10 태그 첨부의 클래스를 가지는 객체를 필터링 한다. 태그가 붙은 클래스의 객체가 제외된다.
JVMTI_HEAP_FILTER_CLASS_UNTAGGED 0x2; 태그 없음의 클래스를 가지는 객체를 필터링 한다. 태그가 붙지 않은 클래스의 객체가 제외된다.

 

heap 콜백에 의해 반환되는 히프비짓트 제어 플래그를 사용하면(자), 반복 처리를 중지할 수 있습니다. 또,heap 참조 콜백은, 횡단(traverse) 대상이 되는 참조의 그래프를 없애기 위해서(때문에) 사용할 수도 있습니다 (JVMTI_VISIT_OBJECTS 를 설정하지 않는다).

히프비짓트 제어 플래그
정수 설명
JVMTI_VISIT_OBJECTS 0x100 어느 객체를 비짓트 할 때에 이 콜백이 FollowReferences 에 의해 기동된 것이었을 경우, 그 객체의 참조를 횡단(traverse) 한다. 그 이외의 경우는 무시된다.
JVMTI_VISIT_ABORT 0x8000 반복 처리를 중지. 다른 모든 비트를 무시한다.

 

heap 참조의 열거는, 보고 대상의 참조의 종류를 기술하는 목적으로,heap 참조 콜백프리미티브(primitive) 필드 콜백에 의해 제공됩니다.

heap 참조의 열거 (jvmtiHeapReferenceKind)
정수 설명
JVMTI_HEAP_REFERENCE_CLASS 1 객체로부터 그 클래스에의 참조.
JVMTI_HEAP_REFERENCE_FIELD 2 객체로부터, 그 객체의 몇개의 인스턴스 필드치에의 참조.
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 클래스로부터, 그 클래스의 몇개의 인터페이스에의 참조. 주:인터페이스는 정수 풀 참조 경유로 정의되기 (위해)때문에, 참조된 인터페이스는 참조의 종류가 JVMTI_HEAP_REFERENCE_CONSTANT_POOL 로 보고될 가능성도 있다.
JVMTI_HEAP_REFERENCE_STATIC_FIELD 8 클래스로부터 그 몇개의 static 필드치에의 참조.
JVMTI_HEAP_REFERENCE_CONSTANT_POOL 9 클래스로부터 정수 풀내의 해결 지음 엔트리에의 참조.
JVMTI_HEAP_REFERENCE_SUPERCLASS 10 클래스로부터 그 슈퍼 클래스에의 참조. 슈퍼 클래스가 java.lang.Object 의 경우, 콜백은 송신되지 않는다. 주:로드 된 클래스는 정수 풀 참조 경유로 슈퍼 클래스를 정의하기 위해(때문에), 참조된 슈퍼 클래스는 참조의 종류가 JVMTI_HEAP_REFERENCE_CONSTANT_POOL 로 보고될 가능성도 있다.
JVMTI_HEAP_REFERENCE_JNI_GLOBAL 21 heap 루트 참조 :JNI 글로벌 참조.
JVMTI_HEAP_REFERENCE_SYSTEM_CLASS 22 heap 루트 참조:시스템 클래스.
JVMTI_HEAP_REFERENCE_MONITOR 23 heap 루트 참조:모니터.
JVMTI_HEAP_REFERENCE_STACK_LOCAL 24 heap 루트 참조:스택상의 국소 변수.
JVMTI_HEAP_REFERENCE_JNI_LOCAL 25 heap 루트 참조 :JNI 로컬 참조.
JVMTI_HEAP_REFERENCE_THREAD 26 heap 루트 참조:thread.
JVMTI_HEAP_REFERENCE_OTHER 27 heap 루트 참조:다른 heap 루트 참조.

 

원시형의 단일 문자형 기술자의 정의.

원시형의 열거 (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 「I」 - 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_FIELDJVMTI_HEAP_REFERENCE_STATIC_FIELD 참조에 대해서 반환되는 참조 정보.

 

typedef struct {
    jint index;
} jvmtiHeapReferenceInfoField;
jvmtiHeapReferenceInfoField - 필드 참조용의 참조 정보 구조체
필드 설명
index jint JVMTI_HEAP_REFERENCE_FIELD 의 경우, 참조측 객체는 클래스에서도 인터페이스이기도 하지 않습니다. 이 경우,index 는, 참조측 객체의 클래스에 포함되는 필드의 인덱스입니다. 이후, 이 클래스를 C 라고 부릅니다.

 

JVMTI_HEAP_REFERENCE_STATIC_FIELD 의 경우, 참조측 객체는, 클래스 (이후 C 라고 부른다)와 인터페이스 (이후 I 라고 부른다)의 어느 쪽인가에 됩니다. 이 경우,index 는, 그 클래스 또는 인터페이스에 포함되는 필드의 인덱스입니다.

 

참조측 객체가 인터페이스가 아닌 경우, 필드의 인덱스는 다음과 같이 해 결정됩니다.
  • C 와 그 슈퍼 클래스에 포함되는 모든 필드의 리스트가 작성됩니다. 이 리스트는,java.lang.Object 내의 모든 필드에서 시작되어,C 내의 모든 필드에서 끝납니다.
  • 이 리스트내에서, 지정된 클래스의 필드가 GetClassFields 로부터 반환된 차례로 늘어놓을 수 있습니다.
  • 이 리스트내의 필드에, 인덱스 n,n+1,... 하지만 순서에 할당할 수 있습니다. n 는,C 가 구현하는 모든 인터페이스에 포함되는 필드의 카운트수입니다. C 는, 그 슈퍼 클래스가 직접 구현하는 모든 인터페이스와 그것들 인터페이스의 모든 슈퍼 인터페이스를 구현하고 있습니다.
참조측 객체가 인터페이스인 경우, 필드의 인덱스는 다음과 같이 해 결정됩니다.
  • I 내에서 직접 선언되고 있는 필드의 리스트가 작성됩니다.
  • 이 리스트내의 필드가 GetClassFields 로부터 반환된 차례로 늘어놓을 수 있습니다.
  • 이 리스트내의 필드에, 인덱스 n,n+1,... 하지만 순서에 할당할 수 있습니다. n 는,I 의 모든 슈퍼 인터페이스에 포함되는 필드의 카운트수입니다.
이 계산에는, 필드 수식자 (static, public, private 등)의 종류에 관계없이, 모든 필드가 포함됩니다.

 

예를 들어, 다음과 같은 클래스와 인터페이스가 지정되고 있다고 합니다.
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;
}
            
C1 로 불려 간 GetClassFields 로부터,C1 의 필드 a, b 가 이 차례로 돌려주어져C2 의 필드 q, r 가 이 차례로 반환되는 것으로 합니다. 클래스 C1 의 인스턴스의 필드 인덱스는, 다음과 같이 됩니다.
a 2 C1 가 구현하는 인터페이스내의 필드의 카운트수는 2 (n=2)입니다. 즉,I0pI1x 입니다.
b 3 후속의 인덱스.
클래스 C1 도 같은 필드 인덱스를 가집니다.

 

클래스 C2 의 인스턴스의 필드 인덱스는, 다음과 같이 됩니다.
a 3 C2 가 구현하는 인터페이스내의 필드의 카운트수는 3 (n=3)입니다. 즉,I0p,I1x, 및 I2y (C2 의 인터페이스)입니다. I0 의 필드 p 는 한 번 밖에 포함되지 않습니다.
b 4 「a」에 계속되는 인덱스.
q 5 「b」에 계속되는 인덱스.
r 6 「q」에 계속되는 인덱스.
클래스 C2 도 같은 필드 인덱스를 가집니다. 상기의 필드 「a」와 같이, 같은 필드가, 참조측 객체 마다 다른 인덱스를 가질 가능성이 있습니다. 또, 콜백으로부터 모든 필드 인덱스가 가시가 되는 것은 아닙니다만, 여기에서는 설명을 위해서(때문에) 모든 인덱스를 나타내고 있습니다.

 

인터페이스 I1 도 같은 필드 인덱스를 가집니다.
x 1 I1 의 슈퍼 인터페이스내의 필드의 카운트수는 1 (n=1)입니다. 즉,I0p 입니다.

배열 참조용의 참조 정보 구조체

JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT 참조에 대해서 반환되는 참조 정보.

 

typedef struct {
    jint index;
} jvmtiHeapReferenceInfoArray;
jvmtiHeapReferenceInfoArray - 배열 참조용의 참조 정보 구조체
필드 설명
index jint 배열의 인덱스.

정수 풀 참조용의 참조 정보 구조체

JVMTI_HEAP_REFERENCE_CONSTANT_POOL 참조에 대해서 반환되는 참조 정보.

 

typedef struct {
    jint index;
} jvmtiHeapReferenceInfoConstantPool;
jvmtiHeapReferenceInfoConstantPool - 정수 풀 참조용의 참조 정보 구조체
필드 설명
index jint 클래스의 정수 풀내의 인덱스. 「Java 가상 머신 스펙」「Constant Pool」섹션을 참조해 주세요.

국소 변수 참조용의 참조 정보 구조체

JVMTI_HEAP_REFERENCE_STACK_LOCAL 참조에 대해서 반환되는 참조 정보.

 

typedef struct {
    jlong thread_tag;
    jlong thread_id;
    jint depth;
    jmethodID method;
    jlocation location;
    jint slot;
} jvmtiHeapReferenceInfoStackLocal;
jvmtiHeapReferenceInfoStackLocal - 국소 변수 참조용의 참조 정보 구조체
필드 설명
thread_tag jlong 이 스택에 대응하는 thread의 태그. 태그 붙이고되어 있지 않은 경우는 제로.
thread_id jlong 이 스택에 대응하는 thread의 일의의 thread ID.
depth jint 프레임의 깊이.
method jmethodID 이 프레임내에서 실행되고 있는 메소드.
location jlocation 이 프레임내에서 현재 실행되고 있는 위치.
slot jint 국소 변수의 슬롯 번호.

JNI 로컬 참조용의 참조 정보 구조체

JVMTI_HEAP_REFERENCE_JNI_LOCAL 참조에 대해서 반환되는 참조 정보.

 

typedef struct {
    jlong thread_tag;
    jlong thread_id;
    jint depth;
    jmethodID method;
} jvmtiHeapReferenceInfoJniLocal;
jvmtiHeapReferenceInfoJniLocal - JNI 로컬 참조용의 참조 정보 구조체
필드 설명
thread_tag jlong 이 스택에 대응하는 thread의 태그. 태그 붙이고되어 있지 않은 경우는 제로.
thread_id jlong 이 스택에 대응하는 thread의 일의의 thread ID.
depth jint 프레임의 깊이.
method jmethodID 이 프레임내에서 실행되고 있는 메소드.

그 외의 참조용의 참조 정보 구조체

그 외의 참조에 대해서 반환되는 참조 정보.

 

typedef struct {
    jlong reserved1;
    jlong reserved2;
    jlong reserved3;
    jlong reserved4;
    jlong reserved5;
    jlong reserved6;
    jlong reserved7;
    jlong reserved8;
} jvmtiHeapReferenceInfoReserved;
jvmtiHeapReferenceInfoReserved - 그 외의 참조용의 참조 정보 구조체
필드 설명
reserved1 jlong 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved2 jlong 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved3 jlong 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved4 jlong 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved5 jlong 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved6 jlong 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved7 jlong 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved8 jlong 장래의 사용을 위해서(때문에) 예약이 끝난 상태.

참조 정보 구조체

참조 측에 관계해 반환되는 정보. 각종 참조 정보의 공용체로서 나타내집니다.

 

typedef union {
    jvmtiHeapReferenceInfoField field;
    jvmtiHeapReferenceInfoArray array;
    jvmtiHeapReferenceInfoConstantPool constant_pool;
    jvmtiHeapReferenceInfoStackLocal stack_local;
    jvmtiHeapReferenceInfoJniLocal jni_local;
    jvmtiHeapReferenceInfoReserved other;
} jvmtiHeapReferenceInfo;
jvmtiHeapReferenceInfo - 참조 정보 구조체
필드 설명
field jvmtiHeapReferenceInfoField JVMTI_HEAP_REFERENCE_FIELDJVMTI_HEAP_REFERENCE_STATIC_FIELD 참조의 참조측 정보.
array jvmtiHeapReferenceInfoArray JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT 참조의 참조측 정보.
constant_pool jvmtiHeapReferenceInfoConstantPool JVMTI_HEAP_REFERENCE_CONSTANT_POOL 참조의 참조측 정보.
stack_local jvmtiHeapReferenceInfoStackLocal JVMTI_HEAP_REFERENCE_STACK_LOCAL 참조의 참조측 정보.
jni_local jvmtiHeapReferenceInfoJniLocal JVMTI_HEAP_REFERENCE_JNI_LOCAL 참조의 참조측 정보.
other jvmtiHeapReferenceInfoReserved 장래의 사용을 위해서(때문에) 예약이 끝난 상태.

heap 콜백 함수 구조체

typedef struct {
    jvmtiHeapIterationCallback heap_iteration_callback;
    jvmtiHeapReferenceCallback heap_reference_callback;
    jvmtiPrimitiveFieldCallback primitive_field_callback;
    jvmtiArrayPrimitiveValueCallback array_primitive_value_callback;
    jvmtiStringPrimitiveValueCallback string_primitive_value_callback;
    jvmtiReservedCallback reserved5;
    jvmtiReservedCallback reserved6;
    jvmtiReservedCallback reserved7;
    jvmtiReservedCallback reserved8;
    jvmtiReservedCallback reserved9;
    jvmtiReservedCallback reserved10;
    jvmtiReservedCallback reserved11;
    jvmtiReservedCallback reserved12;
    jvmtiReservedCallback reserved13;
    jvmtiReservedCallback reserved14;
    jvmtiReservedCallback reserved15;
} jvmtiHeapCallbacks;
jvmtiHeapCallbacks - heap 콜백 함수 구조체
필드 설명
heap_iteration_callback jvmtiHeapIterationCallback heap내의 객체를 기술하기 위해서 불려 가는 콜백. IterateThroughHeap 함수에 의해 사용되어FollowReferences 함수에 의해 무시된다.
heap_reference_callback jvmtiHeapReferenceCallback 객체 참조를 기술하기 위해서 불려 가는 콜백. FollowReferences 함수에 의해 사용되어IterateThroughHeap 함수에 의해 무시된다.
primitive_field_callback jvmtiPrimitiveFieldCallback 프리미티브(primitive) 필드를 기술하기 위해서 불려 가는 콜백.
array_primitive_value_callback jvmtiArrayPrimitiveValueCallback 프리미티브(primitive)치의 배열을 기술하기 위해서 불려 가는 콜백.
string_primitive_value_callback jvmtiStringPrimitiveValueCallback String 치를 기술하기 위해서 불려 가는 콜백.
reserved5 jvmtiReservedCallback 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved6 jvmtiReservedCallback 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved7 jvmtiReservedCallback 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved8 jvmtiReservedCallback 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved9 jvmtiReservedCallback 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved10 jvmtiReservedCallback 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved11 jvmtiReservedCallback 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved12 jvmtiReservedCallback 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved13 jvmtiReservedCallback 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved14 jvmtiReservedCallback 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved15 jvmtiReservedCallback 장래의 사용을 위해서(때문에) 예약이 끝난 상태.

원리의 설명: heap 덤프 기능 (아래와 같이)은, 각 객체에 콜백을 사용합니다. 버퍼 방식 쪽이 throughput가 높다고 생각됩니다만, 테스트에서는, 그러한 결과는 얻을 수 있지 않습니다. 메모리 참조의 장소 또는 배열 액세스의 오바헷드에 의하는 것이라고 생각됩니다.

 


heap 반복 콜백

typedef jint (JNICALL *jvmtiHeapIterationCallback)
    (jlong class_tag,
     jlong size,
     jlong* tag_ptr,
     jint length,
     void* user_data);
에이전트에 의해 제공되는 콜백 함수. heap내의 객체를 기술합니다만, 값은 건네주지 않습니다.

 

이 함수는, 필요한비짓트 제어 플래그의 비트 벡터를 돌려줍니다. 이것에 의해, 반복 처리의 전체를 중지해야할 것인가 제발이 정해집니다 (JVMTI_VISIT_OBJECTS 플래그는 무시된다).

 

heap 콜백 함수의 제한을 참조해 주세요.

 

 

파라미터
이름 설명
class_tag jlong 객체의 클래스의 태그 (태그 붙이고되어 있지 않은 클래스의 경우는 제로). 객체가 실행시 클래스를 나타내는 경우,class_tagjava.lang.Class 에 관련짓고 된 태그 (java.lang.Class 가 태그 붙이고되어 있지 않은 경우는 제로).
size jlong 객체의 사이즈 (바이트 단위). GetObjectSize 를 참조.
tag_ptr jlong * 객체의 태그치. 태그 붙이고되어 있지 않은 객체의 경우는 제로. 객체와 관련짓는 태그의 값을 설정하기 위해(때문에), 에이전트는 파라미터에 의해 포인트 되는 jlong 를 설정한다.
length jint 이 객체가 배열인 경우는 그 배열의 길이. 그 이외의 경우는 마이너스 1 (-1).
user_data void * 사용자가 입력해, 반복 함수에게 건네진 데이터.

heap 참조 콜백

typedef jint (JNICALL *jvmtiHeapReferenceCallback)
    (jvmtiHeapReferenceKind reference_kind,
     const jvmtiHeapReferenceInfo* reference_info,
     jlong class_tag,
     jlong referrer_class_tag,
     jlong size,
     jlong* tag_ptr,
     jlong* referrer_tag_ptr,
     jint length,
     void* user_data);
에이전트에 의해 제공되는 콜백 함수. 어느 객체 또는 VM (참조측)로부터 다른 객체 (참조처)에의 참조, 또는 있는 heap 루트로부터 있는 참조처에의 참조를 기술합니다.

 

이 함수는, 필요한비짓트 제어 플래그의 비트 벡터를 돌려줍니다. 이것에 의해, 참조처가 참조하고 있는 객체를 비짓트해야할 것인가 제발이나, 반복 처리의 전체를 중지해야할 것인가 제발이 정해집니다.

 

heap 콜백 함수의 제한을 참조해 주세요.

 

 

파라미터
이름 설명
reference_kind jvmtiHeapReferenceKind 참조의 종류.
reference_info const jvmtiHeapReferenceInfo * 참조에 관한 상세. reference_kindJVMTI_HEAP_REFERENCE_FIELD ,JVMTI_HEAP_REFERENCE_STATIC_FIELD ,JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT ,JVMTI_HEAP_REFERENCE_CONSTANT_POOL ,JVMTI_HEAP_REFERENCE_STACK_LOCAL , 또는 JVMTI_HEAP_REFERENCE_JNI_LOCAL 의 경우로 설정된다. 그 이외의 경우는 NULL.
class_tag jlong 참조되는 객체의 클래스의 태그 (태그 붙이고되어 있지 않은 클래스의 경우는 제로). 참조된 객체가 실행시 클래스를 나타내는 경우,class_tagjava.lang.Class 에 관련짓고 된 태그 (java.lang.Class 가 태그 붙이고되어 있지 않은 경우는 제로).
referrer_class_tag jlong 참조측 객체의 클래스의 태그 (클래스에 태그가 붙지 않은가 참조처가 heap 루트인 경우는 제로). 참조측 객체가 실행시 클래스를 나타내는 경우,referrer_class_tagjava.lang.Class 에 관련짓고 된 태그 (java.lang.Class 가 태그 붙이고되어 있지 않은 경우는 제로).
size jlong 참조되는 객체의 사이즈 (바이트 단위). GetObjectSize 를 참조.
tag_ptr jlong * 참조되는 객체의 태그치를 포인트 한다. 태그 붙이고되어 있지 않은 객체의 경우는 제로를 포인트 한다. 객체와 관련짓는 태그의 값을 설정하기 위해(때문에), 에이전트는 파라미터에 의해 포인트 되는 jlong 를 설정한다.
referrer_tag_ptr jlong * 참조측 객체의 태그를 포인트 한다. 참조측 객체가 태그 붙이고되어 있지 않은 경우는 제로를 포인트 한다. 참조측이 객체가 아닌 (즉, 이 콜백의 보고 대상이 heap 루트이다) 경우는 NULL. 참조측 객체와 관련짓는 태그치를 설정하기 위해(때문에), 에이전트는 파라미터에 의해 포인트 되는 jlong 를 설정한다. 이 콜백의 보고 대상이, 어느 객체로부터 그 객체 자신에게로의 참조인 경우는,referrer_tag_ptr == tag_ptr 가 된다.
length jint 이 객체가 배열인 경우는 그 배열의 길이. 그 이외의 경우는 마이너스 1 (-1).
user_data void * 사용자가 입력해, 반복 함수에게 건네진 데이터.

프리미티브(primitive) 필드 콜백

typedef jint (JNICALL *jvmtiPrimitiveFieldCallback)
    (jvmtiHeapReferenceKind kind,
     const jvmtiHeapReferenceInfo* info,
     jlong object_class_tag,
     jlong* object_tag_ptr,
     jvalue value,
     jvmtiPrimitiveType value_type,
     void* user_data);
어느 객체 ( 「객체」)의 프리미티브(primitive) 필드를 기술하는, 에이전트에 의해 제공되는 콜백 함수. 프리미티브(primitive) 필드란, 형태가 원시형인 필드입니다. 이 콜백은, 객체가 클래스의 경우는 static 필드를, 그 이외의 경우는 인스턴스 필드를 각각 기술합니다.

 

이 함수는, 필요한비짓트 제어 플래그의 비트 벡터를 돌려줍니다. 이것에 의해, 반복 처리의 전체를 중지해야할 것인가 제발이 정해집니다 (JVMTI_VISIT_OBJECTS 플래그는 무시된다).

 

heap 콜백 함수의 제한을 참조해 주세요.

 

 

파라미터
이름 설명
kind jvmtiHeapReferenceKind 필드의 종류 -- 인스턴스 또는 static (JVMTI_HEAP_REFERENCE_FIELD 또는 JVMTI_HEAP_REFERENCE_STATIC_FIELD ).
info const jvmtiHeapReferenceInfo * 어느 필드인가 (필드의 인덱스).
object_class_tag jlong 객체의 클래스의 태그 (태그 붙이고되어 있지 않은 클래스의 경우는 제로). 객체가 실행시 클래스를 나타내는 경우,object_class_tagjava.lang.Class 에 관련짓고 된 태그 (java.lang.Class 가 태그 붙이고되어 있지 않은 경우는 제로).
object_tag_ptr jlong * 객체의 태그를 포인트 한다. 태그 붙이고되어 있지 않은 객체의 경우는 제로를 포인트 한다. 객체와 관련짓는 태그의 값을 설정하기 위해(때문에), 에이전트는 파라미터에 의해 포인트 되는 jlong 를 설정한다.
value jvalue 필드의 값.
value_type jvmtiPrimitiveType 필드의 형태.
user_data void * 사용자가 입력해, 반복 함수에게 건네진 데이터.

배열 프리미티브(primitive)치 콜백

typedef jint (JNICALL *jvmtiArrayPrimitiveValueCallback)
    (jlong class_tag,
     jlong size,
     jlong* tag_ptr,
     jint element_count,
     jvmtiPrimitiveType element_type,
     const void* elements,
     void* user_data);
에이전트에 의해 제공되는 콜백 함수. 어느 원시형의 배열내의 값을 기술합니다.

 

이 함수는, 필요한비짓트 제어 플래그의 비트 벡터를 돌려줍니다. 이것에 의해, 반복 처리의 전체를 중지해야할 것인가 제발이 정해집니다 (JVMTI_VISIT_OBJECTS 플래그는 무시된다).

 

heap 콜백 함수의 제한을 참조해 주세요.

 

 

파라미터
이름 설명
class_tag jlong 배열 객체의 클래스의 태그 (태그 붙이고되어 있지 않은 클래스의 경우는 제로).
size jlong 배열의 사이즈 (바이트 단위). GetObjectSize 를 참조.
tag_ptr jlong * 배열 객체의 태그를 포인트 한다. 태그 붙이고되어 있지 않은 객체의 경우는 제로를 포인트 한다. 객체와 관련짓는 태그의 값을 설정하기 위해(때문에), 에이전트는 파라미터에 의해 포인트 되는 jlong 를 설정한다.
element_count jint 프리미티브(primitive) 배열의 길이.
element_type jvmtiPrimitiveType 배열의 요소의 형태.
elements const void* 배열의 요소. 이 배열은,element_type 의 사이즈를 가지는 element_count 개의 항목으로부터 완성되는 팩 배열이 된다.
user_data void * 사용자가 입력해, 반복 함수에게 건네진 데이터.

캐릭터 라인 프리미티브(primitive)치 콜백

typedef jint (JNICALL *jvmtiStringPrimitiveValueCallback)
    (jlong class_tag,
     jlong size,
     jlong* tag_ptr,
     const jchar* value,
     jint value_length,
     void* user_data);
에이전트에 의해 제공되는 콜백 함수. java.lang.String 의 값을 기술합니다.

 

이 함수는, 필요한비짓트 제어 플래그의 비트 벡터를 돌려줍니다. 이것에 의해, 반복 처리의 전체를 중지해야할 것인가 제발이 정해집니다 (JVMTI_VISIT_OBJECTS 플래그는 무시된다).

 

heap 콜백 함수의 제한을 참조해 주세요.

 

 

파라미터
이름 설명
class_tag jlong String 클래스의 클래스의 태그 (태그 붙이고되어 있지 않은 클래스의 경우는 제로).
size jlong 캐릭터 라인의 사이즈 (바이트 단위). GetObjectSize 를 참조.
tag_ptr jlong * String 객체의 태그를 포인트 한다. 태그 붙이고되어 있지 않은 객체의 경우는 제로를 포인트 한다. 객체와 관련짓는 태그의 값을 설정하기 위해(때문에), 에이전트는 파라미터에 의해 포인트 되는 jlong 를 설정한다.
value const jchar * String 의 값. Unicode 캐릭터 라인으로서 encode 된다.
value_length jint 캐릭터 라인의 길이. 이 길이는, 캐릭터 라인내의 16 비트 Unicode 문자의 수에 동일해진다.
user_data void * 사용자가 입력해, 반복 함수에게 건네진 데이터.

장래 사용하기 위해서 예약된 콜백

typedef jint (JNICALL *jvmtiReservedCallback)
    ();
플레이스홀더- -- 장래의 사용을 위해서(때문에) 예약이 끝난 상태입니다.

 

 

파라미터
이름 설명

참조의 추적

jvmtiError
FollowReferences(jvmtiEnv* env,
            jint heap_filter,
            jclass klass,
            jobject initial_object,
            const jvmtiHeapCallbacks* callbacks,
            const void* user_data)

이 함수는, 지정된 객체로부터 직접적, 간접적으로 도달 가능한 객체의 traversal를 개시합니다. initial_object 가 지정되지 않았던 경우는, heap 루트로부터 도달 가능한 모든 객체가 대상이 됩니다. heap 루트는, 시스템 클래스, JNI 글로벌, thread 스택으로부터의 참조, 가베지 컬렉션의 목적으로 루트로서 사용되는 그 외의 객체세트입니다.

 

이 함수는, 참조 그래프를 횡단(traverse) 하는 것으로 동작합니다. A,B,... 하지만 객체를 나타낸다고 합니다. A 로부터 B 에의 참조가 횡단(traverse) 되었을 경우, heap 루트로부터 B 에의 참조가 횡단(traverse) 되었을 경우, 또는 Binitial_object 로서 지정되었을 경우에,B 가 「비짓트」되었다고 합니다. A 로부터 B 에의 참조가 횡단(traverse) 되는 것은,A 의 비짓트 다음에. 참조의 보고 순서는, 참조의 횡단(traverse) 순서와 같게 됩니다. 객체 참조의 보고는, 에이전트로부터 제공되는 콜백 함수 jvmtiHeapReferenceCallback 를 호출하는 것으로 행해집니다. A 로부터 B 에의 참조로,A 는 「참조측」,B 는 「참조처」라고 불립니다. 콜백은, 참조 측에서의 참조마다 1 회만 불려 갑니다. 참조 사이클이나, 참조측인 패스가 복수 존재하는 경우도 같습니다. 참조측과 참조처와의 사이에 참조가 복수 존재할 가능성이 있습니다만, 그 경우는, 각각의 참조가 보고됩니다. 이러한 참조를 구별하려면 ,jvmtiHeapReferenceCallback 콜백의 reference_kindreference_info 파라미터를 확인합니다.

 

이 함수가 보고하는 것은, 객체 참조의 Java 프로그라밍뙻뚭뷰이며, 가상 머신 구현 뷰가 아닙니다. null 이외의 다음의 객체 참조가 보고됩니다.

  • 인스턴스 객체는, 각 비프리미티브(primitive) 인스턴스 필드 (상속된 필드도 포함한다)에의 참조를 보고합니다.
  • 인스턴스 객체는, 그 객체의 형태 (클래스)에의 참조를 보고합니다.
  • 클래스는, 슈퍼 클래스에의 참조와 직접 구현 또는 확장한 인터페이스에의 참조를 보고합니다.
  • 클래스는, 클래스 로더, 보호 도메인, 서명자, 및 정수 풀내의 해결 지음 엔트리에의 참조를 보고합니다.
  • 클래스는, 직접 선언된 각 비프리미티브(primitive) static 필드에의 참조를 보고합니다.
  • 배열은, 그 배열의 형태 (클래스)와 각 배열 요소에의 참조를 보고한다.
  • 프리미티브(primitive) 배열은, 그 배열의 형태에의 참조를 보고합니다.

 

또, 이 함수를 사용하면(자), 프리미티브(primitive) (객체 이외) 치를 조사할 수도 있습니다. 배열 또는 String 의 프리미티브(primitive)치의 보고는, 객체의 비짓트의 완료 후에 행해집니다. 그 보고시에는, 에이전트가 제공하는 콜백 함수 jvmtiArrayPrimitiveValueCallback 또는 jvmtiStringPrimitiveValueCallback 가 불려 갑니다. 어느 프리미티브(primitive) 필드의 보고는, 그 필드를 포함한 객체의 비짓트의 완료 후에 행해집니다. 그 보고시에는, 에이전트가 제공하는 콜백 함수 jvmtiPrimitiveFieldCallback 가 불려 갑니다.

 

콜백이 제공될까 NULL 일까는, 그 콜백이 불려 갈지 어떨지만을 결정합니다. 어느 객체가 비짓트 될까나, 다른 콜백이 불려 갈지 어떨지에 영향을 줄 것은 없습니다. 다만,jvmtiHeapReferenceCallback 로부터 반환되는비짓트 제어 플래그는, 현재의 객체가 참조하고 있는 객체를 비짓트 할지 어떨지를 결정합니다. 이 함수의 파라미터로서 지정되는heap 필터 플래그klass 는, 비짓트 되는 객체는 제어합니다만, 콜백에 의해 보고되는 객체 및 프리미티브(primitive)치는 제어합니다. 예를 들어, 설정된 유일한 콜백이배열 프리미티브(primitive)치 콜백 이며,klass 가 바이트 배열의 클래스로 설정되었을 경우, 바이트 배열만이 보고됩니다. 이상을 정리했던 것이 다음의 겉(표)입니다.

 

  비짓트 대상 객체를 제어한다 보고 대상 객체를 제어한다 보고 대상 프리미티브(primitive)을 제어한다
jvmtiHeapReferenceCallback 로부터 반환되는 히프비짓트 제어 플래그 . 비짓트가 제어되기 (위해)때문에 . 비짓트가 제어되기 (위해)때문에
callbacks 세트내의 object_reference_callback 아니오 아니오
heap_filter 아니오
klass 아니오

 

이 함수의 실행중, heap의 상태는 변화하지 않습니다. 객체의 할당이나 가베지 컬렉션은 행해지지 않습니다. 따라서, 객체 (포함되고 있는 값도 포함한다)는 변경되지 않습니다. 결과적으로, Java 프로그램 언어의 코드를 실행하는 thread, Java 프로그램 언어의 코드의 실행을 재개하려고 하고 있는 thread, JNI 함수를 실행하려고 하고 있는 thread는, 정지합니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 115 1.1

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_tag_objects heap의 카테고리에 설명되고 있도록(듯이), 태그를 설정해, 취득할 수 있다.

 

파라미터
이름 설명
heap_filter jint heap 필터 플래그의 비트 벡터는, 콜백 함수의 호출 대상이 되는 객체를 제한한다. 이것은 객체 콜백과 프리미티브(primitive) 콜백의 양쪽 모두에 들어맞는다.
klass jclass 콜백이 보고하는 것은, 객체가 이 클래스의 인스턴스인 경우 뿐이다. 객체가 klass 의 슈퍼 클래스의 인스턴스인 경우, 그 객체는 보고되지 않는다. klass 가 인터페이스의 경우, 객체의 보고는 행해지지 않는다. 이것은 객체 콜백과 프리미티브(primitive) 콜백의 양쪽 모두에 들어맞는다.

 

klassNULL 의 경우, 콜백은 특정의 클래스의 인스턴스에 제한되지 않는다.
initial_object jobject 추적하는 객체

 

initial_objectNULL 의 경우, heap 루트로부터 참조의 추적을 한다.
callbacks const jvmtiHeapCallbacks * 일련의 콜백 함수를 정의하는 구조체.

 

에이전트는 jvmtiHeapCallbacks 에 포인터를 건네준다.
user_data const void * 사용자가 입력해, 콜백에게 건네지는 데이터.

 

에이전트가 포인터를 건네준다. user_dataNULL 의 경우,NULL 가 사용자 지정 데이터로서 건네받는다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_tag_objects 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_CLASS klass 는 유효한 클래스는 아니다.
JVMTI_ERROR_INVALID_OBJECT initial_object 는 유효한 객체는 아니다.
JVMTI_ERROR_NULL_POINTER callbacksNULL.

heap내에서의 반복해

jvmtiError
IterateThroughHeap(jvmtiEnv* env,
            jint heap_filter,
            jclass klass,
            const jvmtiHeapCallbacks* callbacks,
            const void* user_data)

heap내의 모든 객체에 대한 반복 처리를 기동합니다. 도달 가능한 객체도, 그렇지 않은 객체도 포함됩니다. 객체의 비짓트는 특정의 차례에서는 행해지지 않습니다.

 

heap 객체의 보고는, 에이전트로부터 제공되는 콜백 함수 jvmtiHeapIterationCallback 를 호출하는 것으로 행해집니다. 객체간의 참조는 보고되지 않습니다. 도달 가능한 객체만이 필요한 경우나, 객체 참조의 정보가 필요한 경우에는,FollowReferences 를 사용해 주세요.

 

또, 이 함수를 사용하면(자), 프리미티브(primitive) (객체 이외) 치를 조사할 수도 있습니다. 배열 또는 String 의 프리미티브(primitive)치의 보고는, 객체의 비짓트의 완료 후에 행해집니다. 그 보고시에는, 에이전트가 제공하는 콜백 함수 jvmtiArrayPrimitiveValueCallback 또는 jvmtiStringPrimitiveValueCallback 가 불려 갑니다. 어느 프리미티브(primitive) 필드의 보고는, 그 필드를 포함한 객체의 비짓트의 완료 후에 행해집니다. 그 보고시에는, 에이전트가 제공하는 콜백 함수 jvmtiPrimitiveFieldCallback 가 불려 갑니다.

 

콜백으로부터 반환되는히프비짓트 제어 플래그에 의해 반복 처리가 중지되지 않는 한, heap내의 모든 객체가 비짓트 됩니다. 콜백이 제공될까 NULL 일까는, 그 콜백이 불려 갈지 어떨지만을 결정합니다. 어느 객체가 비짓트 될까나, 다른 콜백이 불려 갈지 어떨지에 영향을 줄 것은 없습니다. 이 함수의 파라미터로서 지정되는heap 필터 플래그klass 는, 비짓트 되는 객체는 제어합니다만, 콜백에 의해 보고되는 객체 및 프리미티브(primitive)치는 제어합니다. 예를 들어, 설정된 유일한 콜백이배열 프리미티브(primitive)치 콜백 이며,klass 가 바이트 배열의 클래스로 설정되었을 경우, 바이트 배열만이 보고됩니다. 이상을 정리했던 것이 다음의 겉(표)입니다. 이것을 FollowReferences 와 비교해 주세요.

 

  비짓트 대상 객체를 제어한다 보고 대상 객체를 제어한다 보고 대상 프리미티브(primitive)을 제어한다
jvmtiHeapIterationCallback 로부터 반환되는 히프비짓트 제어 플래그 아니오
(다만, 반복 처리가 중지되는 경우는 제외하다)
아니오
(다만, 반복 처리가 중지되는 경우는 제외하다)
아니오
(다만, 반복 처리가 중지되는 경우는 제외하다)
callbacks 세트내의 object_callback 아니오 아니오
heap_filter 아니오
klass 아니오

 

이 함수의 실행중, heap의 상태는 변화하지 않습니다. 객체의 할당이나 가베지 컬렉션은 행해지지 않습니다. 따라서, 객체 (포함되고 있는 값도 포함한다)는 변경되지 않습니다. 결과적으로, Java 프로그램 언어의 코드를 실행하는 thread, Java 프로그램 언어의 코드의 실행을 재개하려고 하고 있는 thread, JNI 함수를 실행하려고 하고 있는 thread는, 정지합니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 116 1.1

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_tag_objects heap의 카테고리에 설명되고 있도록(듯이), 태그를 설정해, 취득할 수 있다.

 

파라미터
이름 설명
heap_filter jint heap 필터 플래그의 비트 벡터는, 콜백 함수의 호출 대상이 되는 객체를 제한한다. 이것은 객체 콜백과 프리미티브(primitive) 콜백의 양쪽 모두에 들어맞는다.
klass jclass 콜백이 보고하는 것은, 객체가 이 클래스의 인스턴스인 경우 뿐이다. 객체가 klass 의 슈퍼 클래스의 인스턴스인 경우, 그 객체는 보고되지 않는다. klass 가 인터페이스의 경우, 객체의 보고는 행해지지 않는다. 이것은 객체 콜백과 프리미티브(primitive) 콜백의 양쪽 모두에 들어맞는다.

 

klassNULL 의 경우, 콜백은 특정의 클래스의 인스턴스에 제한되지 않는다.
callbacks const jvmtiHeapCallbacks * 일련의 콜백 함수를 정의하는 구조체.

 

에이전트는 jvmtiHeapCallbacks 에 포인터를 건네준다.
user_data const void * 사용자가 입력해, 콜백에게 건네지는 데이터.

 

에이전트가 포인터를 건네준다. user_dataNULL 의 경우,NULL 가 사용자 지정 데이터로서 건네받는다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_tag_objects 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_CLASS klass 는 유효한 클래스는 아니다.
JVMTI_ERROR_NULL_POINTER callbacksNULL.

태그의 취득

jvmtiError
GetTag(jvmtiEnv* env,
            jobject object,
            jlong* tag_ptr)

객체에 관련지을 수 있었던 태그를 가져옵니다. 태그는 장 정수치로, 일반적으로, 객체 정보의 일의의 식별자 또는 포인터를 포함하기 위해서 사용됩니다. 태그의 설정에는,SetTag 함수를 사용합니다. 태그가 설정되어 있지 않은 객체는, 태그치로서 제로를 돌려줍니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 106 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_tag_objects heap의 카테고리에 설명되고 있도록(듯이), 태그를 설정해, 취득할 수 있다.

 

파라미터
이름 설명
object jobject 태그가 취득되는 객체.
tag_ptr jlong * 돌아왔을 때, 참조되는 장 정수치에 태그치가 설정되어 있다.

 

에이전트는 jlong 에 포인터를 건네준다. 돌아왔을 때,jlong 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_tag_objects 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_OBJECT object 가 객체는 아니다.
JVMTI_ERROR_NULL_POINTER tag_ptrNULL.

태그의 설정

jvmtiError
SetTag(jvmtiEnv* env,
            jobject object,
            jlong tag)

객체에 관련지을 수 있었던 태그를 설정합니다. 태그는 장 정수치로, 일반적으로, 객체 정보의 일의의 식별자 또는 포인터를 포함하기 위해서 사용됩니다. 태그의 표시에는,GetTag 함수를 사용합니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 107 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_tag_objects heap의 카테고리에 설명되고 있도록(듯이), 태그를 설정해, 취득할 수 있다

 

파라미터
이름 설명
object jobject 태그가 설정되는 객체.
tag jlong 태그의 새로운 값.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_tag_objects 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_OBJECT object 가 객체는 아니다.

태그를 사용한 객체의 취득

jvmtiError
GetObjectsWithTags(jvmtiEnv* env,
            jint tag_count,
            const jlong* tags,
            jint* count_ptr,
            jobject** object_result_ptr,
            jlong** tag_result_ptr)

heap내의 지정된 태그를 가지는 객체를 돌려줍니다. 객체와 태그의 병행 배열의 형식이 됩니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 114 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_tag_objects heap의 카테고리에 설명되고 있도록(듯이), 태그를 설정해, 취득할 수 있다

 

파라미터
이름 설명
tag_count jint 주사 하는 태그의 수.
tags const jlong * 이러한 태그를 붙일 수 있었던 객체를 주사 한다. 이 배열내에서는, 제로는 사용할 수 없다.

 

에이전트는 jlongtag_count 요소의 배열을 건네준다.
count_ptr jint * tags 내의 임의의 태그를 가지는 객체의 수를 돌려준다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
object_result_ptr jobject ** tags 내의 임의의 태그를 가지는 객체의 배열을 돌려준다.

 

에이전트는 jobject* 에 포인터를 건네준다. 돌아왔을 때,jobject* 는, 사이즈 *count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. object_result_ptrNULL 의 경우, 이 정보는 돌려주어지지 않다. object_result_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다.
tag_result_ptr jlong ** object_result_ptr 내의 각 객체에 대해서, 대응하는 인덱스의 태그를 돌려준다.

 

에이전트는 jlong* 에 포인터를 건네준다. 돌아왔을 때,jlong* 는, 사이즈 *count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. tag_result_ptrNULL 의 경우, 이 정보는 돌려주어지지 않다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_tag_objects 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_ILLEGAL_ARGUMENT tags 내에 제로가 존재한다.
JVMTI_ERROR_ILLEGAL_ARGUMENT tag_count0 보다 작다.
JVMTI_ERROR_NULL_POINTER tagsNULL.
JVMTI_ERROR_NULL_POINTER count_ptrNULL.

가베지 컬렉션의 강제

jvmtiError
ForceGarbageCollection(jvmtiEnv* env)

VM 에 가베지 컬렉션의 실행을 강제합니다. 가베지 컬렉션은 가능한 한 완전하게 행해집니다. 이 함수는, 파이나라이자를 실행시키지 않습니다. 이 함수는, 가베지 컬렉션이 완료할 때까지 종료하지 않습니다.

 

가베지 컬렉션은 가능한 한 완전하게 실행됩니다만, 이 함수가 돌아오기까지 모든 ObjectFree 이벤트가 송신되고 있다고 하는 보증은 없습니다. 특히, finalize 기다리는 객체가 해제되지 않을 가능성이 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 108 1.0

 

권한
필요한 기능

 

파라미터
이름 설명

 

에러
이 함수는,범용 에러를 돌려준다

 


heap (1.0)

heap (1.0)의 함수:

heap (1.0)의 함수형:

heap (1.0)의 형태:

이러한 함수 및 데이터형은 원의 JVM TI Version 1.0 으로 도입된 것이어, 보다 강력해 유연성의 높은 버젼 으로 옮겨놓을 수 있었습니다. 새로운 버젼의 특징을 다음에 나타냅니다.

  • 프리미티브(primitive)치 (Strings, 배열, 및 프리미티브(primitive) 필드의 값)에의 액세스를 가능하게 한다
  • 참조측의 태그를 설정할 수 있도록(듯이) 한다. 이 때문에, 보다 효율적인 로컬라이즈 된 참조 그래프의 구축이 가능해진다
  • 보다 광범위한 필터링 기능을 제공한다
  • 확장 가능하다. 이 때문에, JVM TI 의 장래의 버젼으로 확장을 베풀 수가 있다

 

현재의 heap 함수 를 사용해 주세요.

 

heap 객체의 필터의 열거 (jvmtiHeapObjectFilter)
정수 설명
JVMTI_HEAP_OBJECT_TAGGED 1 태그 첨부 객체만.
JVMTI_HEAP_OBJECT_UNTAGGED 2 태그 없음 객체만.
JVMTI_HEAP_OBJECT_EITHER 3 태그 첨부 객체 또는 태그 없음 객체.
heap 루트의 종류의 열거 (jvmtiHeapRootKind)
정수 설명
JVMTI_HEAP_ROOT_JNI_GLOBAL 1 JNI 글로벌 참조.
JVMTI_HEAP_ROOT_SYSTEM_CLASS 2 시스템 클래스.
JVMTI_HEAP_ROOT_MONITOR 3 모니터.
JVMTI_HEAP_ROOT_STACK_LOCAL 4 스택 로컬.
JVMTI_HEAP_ROOT_JNI_LOCAL 5 JNI 로컬 참조.
JVMTI_HEAP_ROOT_THREAD 6 thread
JVMTI_HEAP_ROOT_OTHER 7 그 외.
객체 참조의 열거 (jvmtiObjectReferenceKind)
정수 설명
JVMTI_REFERENCE_CLASS 1 객체로부터 그 클래스의 참조.
JVMTI_REFERENCE_FIELD 2 객체로부터, 그 객체의 몇개의 인스턴스 필드의 값에의 참조. 이런 종류의 참조의 경우,jvmtiObjectReferenceCallbackreferrer_index 파라미터는 인스턴스 필드의 인덱스. 인덱스는, 모든 객체의 필드의 순서가 기본으로 된다. 클래스에서 직접 선언된 static 및 인스턴스 필드가 포함되는 것 외에 슈퍼 클래스 및 슈퍼 인터페이스로 선언된 모든 필드 (public 와 private 의 양쪽 모두)가 포함된다. 그 때문에 인덱스는, 직접 선언된 클래스에 있는 필드의 인덱스 (「GetClassFields」 참조)와 모든 슈퍼 클래스 및 슈퍼 인터페이스로 선언된 필드 (public 와 private 의 양쪽 모두)를 서로 더한 것으로 계산된다. 인덱스는 0 으로부터 시작된다.
JVMTI_REFERENCE_ARRAY_ELEMENT 3 배열로부터, 이 배열의 몇개의 요소에의 참조. 이런 종류의 참조의 경우,jvmtiObjectReferenceCallbackreferrer_index 파라미터는 배열의 인덱스.
JVMTI_REFERENCE_CLASS_LOADER 4 클래스로부터 그 클래스 로더에의 참조.
JVMTI_REFERENCE_SIGNERS 5 클래스로부터 그 서명자의 배열에의 참조.
JVMTI_REFERENCE_PROTECTION_DOMAIN 6 클래스로부터 그 보호 도메인에의 참조.
JVMTI_REFERENCE_INTERFACE 7 클래스로부터, 그 클래스의 몇개의 인터페이스에의 참조.
JVMTI_REFERENCE_STATIC_FIELD 8 클래스로부터, 그 클래스의 몇개의 static 필드의 값에의 참조. 이런 종류의 참조의 경우,jvmtiObjectReferenceCallbackreferrer_index 파라미터는 static 필드의 인덱스. 인덱스는, 모든 객체의 필드의 순서가 기본으로 된다. 클래스에서 직접 선언된 static 및 인스턴스 필드가 포함되는 것 외에 슈퍼 클래스 및 슈퍼 인터페이스로 선언된 모든 필드 (public 와 private 의 양쪽 모두)가 포함된다. 그 때문에 인덱스는, 직접 선언된 클래스에 있는 필드의 인덱스 (「GetClassFields」 참조)와 모든 슈퍼 클래스 및 슈퍼 인터페이스로 선언된 필드 (public 와 private 의 양쪽 모두)를 서로 더한 것으로 계산된다. 인덱스는 0 으로부터 시작된다. 주:이 정의는, JVM TI 1.0 스펙에서의 정의와 다르다.

원리의 설명:기존의 구현 속에서, 1.0 의 정의를 사용한 것은 없다.

JVMTI_REFERENCE_CONSTANT_POOL 9 클래스로부터 정수 풀내의 해결 지음 엔트리의 참조. 이런 종류의 참조의 경우,jvmtiObjectReferenceCallbackreferrer_index 파라미터는, 클래스의 정수 풀 테이블의 인덱스로, 1 으로부터 시작된다. 「Java 가상 머신 스펙」「Constant Pool」섹션을 참조.
반복 제어의 열거 (jvmtiIterationControl)
정수 설명
JVMTI_ITERATION_CONTINUE 1 반복 처리를 계속. 참조의 반복 처리의 경우, 이 객체의 참조에 따른다.
JVMTI_ITERATION_IGNORE 2 반복 처리를 계속. 참조의 반복 처리의 경우, 이 객체의 참조를 무시한다.
JVMTI_ITERATION_ABORT 0 반복 처리를 중지.

 


heap 객체의 콜백

typedef jvmtiIterationControl (JNICALL *jvmtiHeapObjectCallback)
    (jlong class_tag,
     jlong size,
     jlong* tag_ptr,
     void* user_data);
에이전트에 의해 제공되는 콜백 함수. heap내의 객체를 기술합니다만, 값은 건네주지 않습니다.

 

반복 처리를 계속하는 경우, 반환값은 JVMTI_ITERATION_CONTINUE 입니다. 반복 처리를 정지하는 경우, 반환값은 JVMTI_ITERATION_ABORT 입니다.

 

heap 콜백 함수의 제한을 참조해 주세요.

 

 

파라미터
이름 설명
class_tag jlong 객체의 클래스의 태그 (태그 붙이고되어 있지 않은 클래스의 경우는 제로). 객체가 실행시 클래스를 나타내는 경우,class_tagjava.lang.Class 에 관련짓고 된 태그 (java.lang.Class 가 태그 붙이고되어 있지 않은 경우는 제로).
size jlong 객체의 사이즈 (바이트 단위). GetObjectSize 를 참조.
tag_ptr jlong * 객체의 태그치. 태그 붙이고되어 있지 않은 객체의 경우는 제로. 객체와 관련짓는 태그의 값을 설정하기 위해(때문에), 에이전트는 파라미터에 의해 포인트 되는 jlong 를 설정한다.
user_data void * 사용자가 입력해, 반복 함수에게 건네진 데이터.

heap 루트 객체의 콜백

typedef jvmtiIterationControl (JNICALL *jvmtiHeapRootCallback)
    (jvmtiHeapRootKind root_kind,
     jlong class_tag,
     jlong size,
     jlong* tag_ptr,
     void* user_data);
에이전트에 의해 제공되는 콜백 함수. 가베지 컬렉션의 목적으로, 루트 객체에 대해 설명합니다만, 값은 건네주지 않습니다.

 

반복 처리를 계속하는 경우, 반환값은 JVMTI_ITERATION_CONTINUE 입니다. 참조 객체로부터의 참조를 속행하지 않고 반복 처리를 계속하는 경우, 반환값은 JVMTI_ITERATION_IGNORE 입니다. 반복 처리를 정지하는 경우, 반환값은 JVMTI_ITERATION_ABORT 입니다.

 

heap 콜백 함수의 제한을 참조해 주세요.

 

 

파라미터
이름 설명
root_kind jvmtiHeapRootKind heap 루트의 종류
class_tag jlong 객체의 클래스의 태그 (태그 붙이고되어 있지 않은 클래스의 경우는 제로). 객체가 실행시 클래스를 나타내는 경우,class_tagjava.lang.Class 에 관련짓고 된 태그 (java.lang.Class 가 태그 붙이고되어 있지 않은 경우는 제로).
size jlong 객체의 사이즈 (바이트 단위). GetObjectSize 를 참조.
tag_ptr jlong * 객체의 태그치. 태그 붙이고되어 있지 않은 객체의 경우는 제로. 객체와 관련짓는 태그의 값을 설정하기 위해(때문에), 에이전트는 파라미터에 의해 포인트 되는 jlong 를 설정한다.
user_data void * 사용자가 입력해, 반복 함수에게 건네진 데이터.

스택 참조 객체의 콜백

typedef jvmtiIterationControl (JNICALL *jvmtiStackReferenceCallback)
    (jvmtiHeapRootKind root_kind,
     jlong class_tag,
     jlong size,
     jlong* tag_ptr,
     jlong thread_tag,
     jint depth,
     jmethodID method,
     jint slot,
     void* user_data);
에이전트에 의해 제공되는 콜백 함수. 가베지 컬렉션의 목적으로, 스택상의 루트 객체에 대해 설명합니다만, 값은 건네주지 않습니다.

 

반복 처리를 계속하는 경우, 반환값은 JVMTI_ITERATION_CONTINUE 입니다. 참조 객체로부터의 참조를 속행하지 않고 반복 처리를 계속하는 경우, 반환값은 JVMTI_ITERATION_IGNORE 입니다. 반복 처리를 정지하는 경우, 반환값은 JVMTI_ITERATION_ABORT 입니다.

 

heap 콜백 함수의 제한을 참조해 주세요.

 

 

파라미터
이름 설명
root_kind jvmtiHeapRootKind 루트의 종류 (JVMTI_HEAP_ROOT_STACK_LOCAL 또는 JVMTI_HEAP_ROOT_JNI_LOCAL).
class_tag jlong 객체의 클래스의 태그 (태그 붙이고되어 있지 않은 클래스의 경우는 제로). 객체가 실행시 클래스를 나타내는 경우,class_tagjava.lang.Class 에 관련짓고 된 태그 (java.lang.Class 가 태그 붙이고되어 있지 않은 경우는 제로).
size jlong 객체의 사이즈 (바이트 단위). GetObjectSize 를 참조.
tag_ptr jlong * 객체의 태그치. 태그 붙이고되어 있지 않은 객체의 경우는 제로. 객체와 관련짓는 태그의 값을 설정하기 위해(때문에), 에이전트는 파라미터에 의해 포인트 되는 jlong 를 설정한다.
thread_tag jlong 이 스택에 대응하는 thread의 태그. 태그 붙이고되어 있지 않은 경우는 제로.
depth jint 프레임의 깊이.
method jmethodID 이 프레임내에서 실행되고 있는 메소드.
slot jint 슬롯 번호.
user_data void * 사용자가 입력해, 반복 함수에게 건네진 데이터.

객체 참조의 콜백

typedef jvmtiIterationControl (JNICALL *jvmtiObjectReferenceCallback)
    (jvmtiObjectReferenceKind reference_kind,
     jlong class_tag,
     jlong size,
     jlong* tag_ptr,
     jlong referrer_tag,
     jint referrer_index,
     void* user_data);
에이전트에 의해 제공되는 콜백 함수. 어느 객체 (참조측)로부터 다른 객체 (참조처)의 참조에 대해 설명합니다.

 

반복 처리를 계속하는 경우, 반환값은 JVMTI_ITERATION_CONTINUE 입니다. 참조 객체로부터의 참조를 속행하지 않고 반복 처리를 계속하는 경우, 반환값은 JVMTI_ITERATION_IGNORE 입니다. 반복 처리를 정지하는 경우, 반환값은 JVMTI_ITERATION_ABORT 입니다.

 

heap 콜백 함수의 제한을 참조해 주세요.

 

 

파라미터
이름 설명
reference_kind jvmtiObjectReferenceKind 참조형.
class_tag jlong 참조되는 객체의 클래스의 태그 (태그 붙이고되어 있지 않은 클래스의 경우는 제로). 참조된 객체가 실행시 클래스를 나타내는 경우,class_tagjava.lang.Class 에 관련짓고 된 태그 (java.lang.Class 가 태그 붙이고되어 있지 않은 경우는 제로).
size jlong 참조되는 객체의 사이즈 (바이트 단위). GetObjectSize 를 참조.
tag_ptr jlong * 참조되는 객체의 태그치. 태그 붙이고되어 있지 않은 객체의 경우는 제로. 객체와 관련짓는 태그의 값을 설정하기 위해(때문에), 에이전트는 파라미터에 의해 포인트 되는 jlong 를 설정한다.
referrer_tag jlong 참조측의 객체의 태그치. 태그 붙이고되어 있지 않은 객체의 경우는 제로.
referrer_index jint JVMTI_REFERENCE_FIELD 형 또는 JVMTI_REFERENCE_STATIC_FIELD 형의 참조의 경우, 참조측 객체의 필드의 인덱스. 인덱스는 객체의 모든 필드의 순서가 기본으로 된다. 상세한 설명에 대해서는,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 * 사용자가 입력해, 반복 함수에게 건네진 데이터.

객체로부터 도달 가능한 객체의 반복

jvmtiError
IterateOverObjectsReachableFromObject(jvmtiEnv* env,
            jobject object,
            jvmtiObjectReferenceCallback object_reference_callback,
            const void* user_data)

이 함수는, 지정된 객체로부터 직접 또는 간접적으로 도달 가능한 모든 객체에 대해서 반복 처리를 실시합니다. 객체 B 를 참조하는 각 객체 A (참조측 객체)에 대해서, 지정된 콜백 함수가 불려 가 객체 참조에 대해 설명합니다. 콜백은, 참조 측에서의 참조마다 1 회만 불려 갑니다. 참조 사이클이나, 참조측인 패스가 복수 존재하는 경우도 같습니다. 참조측과 참조되는 측의 사이에, 복수의 참조가 존재하는 경우가 있습니다. 이러한 식별에는,jvmtiObjectReference.reference_ (종류)jvmtiObjectReference.referrer_ (인덱스) 를 사용합니다. 객체의 콜백은, 항상 참조측의 콜백의 나중에 행해지겠습니다.

 

보고되는 객체 참조에 대해서는,FollowReferences 를 참조해 주세요.

 

이 함수의 실행중, heap의 상태는 변화하지 않습니다. 객체의 할당이나 가베지 컬렉션은 행해지지 않습니다. 따라서, 객체 (포함되고 있는 값도 포함한다)는 변경되지 않습니다. 결과적으로, Java 프로그램 언어의 코드를 실행하는 thread, Java 프로그램 언어의 코드의 실행을 재개하려고 하고 있는 thread, JNI 함수를 실행하려고 하고 있는 thread는, 정지합니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 109 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_tag_objects heap의 카테고리에 설명되고 있도록(듯이), 태그를 설정해, 취득할 수 있다.

 

파라미터
이름 설명
object jobject 객체
object_reference_callback jvmtiObjectReferenceCallback 각 객체 참조를 기술하기 위해서 불려 가는 콜백.

 

user_data const void * 사용자가 입력해, 콜백에게 건네지는 데이터.

 

에이전트가 포인터를 건네준다. user_dataNULL 의 경우,NULL 가 사용자 지정 데이터로서 건네받는다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_tag_objects 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_OBJECT object 가 객체는 아니다.
JVMTI_ERROR_NULL_POINTER object_reference_callbackNULL.

도달 가능한 객체의 반복

jvmtiError
IterateOverReachableObjects(jvmtiEnv* env,
            jvmtiHeapRootCallback heap_root_callback,
            jvmtiStackReferenceCallback stack_ref_callback,
            jvmtiObjectReferenceCallback object_ref_callback,
            const void* user_data)

이 함수는, 루트 객체와 루트 객체로부터 직접 또는 간접적으로 도달 가능한 모든 객체에 대해서 반복 처리를 실시합니다. 루트 객체는, 시스템 클래스, JNI 글로벌, thread 스택으로부터의 참조, 가베지 컬렉션의 목적으로 루트로서 사용되는 그 외의 객체세트로 구성됩니다.

 

각 루트에,heap_root_callback 또는stack_root_callback 가 불려 갑니다. 객체는, 1 개(살) 이상의 이유로써 루트 객체가 될 수가 있습니다. 이 경우, 개개의 이유에 대해서 적절한 콜백이 불려 갑니다.

 

각 객체 참조에,object_ref_callback 함수가 불려 가 객체 참조에 대해 설명합니다. 콜백은, 참조 측에서의 참조마다 1 회만 불려 갑니다. 참조 사이클이나, 참조측인 패스가 복수 존재하는 경우도 같습니다. 참조측과 참조되는 측의 사이에, 복수의 참조가 존재하는 경우가 있습니다. 이러한 식별에는,jvmtiObjectReference.reference_ (종류)jvmtiObjectReference.referrer_ (인덱스) 를 사용합니다. 객체의 콜백은, 항상 참조측의 콜백의 나중에 행해지겠습니다.

 

보고되는 객체 참조에 대해서는,FollowReferences 를 참조해 주세요.

 

루트는, 항상, 객체 참조가 보고되기 전에, 프로 filer에 보고됩니다. 즉,object_ref_callback 는, 모든 루트에 대해서 적절한 콜백이 불려 갈 때까지, 불려 가지 않습니다. object_ref_callbackNULL 와 지정되고 있는 경우, 이 함수는, 프로 filer에 루트 객체를 보고한 뒤, 종료합니다.

 

이 함수의 실행중, heap의 상태는 변화하지 않습니다. 객체의 할당이나 가베지 컬렉션은 행해지지 않습니다. 따라서, 객체 (포함되고 있는 값도 포함한다)는 변경되지 않습니다. 결과적으로, Java 프로그램 언어의 코드를 실행하는 thread, Java 프로그램 언어의 코드의 실행을 재개하려고 하고 있는 thread, JNI 함수를 실행하려고 하고 있는 thread는, 정지합니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 110 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_tag_objects heap의 카테고리에 설명되고 있도록(듯이), 태그를 설정해, 취득할 수 있다.

 

파라미터
이름 설명
heap_root_callback jvmtiHeapRootCallback JVMTI_HEAP_ROOT_JNI_GLOBAL,JVMTI_HEAP_ROOT_SYSTEM_CLASS,JVMTI_HEAP_ROOT_MONITOR,JVMTI_HEAP_ROOT_THREAD, 또는 JVMTI_HEAP_ROOT_OTHER 형의 각 heap 루트를 위해서(때문에) 불려 가는 콜백 함수.

 

heap_root_callbackNULL 의 경우, heap 루트의 보고는 실시하지 않는다.
stack_ref_callback jvmtiStackReferenceCallback JVMTI_HEAP_ROOT_STACK_LOCAL 또는 JVMTI_HEAP_ROOT_JNI_LOCAL 의 각 heap 루트를 위해서(때문에) 불려 가는 콜백 함수.

 

stack_ref_callbackNULL 의 경우, 스택 참조의 보고는 실시하지 않는다.
object_ref_callback jvmtiObjectReferenceCallback 각 객체 참조를 위해서(때문에) 불려 가는 콜백.

 

object_ref_callbackNULL 의 경우, 루트 객체로부터의 참조에는 따르지 않는다.
user_data const void * 사용자가 입력해, 콜백에게 건네지는 데이터.

 

에이전트가 포인터를 건네준다. user_dataNULL 의 경우,NULL 가 사용자 지정 데이터로서 건네받는다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_tag_objects 를 가지지 않는다. AddCapabilities 를 사용한다.

heap의 반복

jvmtiError
IterateOverHeap(jvmtiEnv* env,
            jvmtiHeapObjectFilter object_filter,
            jvmtiHeapObjectCallback heap_object_callback,
            const void* user_data)

heap내의 모든 객체에 대해서 반복 처리를 실시합니다. 도달 가능한 객체도, 그렇지 않은 객체도 포함됩니다.

 

object_filter 파라미터는, 어느 객체를 위해서(때문에) 콜백 함수가 불려 가는지를 나타냅니다. 파라미터가 JVMTI_HEAP_OBJECT_TAGGED 의 경우, 콜백은, 모든 태그 첨부 객체 에 대해서만 불려 갑니다. 파라미터가 JVMTI_HEAP_OBJECT_UNTAGGED 의 경우, 콜백은, 모든 태그 없음 객체 에 대해서만 불려 갑니다. 파라미터가 JVMTI_HEAP_OBJECT_EITHER 의 경우, 콜백은, 태그가 붙어 있는지 어떤지에 관계없이, heap내의 모든 객체에 대해서 불려 갑니다.

 

이 함수의 실행중, heap의 상태는 변화하지 않습니다. 객체의 할당이나 가베지 컬렉션은 행해지지 않습니다. 따라서, 객체 (포함되고 있는 값도 포함한다)는 변경되지 않습니다. 결과적으로, Java 프로그램 언어의 코드를 실행하는 thread, Java 프로그램 언어의 코드의 실행을 재개하려고 하고 있는 thread, JNI 함수를 실행하려고 하고 있는 thread는, 정지합니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 111 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_tag_objects heap의 카테고리에 설명되고 있도록(듯이), 태그를 설정해, 취득할 수 있다.

 

파라미터
이름 설명
object_filter jvmtiHeapObjectFilter 어느 객체에 대해서 콜백 함수가 불려 가는지를 나타낸다.
heap_object_callback jvmtiHeapObjectCallback object_filter 에 일치하는 각 객체에 대해서 불려 가는 반복 함수.

 

user_data const void * 사용자가 입력해, 콜백에게 건네지는 데이터.

 

에이전트가 포인터를 건네준다. user_dataNULL 의 경우,NULL 가 사용자 지정 데이터로서 건네받는다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_tag_objects 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_ILLEGAL_ARGUMENT object_filter 가 jvmtiHeapObjectFilter 이 아니다.
JVMTI_ERROR_NULL_POINTER heap_object_callbackNULL.

클래스의 인스턴스의 반복

jvmtiError
IterateOverInstancesOfClass(jvmtiEnv* env,
            jclass klass,
            jvmtiHeapObjectFilter object_filter,
            jvmtiHeapObjectCallback heap_object_callback,
            const void* user_data)

지정된 클라이언트의 인스턴스가 되어 있는, heap내의 모든 객체에 대해서 반복 처리를 실시합니다. 이것에는, 지정된 클래스의 직접적인 인스턴스와 지정된 클래스의 모든 서브 클래스의 인스턴스가 포함됩니다. 도달 가능한 객체도, 그렇지 않은 객체도 포함됩니다.

 

object_filter 파라미터는, 어느 객체를 위해서(때문에) 콜백 함수가 불려 가는지를 나타냅니다. 파라미터가 JVMTI_HEAP_OBJECT_TAGGED 의 경우, 콜백은, 모든 태그 첨부 객체 에 대해서만 불려 갑니다. 파라미터가 JVMTI_HEAP_OBJECT_UNTAGGED 의 경우, 콜백은, 모든 태그 없음 객체 에 대해서만 불려 갑니다. 파라미터가 JVMTI_HEAP_OBJECT_EITHER 의 경우, 콜백은, 태그가 붙어 있는지 어떤지에 관계없이, heap내의 모든 객체에 대해서 불려 갑니다.

 

이 함수의 실행중, heap의 상태는 변화하지 않습니다. 객체의 할당이나 가베지 컬렉션은 행해지지 않습니다. 따라서, 객체 (포함되고 있는 값도 포함한다)는 변경되지 않습니다. 결과적으로, Java 프로그램 언어의 코드를 실행하는 thread, Java 프로그램 언어의 코드의 실행을 재개하려고 하고 있는 thread, JNI 함수를 실행하려고 하고 있는 thread는, 정지합니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 112 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_tag_objects heap의 카테고리에 설명되고 있도록(듯이), 태그를 설정해, 취득할 수 있다.

 

파라미터
이름 설명
klass jclass 이 클래스의 객체 에 대해서만 반복 처리를 실시한다.
object_filter jvmtiHeapObjectFilter 어느 객체에 대해서 콜백 함수가 불려 가는지를 나타낸다.
heap_object_callback jvmtiHeapObjectCallback object_filter 에 일치하는 각 klass 인스턴스에 대해서 불려 가는 반복 함수.

 

user_data const void * 사용자가 입력해, 콜백에게 건네지는 데이터.

 

에이전트가 포인터를 건네준다. user_dataNULL 의 경우,NULL 가 사용자 지정 데이터로서 건네받는다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_tag_objects 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_ILLEGAL_ARGUMENT object_filter 가 jvmtiHeapObjectFilter 이 아니다.
JVMTI_ERROR_NULL_POINTER heap_object_callbackNULL.

 


국소 변수

국소 변수 함수:

이러한 함수는, 국소 변수의 값을 취득 또는 설정하기 위해서 사용합니다. 변수는, 변수의 값을 포함하고 있는 프레임의 깊이와 그 프레임내의 변수의 슬롯 번호에 의해 식별됩니다. 변수로부터 슬롯 번호에의 매핑은, 함수 GetLocalVariableTable 를 사용해 취득할 수 있습니다.

 


국소 변수의 취득 - 객체형

jvmtiError
GetLocalObject(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jobject* value_ptr)

이 함수를 사용하면(자), 형태가 Object 또는 Object 의 서브 클래스인 국소 변수의 값을 취득할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 21 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_access_local_variables 국소 변수를 설정해, 취득할 수 있다

 

파라미터
이름 설명
thread jthread 변수의 값을 포함한 프레임의 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
depth jint 변수의 값을 포함한 프레임의 깊이.
slot jint 변수의 슬롯 번호.
value_ptr jobject * 돌아왔을 때, 변수의 값을 포인트 한다.

 

에이전트는 jobject 에 포인터를 건네준다. 돌아왔을 때,jobject 가 설정되어 있다. value_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_access_local_variables 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_SLOT slot 가 무효.
JVMTI_ERROR_TYPE_MISMATCH 변수의 형태가 Object 에서도 Object 의 서브 클래스도 아니다.
JVMTI_ERROR_OPAQUE_FRAME 가시의 프레임은 아니다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth 가 제로보다 작다.
JVMTI_ERROR_NO_MORE_FRAMES 지정된 depth 에 스택 프레임이 존재하지 않는다.
JVMTI_ERROR_NULL_POINTER value__ptrNULL.

국소 변수의 취득 - 정수형

jvmtiError
GetLocalInt(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jint* value_ptr)

이 함수를 사용하면(자), 형태가 int,short,char,byte,boolean 의 언젠가인 국소 변수의 값을 취득할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 22 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_access_local_variables 국소 변수를 설정해, 취득할 수 있다

 

파라미터
이름 설명
thread jthread 변수의 값을 포함한 프레임의 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
depth jint 변수의 값을 포함한 프레임의 깊이.
slot jint 변수의 슬롯 번호.
value_ptr jint * 돌아왔을 때, 변수의 값을 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_access_local_variables 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_SLOT slot 가 무효.
JVMTI_ERROR_TYPE_MISMATCH 변수의 형태가 int,short,char,byte,boolean 의 머지않아도 아니다.
JVMTI_ERROR_OPAQUE_FRAME 가시의 프레임은 아니다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth 가 제로보다 작다.
JVMTI_ERROR_NO_MORE_FRAMES 지정된 depth 에 스택 프레임이 존재하지 않는다.
JVMTI_ERROR_NULL_POINTER value__ptrNULL.

국소 변수의 취득 - 장 정수형

jvmtiError
GetLocalLong(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jlong* value_ptr)

이 함수를 사용하면(자), 형태가 long 인 국소 변수의 값을 취득할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 23 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_access_local_variables 국소 변수를 설정해, 취득할 수 있다

 

파라미터
이름 설명
thread jthread 변수의 값을 포함한 프레임의 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
depth jint 변수의 값을 포함한 프레임의 깊이.
slot jint 변수의 슬롯 번호.
value_ptr jlong * 돌아왔을 때, 변수의 값을 포인트 한다.

 

에이전트는 jlong 에 포인터를 건네준다. 돌아왔을 때,jlong 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_access_local_variables 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_SLOT slot 가 무효.
JVMTI_ERROR_TYPE_MISMATCH 변수의 형태가 long 가 아니다.
JVMTI_ERROR_OPAQUE_FRAME 가시의 프레임은 아니다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth 가 제로보다 작다.
JVMTI_ERROR_NO_MORE_FRAMES 지정된 depth 에 스택 프레임이 존재하지 않는다.
JVMTI_ERROR_NULL_POINTER value__ptrNULL.

국소 변수의 취득 - 부동 소수점수(실수)형

jvmtiError
GetLocalFloat(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jfloat* value_ptr)

이 함수를 사용하면(자), 형태가 float 인 국소 변수의 값을 취득할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 24 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_access_local_variables 국소 변수를 설정해, 취득할 수 있다

 

파라미터
이름 설명
thread jthread 변수의 값을 포함한 프레임의 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
depth jint 변수의 값을 포함한 프레임의 깊이.
slot jint 변수의 슬롯 번호.
value_ptr jfloat * 돌아왔을 때, 변수의 값을 포인트 한다.

 

에이전트는 jfloat 에 포인터를 건네준다. 돌아왔을 때,jfloat 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_access_local_variables 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_SLOT slot 가 무효.
JVMTI_ERROR_TYPE_MISMATCH 변수의 형태가 float 가 아니다.
JVMTI_ERROR_OPAQUE_FRAME 가시의 프레임은 아니다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth 가 제로보다 작다.
JVMTI_ERROR_NO_MORE_FRAMES 지정된 depth 에 스택 프레임이 존재하지 않는다.
JVMTI_ERROR_NULL_POINTER value__ptrNULL.

국소 변수의 취득 - 배정밀도 부동 소수점수(실수)형

jvmtiError
GetLocalDouble(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jdouble* value_ptr)

이 함수를 사용하면(자), 형태가 long 인 국소 변수의 값을 취득할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 25 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_access_local_variables 국소 변수를 설정해, 취득할 수 있다

 

파라미터
이름 설명
thread jthread 변수의 값을 포함한 프레임의 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
depth jint 변수의 값을 포함한 프레임의 깊이.
slot jint 변수의 슬롯 번호.
value_ptr jdouble * 돌아왔을 때, 변수의 값을 포인트 한다.

 

에이전트는 jdouble 에 포인터를 건네준다. 돌아왔을 때,jdouble 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_access_local_variables 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_SLOT slot 가 무효.
JVMTI_ERROR_TYPE_MISMATCH 변수의 형태가 double 가 아니다.
JVMTI_ERROR_OPAQUE_FRAME 가시의 프레임은 아니다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth 가 제로보다 작다.
JVMTI_ERROR_NO_MORE_FRAMES 지정된 depth 에 스택 프레임이 존재하지 않는다.
JVMTI_ERROR_NULL_POINTER value__ptrNULL.

국소 변수의 설정 - 객체형

jvmtiError
SetLocalObject(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jobject value)

이 함수를 사용하면(자), 형태가 Object 또는 Object 의 서브 클래스인 국소 변수의 값을 설정할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 26 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_access_local_variables 국소 변수를 설정해, 취득할 수 있다

 

파라미터
이름 설명
thread jthread 변수의 값을 포함한 프레임의 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
depth jint 변수의 값을 포함한 프레임의 깊이.
slot jint 변수의 슬롯 번호.
value jobject 변수의 새로운 값.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_access_local_variables 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_SLOT slot 가 무효.
JVMTI_ERROR_TYPE_MISMATCH 변수의 형태가 Object 에서도 Object 의 서브 클래스도 아니다.
JVMTI_ERROR_TYPE_MISMATCH 지정된 value 와 변수의 형태에 호환성이 없다.
JVMTI_ERROR_OPAQUE_FRAME 가시의 프레임은 아니다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth 가 제로보다 작다.
JVMTI_ERROR_NO_MORE_FRAMES 지정된 depth 에 스택 프레임이 존재하지 않는다.
JVMTI_ERROR_INVALID_OBJECT value 가 객체는 아니다.

국소 변수의 설정 - 정수형

jvmtiError
SetLocalInt(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jint value)

이 함수를 사용하면(자), 형태가 int,short,char,byte,boolean 의 언젠가인 국소 변수의 값을 설정할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 27 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_access_local_variables 국소 변수를 설정해, 취득할 수 있다

 

파라미터
이름 설명
thread jthread 변수의 값을 포함한 프레임의 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
depth jint 변수의 값을 포함한 프레임의 깊이.
slot jint 변수의 슬롯 번호.
value jint 변수의 새로운 값.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_access_local_variables 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_SLOT slot 가 무효.
JVMTI_ERROR_TYPE_MISMATCH 변수의 형태가 int,short,char,byte,boolean 의 머지않아도 아니다.
JVMTI_ERROR_OPAQUE_FRAME 가시의 프레임은 아니다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth 가 제로보다 작다.
JVMTI_ERROR_NO_MORE_FRAMES 지정된 depth 에 스택 프레임이 존재하지 않는다.

국소 변수의 설정 - 장 정수형

jvmtiError
SetLocalLong(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jlong value)

이 함수를 사용하면(자), 형태가 long 인 국소 변수의 값을 설정할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 28 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_access_local_variables 국소 변수를 설정해, 취득할 수 있다

 

파라미터
이름 설명
thread jthread 변수의 값을 포함한 프레임의 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
depth jint 변수의 값을 포함한 프레임의 깊이.
slot jint 변수의 슬롯 번호.
value jlong 변수의 새로운 값.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_access_local_variables 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_SLOT slot 가 무효.
JVMTI_ERROR_TYPE_MISMATCH 변수의 형태가 long 가 아니다.
JVMTI_ERROR_OPAQUE_FRAME 가시의 프레임은 아니다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth 가 제로보다 작다.
JVMTI_ERROR_NO_MORE_FRAMES 지정된 depth 에 스택 프레임이 존재하지 않는다.

국소 변수의 설정 - 부동 소수점수(실수)형

jvmtiError
SetLocalFloat(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jfloat value)

이 함수를 사용하면(자), 형태가 float 인 국소 변수의 값을 설정할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 29 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_access_local_variables 국소 변수를 설정해, 취득할 수 있다

 

파라미터
이름 설명
thread jthread 변수의 값을 포함한 프레임의 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
depth jint 변수의 값을 포함한 프레임의 깊이.
slot jint 변수의 슬롯 번호.
value jfloat 변수의 새로운 값.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_access_local_variables 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_SLOT slot 가 무효.
JVMTI_ERROR_TYPE_MISMATCH 변수의 형태가 float 가 아니다.
JVMTI_ERROR_OPAQUE_FRAME 가시의 프레임은 아니다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth 가 제로보다 작다.
JVMTI_ERROR_NO_MORE_FRAMES 지정된 depth 에 스택 프레임이 존재하지 않는다.

국소 변수의 설정 - 배정밀도 부동 소수점수(실수)형

jvmtiError
SetLocalDouble(jvmtiEnv* env,
            jthread thread,
            jint depth,
            jint slot,
            jdouble value)

이 함수를 사용하면(자), 형태가 double 인 국소 변수의 값을 설정할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 30 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_access_local_variables 국소 변수를 설정해, 취득할 수 있다

 

파라미터
이름 설명
thread jthread 변수의 값을 포함한 프레임의 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
depth jint 변수의 값을 포함한 프레임의 깊이.
slot jint 변수의 슬롯 번호.
value jdouble 변수의 새로운 값.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_access_local_variables 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_SLOT slot 가 무효.
JVMTI_ERROR_TYPE_MISMATCH 변수의 형태가 double 가 아니다.
JVMTI_ERROR_OPAQUE_FRAME 가시의 프레임은 아니다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_ILLEGAL_ARGUMENT depth 가 제로보다 작다.
JVMTI_ERROR_NO_MORE_FRAMES 지정된 depth 에 스택 프레임이 존재하지 않는다.

 


breakpoint

breakpoint 함수:

 


breakpoint의 설정

jvmtiError
SetBreakpoint(jvmtiEnv* env,
            jmethodID method,
            jlocation location)

methodlocation 로 지정된 명령에 breakpoint를 설정합니다. 1 개의 명령에 대해서 설정할 수 있는 breakpoint는 1 개 뿐입니다.

 

지정한 명령이 실행되기 직전에,Breakpoint 이벤트가 생성됩니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 38 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_breakpoint_events Breakpoint 이벤트를설정해, 취득할 수가 있다.

 

파라미터
이름 설명
method jmethodID breakpoint를 설정하는 메소드
location jlocation breakpoint를 설정하는 명령의 인덱스

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_generate_breakpoint_events 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_DUPLICATE 지정된 바이트 코드에는 breakpoint가 벌써 설정되어 있다.
JVMTI_ERROR_INVALID_METHODID method 가 jmethodID 는 아니다.
JVMTI_ERROR_INVALID_LOCATION location 는 유효한 위치는 아니다.

breakpoint의 해제

jvmtiError
ClearBreakpoint(jvmtiEnv* env,
            jmethodID method,
            jlocation location)

methodlocation 로 지정된 바이트 코드로 설정되어 있는 breakpoint를 해제합니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 39 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_breakpoint_events Breakpoint 이벤트를설정해, 취득할 수가 있다.

 

파라미터
이름 설명
method jmethodID breakpoint를 해제하는 메소드
location jlocation breakpoint를 해제하는 명령의 인덱스

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_generate_breakpoint_events 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_NOT_FOUND 지정된 바이트 코드에는 breakpoint가 설정되어 있지 않다.
JVMTI_ERROR_INVALID_METHODID method 가 jmethodID 는 아니다.
JVMTI_ERROR_INVALID_LOCATION location 는 유효한 위치는 아니다.

 


감시되는 필드

감시되는 필드 함수:

 


필드 액세스의 감시의 설정

jvmtiError
SetFieldAccessWatch(jvmtiEnv* env,
            jclass klass,
            jfieldID field)

klassfield 로 지정된 필드가 액세스 되려고 한 시점에서,FieldAccess 이벤트를 생성합니다. 이벤트는,ClearFieldAccessWatch 를 사용해 삭제될 때까지, 필드가 액세스 될 때마다 생성됩니다. Java 프로그램 언어 코드 또는 JNI 코드로부터의 필드 액세스가 감시되어 다른 수단으로 변경되는 필드는 감시되지 않습니다. JVM TI 의 사용자는, 자기 자신의 필드 액세스에 의해 감시 이벤트가 트리거되는 것에 주의해 주세요. 1 개의 필드에 대해, 필드 액세스의 감시를 1 개만 설정할 수 있습니다. 필드의 변경은 액세스라고는 보이지 않습니다. 변경을 감시하려면 ,SetFieldModificationWatch 을 사용합니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 41 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_field_access_events 필드 액세스에 시계 포인트를 설정할 수 있는 - SetFieldAccessWatch

 

파라미터
이름 설명
klass jclass 감시하는 필드를 포함한 클래스
field jfieldID 감시하는 필드

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_generate_field_access_events 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_DUPLICATE 지정된 필드는 벌써 액세스가 감시되고 있다.
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_INVALID_FIELDID field 가 jfieldID 는 아니다.

필드 액세스의 감시의 해제

jvmtiError
ClearFieldAccessWatch(jvmtiEnv* env,
            jclass klass,
            jfieldID field)

SetFieldAccessWatch 를 사용해 이전으로 설정한,klassfield 로 지정되는 필드에 대한 필드 액세스의 감시를 취소합니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 42 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_field_access_events 필드 액세스에 시계 포인트를 설정할 수 있는 - SetFieldAccessWatch

 

파라미터
이름 설명
klass jclass 감시하는 필드를 포함한 클래스
field jfieldID 감시하는 필드

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_generate_field_access_events 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_NOT_FOUND 지정된 필드는 액세스가 감시되어 있지 않다.
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_INVALID_FIELDID field 가 jfieldID 는 아니다.

필드 변경의 감시의 설정

jvmtiError
SetFieldModificationWatch(jvmtiEnv* env,
            jclass klass,
            jfieldID field)

klassfield 로 지정된 필드가 변경되려고 한 시점에서,FieldModification 이벤트를 생성합니다. 이벤트는,ClearFieldModificationWatch 를 사용해 삭제될 때까지, 필드가 변경될 때마다 생성됩니다. Java 프로그램 언어 코드 또는 JNI 코드로부터의 필드 변경이 감시되어 다른 수단으로 변경되는 필드는 감시되지 않습니다. JVM TI 의 사용자는, 자기 자신으로 실행하는 필드 변경에 의해 감시 이벤트가 트리거되는 것에 주의해 주세요. 1 개의 필드에 대해, 필드 변경의 감시를 1 개만 설정할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 43 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_field_modification_events 필드의 변경에 시계 포인트를 설정할 수 있는 - SetFieldModificationWatch

 

파라미터
이름 설명
klass jclass 감시하는 필드를 포함한 클래스
field jfieldID 감시하는 필드

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_generate_field_modification_events 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_DUPLICATE 지정된 필드는 벌써 변경이 감시되고 있다.
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_INVALID_FIELDID field 가 jfieldID 는 아니다.

필드 변경의 감시의 해제

jvmtiError
ClearFieldModificationWatch(jvmtiEnv* env,
            jclass klass,
            jfieldID field)

klassfield 로 지정되는 필드에 대해서,SetFieldModificationWatch 를 사용해 이전으로 설정한 필드 변경의 감시를 취소합니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 44 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_field_modification_events 필드의 변경에 시계 포인트를 설정할 수 있는 - SetFieldModificationWatch

 

파라미터
이름 설명
klass jclass 감시하는 필드를 포함한 클래스
field jfieldID 감시하는 필드

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_generate_field_modification_events 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_NOT_FOUND 지정된 필드는 변경이 감시되어 있지 않다.
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_INVALID_FIELDID field 가 jfieldID 는 아니다.

 


클래스

클래스 함수:

클래스의 형태:

클래스의 플래그 및 정수:

 


로드가 끝난 클래스의 취득

jvmtiError
GetLoadedClasses(jvmtiEnv* env,
            jint* class_count_ptr,
            jclass** classes_ptr)

가상 머신에 로드 되고 있는 전클래스의 배열을 돌려줍니다. 배열내의 클래스의 수는 class_count_ptr, 배열 자체는 classes_ptr 에 의해 돌려주어집니다.

 

반환되는 리스트에는, 모든 형태의 배열 클래스 (원시형의 배열을 포함한다)가 포함됩니다. 프리미티브(primitive) 클래스 (예를 들어,java.lang.Integer.TYPE)는, 이 리스트에는 포함되지 않습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 78 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
class_count_ptr jint * 돌아왔을 때, 클래스의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
classes_ptr jclass ** 돌아왔을 때, 각 클래스에의 참조 (클래스 마다 1 개(살)씩)의 배열을 포인트 한다.

 

에이전트는 jclass* 에 포인터를 건네준다. 돌아왔을 때,jclass* 는, 사이즈 *class_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. classes_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER class_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER classes_ptrNULL.

클래스 로더 클래스의 취득

jvmtiError
GetClassLoaderClasses(jvmtiEnv* env,
            jobject initiating_loader,
            jint* class_count_ptr,
            jclass** classes_ptr)

이 클래스 로더가 기동 로더로서 기록되고 있는 클래스의 배열을 돌려줍니다. 반환되는 배열내의 각 클래스는, 이 클래스 로더에 의해 직접 정의되어 작성된 것인가, 또는 다른 클래스 로더에 위양 해 작성된 것입니다. 「Java 가상 머신 스펙」「Creation and Loading」섹션을 참조해 주세요.

 

JDK 1.1 의 구현에서는, 기동 클래스 로더와 정의 클래스 로더의 구별이 인식되지 않기 때문에, 이 함수는, 가상 머신에 로드 된 모든 클래스를 돌려줍니다. 배열내의 클래스의 수는 class_count_ptr, 배열 자체는 classes_ptr 에 의해 돌려주어집니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 79 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
initiating_loader jobject 기동 클래스 로더.

 

initiating_loaderNULL 의 경우, bootstrap loader에 의해 기동된 클래스가 반환된다.
class_count_ptr jint * 돌아왔을 때, 클래스의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
classes_ptr jclass ** 돌아왔을 때, 각 클래스에의 참조 (클래스 마다 1 개(살)씩)의 배열을 포인트 한다.

 

에이전트는 jclass* 에 포인터를 건네준다. 돌아왔을 때,jclass* 는, 사이즈 *class_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. classes_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER class_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER classes_ptrNULL.

클래스의 시그니챠의 취득

jvmtiError
GetClassSignature(jvmtiEnv* env,
            jclass klass,
            char** signature_ptr,
            char** generic_ptr)

klass 로 지정된 클래스에,JNI 형의 시그니챠와 클래스의 총칭 시그니챠를 돌려줍니다. 예를 들어,java.util.List"Ljava/util/List;" 로,int[]"[I" 의 경우, 반환되는 프리미티브(primitive) 클래스의 이름은, 대응하는 원시형의 형태 시그니챠 문자가 됩니다. 예를 들어,java.lang.Integer.TYPE"I" 입니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 48 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
signature_ptr char ** 돌아왔을 때, 클래스의 JNI 형 시그니챠 (수정 UTF-8 캐릭터 라인으로서 encode 된다)를 포인트 한다.

 

에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. signature_ptrNULL 의 경우, 시그니챠는 돌려주어지지 않다.
generic_ptr char ** 돌아왔을 때, 클래스의 총칭 시그니챠 (수정 UTF-8 캐릭터 라인으로서 encode 된다)를 포인트 한다. 클래스의 총칭 시그니챠 속성이 존재하지 않는 경우는, 돌아왔을 때 NULL 를 포인트 한다.

 

에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. generic_ptrNULL 의 경우, 총칭 시그니챠는 돌려주어지지 않다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.

클래스의 상태의 취득

jvmtiError
GetClassStatus(jvmtiEnv* env,
            jclass klass,
            jint* status_ptr)

클래스의 상태를 가져옵니다. 다음의 비트 가운데, 0 개 이상의 비트가 세트 됩니다.

클래스의 상태 플래그
정수 설명
JVMTI_CLASS_STATUS_VERIFIED 1 클래스의 바이트 코드가 검증되었다.
JVMTI_CLASS_STATUS_PREPARED 2 클래스의 준비가 완료했다.
JVMTI_CLASS_STATUS_INITIALIZED 4 클래스의 초기화가 완료했다. 정적인 초기화자가 실행되었다.
JVMTI_CLASS_STATUS_ERROR 8 초기화중의 에러에 의해 클래스를 사용할 수 없다.
JVMTI_CLASS_STATUS_ARRAY 16 클래스는 배열. 설정되어 있는 경우, 그 외의 모든 비트는 제로.
JVMTI_CLASS_STATUS_PRIMITIVE 32 클래스는 프리미티브(primitive) 클래스 (java.lang.Integer.TYPE 등). 설정되어 있는 경우, 그 외의 모든 비트는 제로.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 49 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
status_ptr jint * 돌아왔을 때, 이 클래스의 현재 상태로서클래스의 상태 플래그를 1 개 이상 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_NULL_POINTER status_ptrNULL.

원시 파일명의 취득

jvmtiError
GetSourceFileName(jvmtiEnv* env,
            jclass klass,
            char** source_name_ptr)

klass 로 지정된 클래스에 도착해,source_name_ptr 를 개입시켜 원시 파일명을 돌려줍니다. 반환되는 캐릭터 라인은, 파일명만으로, 디렉토리명은 포함되지 않습니다.

 

프리미티브(primitive) 클래스 (예를 들어,java.lang.Integer.TYPE) 및 배열의 경우, 이 함수는 JVMTI_ERROR_ABSENT_INFORMATION 를 돌려줍니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 50 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_get_source_file_name 클래스의 원시 파일의 이름을 취득할 수 있다

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
source_name_ptr char** 돌아왔을 때, 클래스의 원시 파일명 (수정 UTF-8 캐릭터 라인으로서 encode 된다)을 포인트 한다.

 

에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_get_source_file_name 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_ABSENT_INFORMATION 클래스 정보에, 원시 파일명이 포함되지 않았다. 이것에는, 클래스가 배열 클래스 또는 프리미티브(primitive) 클래스인 경우가 포함된다.
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_NULL_POINTER source_name_ptrNULL.

클래스의 수식자의 취득

jvmtiError
GetClassModifiers(jvmtiEnv* env,
            jclass klass,
            jint* modifiers_ptr)

klass 로 지정된 클래스의 액세스 플래그를,modifiers_ptr 를 개입시켜 돌려줍니다. 액세스 플래그에 대해서는,「Java 가상 머신 스펙」「Class File Format」의 장으로 정의되고 있습니다.

 

클래스가 배열 클래스의 경우, 그 public, private 및 protected 수식자는, 그 컴퍼넌트형의 수식자와 같습니다. 원시형의 배열의 경우, 이 컴퍼넌트형은, 프리미티브(primitive) 클래스의 1 개 (예를 들어,java.lang.Integer.TYPE)로 표현됩니다.

 

클래스가 프리미티브(primitive) 클래스의 경우, 그 public 수식자는 항상 true 가 됩니다. 또, 그 protected 수식자 및 private 수식자는 항상 false 가 됩니다.

 

클래스가 배열 클래스 또는 프리미티브(primitive) 클래스의 경우, 그 final 수식자는 항상 true 가 되어, interface 수식자는 항상 false 가 됩니다. 그 외의 수식자의 값은, 이 스펙에서는 판정되지 않습니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 51 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
modifiers_ptr jint * 돌아왔을 때, 이 클래스의 현재의 액세스 플래그를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_NULL_POINTER modifiers_ptrNULL.

클래스의 메소드의 취득

jvmtiError
GetClassMethods(jvmtiEnv* env,
            jclass klass,
            jint* method_count_ptr,
            jmethodID** methods_ptr)

klass 로 지정된 클래스에 포함되는 메소드의 수를 method_count_ptr 을 개입시켜 돌려주어, 메소드 ID 의 리스트를 methods_ptr 를 개입시켜 돌려줍니다. 메소드의 리스트에는, 본래의 메소드 뿐만이 아니라, 생성자 및 static 초기화자도 포함됩니다. 직접 선언된 메소드만이 돌려주어집니다 (상속한 메소드는 돌려주어지지 않다). 배열 클래스 및 프리미티브(primitive) 클래스 (예를 들어,java.lang.Integer.TYPE)의 경우, 빈 상태(empty)의 메소드 리스트가 돌려주어집니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 52 1.0

 

권한
필요한 기능
임의의 기능
권한 효과
can_maintain_original_method_order 클래스 파일내에 출현하는 순서로 메소드를 돌려줄 수가 있다

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
method_count_ptr jint * 돌아왔을 때, 이 클래스에서 선언되고 있는 메소드의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
methods_ptr jmethodID ** 돌아왔을 때, 메소드 ID 의 배열을 포인트 한다.

 

에이전트는 jmethodID* 에 포인터를 건네준다. 돌아왔을 때,jmethodID* 는, 사이즈 *method_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_CLASS_NOT_PREPARED klass 가 준비되어 있지 않다.
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_NULL_POINTER method_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER methods_ptrNULL.

클래스의 필드의 취득

jvmtiError
GetClassFields(jvmtiEnv* env,
            jclass klass,
            jint* field_count_ptr,
            jfieldID** fields_ptr)

klass 로 지정된 클래스에 포함되는 필드의 수를 field_count_ptr 를 개입시켜 돌려주어, 필드 ID 의 리스트를 fields_ptr 를 개입시켜 돌려줍니다. 직접 선언된 필드만이 돌려주어집니다 (상속한 필드는 돌려주어지지 않다). 필드는, 클래스 파일내에 출현하는 순서로 돌려주어집니다. 배열 클래스 및 프리미티브(primitive) 클래스 (예를 들어,java.lang.Integer.TYPE)의 경우, 빈 상태(empty)의 필드 리스트가 돌려주어집니다. JNI 를 사용해, 배열의 길이를 판별해 주세요.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 53 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
field_count_ptr jint * 돌아왔을 때, 이 클래스에서 선언되고 있는 필드의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
fields_ptr jfieldID ** 돌아왔을 때, 필드 ID 의 배열을 포인트 한다.

 

에이전트는 jfieldID* 에 포인터를 건네준다. 돌아왔을 때,jfieldID* 는, 사이즈 *field_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_CLASS_NOT_PREPARED klass 가 준비되어 있지 않다.
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_NULL_POINTER field_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER fields_ptrNULL.

구현된 인터페이스의 취득

jvmtiError
GetImplementedInterfaces(jvmtiEnv* env,
            jclass klass,
            jint* interface_count_ptr,
            jclass** interfaces_ptr)

이 클래스의 직접적인 슈퍼 인터페이스를 돌려줍니다. 클래스에 대해서는, 이 함수는,implements 절로 선언되고 있는 인터페이스를 돌려줍니다. 인터페이스에 대해서는, 이 함수는,extends 절로 선언되고 있는 인터페이스를 돌려줍니다. 배열 클래스 및 프리미티브(primitive) 클래스 (예를 들어,java.lang.Integer.TYPE)의 경우, 빈 상태(empty)의 인터페이스 리스트가 돌려주어집니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 54 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
interface_count_ptr jint * 돌아왔을 때, 인터페이스의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
interfaces_ptr jclass ** 돌아왔을 때, 인터페이스의 배열을 포인트 한다.

 

에이전트는 jclass* 에 포인터를 건네준다. 돌아왔을 때,jclass* 는, 사이즈 *interface_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. interfaces_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_CLASS_NOT_PREPARED klass 가 준비되어 있지 않다.
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_NULL_POINTER interface_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER interface_ptrNULL.

클래스 버젼 번호의 취득

jvmtiError
GetClassVersionNumbers(jvmtiEnv* env,
            jclass klass,
            jint* minor_version_ptr,
            jint* major_version_ptr)

klass 로 지정된 클래스에 대해서는,「Java 가상 머신 스펙」「Class File Format」의 장으로 정의되고 있도록(듯이), 마이너 버젼 번호와 메이저 버젼 번호를 돌려줍니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 145 1.1

 

권한
필요한 기능

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
minor_version_ptr jint * 돌아왔을 때, 클래스 파일 형식의 minor_version 항목의 값을 포인트 한다. 주:클래스 파일 형식과의 일관성을 유지하기 위해서(때문에), 마이너 버젼 번호가 최초의 파라미터가 되어 있다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
major_version_ptr jint * 돌아왔을 때, 클래스 파일 형식의 major_version 항목의 값을 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_ABSENT_INFORMATION 클래스가 프리미티브(primitive) 또는 배열 클래스이다.
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_NULL_POINTER minor_version_ptrNULL.
JVMTI_ERROR_NULL_POINTER major_version_ptrNULL.

정수 풀의 취득

jvmtiError
GetConstantPool(jvmtiEnv* env,
            jclass klass,
            jint* constant_pool_count_ptr,
            jint* constant_pool_byte_count_ptr,
            unsigned char** constant_pool_bytes_ptr)

klass 로 나타난 클래스에 대해서는,「Java 가상 머신 스펙」「Class File Format」에 기재된 constant_pool 항목의 형식에서 정수 풀의 raw 바이트를 돌려줍니다. 정수 풀의 형식은, 클래스 파일 형식의 버젼에 따라서 다를 가능성이 있으므로,클래스의 메이저 버젼 번호 및 마이너 버젼 번호에 호환성이 있는 것을 확인하도록 해 주세요.

 

반환되는 정수 풀의 레이아웃이나 내용이, 정의원의 클래스 파일내의 정수 풀과 같지 않은 것도 있습니다. GetConstantPool()로부터 반환되는 정수 풀의 엔트리수는, 정의원의 정수 풀의 엔트리수와 다른 경우가 있습니다. 엔트리의 순서가 다른 경우도 있습니다. GetConstantPool()로부터 반환되는 정수 풀은,GetBytecodes() 가 사용하는 정수 풀에 일치합니다. 즉, GetBytecodes()로부터 반환되는 바이트 코드에 포함되는 정수 풀 인덱스는, GetConstantPool()로부터 반환되는 정수 풀의 엔트리를 참조합니다. RetransformClassesRedefineClasses 는 정수 풀을 변경할 수 있기 (위해)때문에, 이 함수로부터 반환되는 정수 풀은, 거기에 응해 변경될 가능성이 있습니다. 따라서, 도중에 클래스의 재변환 또는 재정의를 했을 경우는, GetConstantPool()와 GetBytecodes()의 사이의 대응 관계가 유지되지 않습니다. 어느 특정의 바이트 코드가 사용하는 정수 풀 엔트리의 값은, 정의원클래스 파일의 대응하는 값에 일치합니다 (인덱스가 일치하지 않는 경우에서도). 바이트 코드가 직접적으로도 간접적으로도 사용하지 않는 정수 풀 엔트리 (주석에 관련지을 수 있었던 UTF-8 캐릭터 라인등)는, 반환된 정수 풀내에 존재하고 있지 않아도 괜찮습니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 146 1.1

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_get_constant_pool 어느 클래스의 정수 풀을 취득할 수 있는 - GetConstantPool

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
constant_pool_count_ptr jint * 돌아왔을 때, 정수 풀 테이블내의 엔트리의 수 + 1 을 포인트 한다. 이것은, 클래스 파일 형식의 constant_pool_count 항목에 대응하고 있다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
constant_pool_byte_count_ptr jint * 돌아왔을 때, 반환된 raw 정수 풀내의 바이트수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
constant_pool_bytes_ptr unsigned char** 돌아왔을 때, raw 정수 풀을 포인트 한다. 이것은, 클래스 파일 형식의 constant_pool 항목으로 정의된 바이트가 된다.

 

에이전트는 unsigned char* 에 포인터를 건네준다. 돌아왔을 때,unsigned char* 는, 사이즈 *constant_pool_byte_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_get_constant_pool 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_ABSENT_INFORMATION 클래스가 프리미티브(primitive) 또는 배열 클래스이다.
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_NULL_POINTER constant_pool_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER constant_pool_byte_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER constant_pool_bytes_ptrNULL.

인터페이스인가 어떤가의 검사

jvmtiError
IsInterface(jvmtiEnv* env,
            jclass klass,
            jboolean* is_interface_ptr)

클래스 객체 참조가 인터페이스를 나타내고 있는지 어떤지를 판정합니다. 클래스가 실제로 인터페이스인 경우,jbooleanJNI_TRUE 를 돌려주어, 인터페이스가 아닌 경우에는 JNI_FALSE 를 돌려줍니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 55 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
is_interface_ptr jboolean * 돌아왔을 때, 이 함수의 boolean 형의 결과를 포인트 한다.

 

에이전트는 jboolean 에 포인터를 건네준다. 돌아왔을 때,jboolean 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_NULL_POINTER is_interface_ptrNULL.

배열 클래스인가 어떤가의 검사

jvmtiError
IsArrayClass(jvmtiEnv* env,
            jclass klass,
            jboolean* is_array_class_ptr)

클래스 객체 참조가 배열을 나타내고 있는지 어떤지를 판정합니다. jboolean 는, 클래스가 배열인 경우는 JNI_TRUE 가 되어, 그가 아닌 경우는 JNI_FALSE 가 됩니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 56 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
is_array_class_ptr jboolean * 돌아왔을 때, 이 함수의 boolean 형의 결과를 포인트 한다.

 

에이전트는 jboolean 에 포인터를 건네준다. 돌아왔을 때,jboolean 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_NULL_POINTER is_array_class_ptrNULL.

변경 가능 클래스인가 어떤가의 검사

jvmtiError
IsModifiableClass(jvmtiEnv* env,
            jclass klass,
            jboolean* is_modifiable_class_ptr)

클래스가 변경 가능한가 어떤가를 판정합니다. 클래스가 변경 가능한 경우 (is_modifiable_class_ptrJNI_TRUE 를 돌려주었을 경우), 그 클래스는,RedefineClasses 를 사용해 재정의하거나 (에이전트가 can_redefine_classes 권한을 소유하고 있으면(자) 가정),RetransformClasses 를 사용해 재변환하거나 (에이전트가 can_retransform_classes 권한을 소유하고 있으면(자) 가정) 할 수 있습니다. 어느 클래스가 변경 불가능한 경우 (is_modifiable_class_ptrJNI_FALSE 를 돌려주었을 경우), 그 클래스는 재정의하는 일도 재변환할 수도 있습니다.

 

프리미티브(primitive) 클래스 (java.lang.Integer.TYPE 등)와 배열 클래스가 변경 가능하게 될 것은 없습니다.

 

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 45 1.1

 

권한
필요한 기능
임의의 기능
권한 효과
can_redefine_any_class 이것을 소유하면(자), 모든 클래스 (프리미티브(primitive) 클래스와 배열 클래스는 제외하다)가 변경 가능하게 된다.
can_redefine_classes 이 함수의 결과에 어떤 영향도 주지 않는다. 다만, 이것을 추가로 소유하고 있지 않으면RedefineClasses 를 사용해 클래스를 변경할 수 없다.
can_retransform_classes 이 함수의 결과에 어떤 영향도 주지 않는다. 다만, 이것을 추가로 소유하고 있지 않으면RetransformClasses 을 사용해 클래스를 변경할 수 없다.

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
is_modifiable_class_ptr jboolean * 돌아왔을 때, 이 함수의 boolean 형의 결과를 포인트 한다.

 

에이전트는 jboolean 에 포인터를 건네준다. 돌아왔을 때,jboolean 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_NULL_POINTER is_modifiable_class_ptrNULL.

클래스 로더의 취득

jvmtiError
GetClassLoader(jvmtiEnv* env,
            jclass klass,
            jobject* classloader_ptr)

klass 로 지정된 클래스의 클래스 로더의 참조를,classloader_ptr 를 개입시켜 돌려줍니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 57 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
classloader_ptr jobject * 돌아왔을 때, 이 클래스를 로드한 클래스 로더를 포인트 한다. 클래스가 클래스 로더로 작성되어 있지 않은 경우, 또는 클래스 로더가 bootstrap 클래스 로더가 아닌 경우는,NULL 를 포인트 한다.

 

에이전트는 jobject 에 포인터를 건네준다. 돌아왔을 때,jobject 가 설정되어 있다. classloader_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_NULL_POINTER classloader_ptrNULL.

소스 디버그 확장 기능의 취득

jvmtiError
GetSourceDebugExtension(jvmtiEnv* env,
            jclass klass,
            char** source_debug_extension_ptr)

klass 로 지정된 클래스의 디버그 확장 기능을,source_debug_extension_ptr 를 개입시켜 돌려줍니다. 반환되는 캐릭터 라인에는,klass 의 클래스 파일에 존재하는 디버그 확장 정보가 그대로 포함됩니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 90 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_get_source_debug_extension 클래스의 소스 디버그 확장 기능을 취득할 수 있다.

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
source_debug_extension_ptr char** 돌아왔을 때, 클래스의 debug 확장 기능 (수정 UTF-8 캐릭터 라인으로서 encode 된다)을 포인트 한다.

 

에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_get_source_debug_extension 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_ABSENT_INFORMATION 클래스 정보에, 디버그 확장이 포함되지 않았다.
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_NULL_POINTER source_debug_extension_ptrNULL.

클래스의 재변환

jvmtiError
RetransformClasses(jvmtiEnv* env,
            jint class_count,
            const jclass* classes)

이 함수는, 벌써 로드 끝난 클래스의바이트코드Instrumentation을 용이하게 합니다. 수정하면서 디버그를 계속하기 위해서(때문에) 소스로부터 재컴파일 하는 경우와 같이, 기존의 바이트 코드를 참조하는 것 없이 클래스 정의를 치환하는 경우는, 대신에 RedefineClasses 함수를 사용하도록 해 주세요.

 

클래스가 처음 로드 될 때나재정의될 때에, 그 초기 클래스 파일 바이트를 ClassFileLoadHook 이벤트 경유로 변환할 수가 있습니다. 이 함수는, 이전에 변환을 했는지 어떠했는지에는 관계없이, 변환 처리를 재실행합니다. 이 재변환은 다음의 순서로 행해집니다.

  • 초기 클래스 파일 바이트로부터 처리가 개시됩니다.
  • 전회의 로드 또는 재정의시에 ClassFileLoadHook 이벤트를 수신한재변환 불가능 에이전트 마다, 에이전트가 (new_class_data 파라미터 경유로) 돌려준 바이트가 변환의 출력으로서 재사용됩니다. 이것은,ClassFileLoadHook 이벤트가 이러한 에이전트에 송신되지 않는 점을 제외하면, 전회의 변환을 변경없이 재적용하는 것과 등가입니다.
  • 재변환 가능 에이전트 마다,ClassFileLoadHook 이벤트가 송신됩니다. 이것에 의해, 새로운 변환을 적용할 수 있게 됩니다.
  • 변환된 클래스 파일 바이트가 클래스의 새로운 정의로서 인스톨 됩니다.

자세한 것은 ClassFileLoadHook 이벤트를 참조해 주세요.

 

초기 클래스 파일 바이트는,ClassLoader.defineClass 또는 RedefineClasses 에게 건네진 바이트 (변환의 적용전)를 나타냅니다. 다만, 양자가 엄밀하게는 일치하지 않는 것이 있습니다. GetConstantPool 로 설명한 것처럼, 정수 풀이 다른 경우가 있습니다. 메소드의 바이트 코드내의 정수 풀 인덱스는 대응합니다. 일부의 속성이 존재하지 않을 가능성이 있습니다. 순서가 중요하지 않은 경우 (메소드의 순서 등), 순서가 유지되지 않는 경우가 있습니다.

 

재변환을 실시하면, 새로운 버젼의 메소드가 인스톨 될 가능성이 있습니다. 낡은 메소드 버젼은폐지되어 그 후의 호출에서는 새로운 메소드 버젼이 사용됩니다. 재정의된 메소드에 액티브한 스택 프레임이 있으면(자), 그 액티브 프레임은 원의 메소드의 바이트 코드의 실행을 속행합니다.

 

이 함수에 의해, 일반적인 JVM 시멘틱스의 아래에서 행해지는 이외의 초기화는 일어나지 않습니다. 즉, 클래스를 재변환해도, 그 클래스의 초기화는 실행되지 않습니다. static 필드의 값은, 호출전 상태인 채입니다.

 

thread를 중단할 필요는 없습니다.

 

클래스내의 breakpoint는 해제됩니다.

 

속성은 모두 갱신됩니다.

 

재변환된 클래스의 인스턴스는 영향을 받지 않습니다. 필드는 이전의 값을 보관 유지합니다. 인스턴스상의태그도 영향을 받지 않습니다.

 

이 호출에의 응답으로서ClassFileLoadHook 이외의 이벤트가 송신될 것은 없습니다.

 

재변환에 의해, 메소드의 본체, 정수 풀, 속성이 변경되는 일이 있습니다. 재변환에 의해, 필드나 메소드의 추가, 삭제, 이름의 변경, 메소드의 시그니챠의 변경, 수식자의 변경, 상속의 변경이 일어나지 않게 할 필요가 있습니다. 이러한 제한은, 장래의 버젼으로 해제될 가능성이 있습니다. 지원되어 있지 않은 재변환이 시행되었을 때 반환되는 에러 코드에 대해서는, 아래와 같은 에러 반환값의 설명을 참조해 주세요. 클래스 파일의 바이트가 검증 또는 인스톨 되는 것은, 그러한 바이트가 ClassFileLoadHook 이벤트의 체인을 통과 혀 후입니다. 따라서, 변환의 결과가, 반환되는 에러 코드에 반영됩니다. JVMTI_ERROR_NONE 이외의 에러 코드가 돌려주어졌을 경우, 재변환 대상 클래스의 어느 것에도 새로운 정의는 인스톨 되지 않습니다. 이 함수가 (에러 코드 JVMTI_ERROR_NONE 로) 돌아왔을 경우, 재변환 대상의 모든 클래스에 새로운 정의가 인스톨 됩니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 152 1.1

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_retransform_classes RetransformClasses 로 클래스를 재변환할 수 있다. 특정의 구현에 의한 이 권한의 제한 (「권한」섹션을 참조)에 가세해 이 권한은, 이 환경에서 ClassFileLoadHook 이벤트가 처음 유효화 되기 전으로 설정해야 한다. ClassFileLoadHook 가 처음 유효화 된 시점에서 이 권한을 소유하고 있는 환경을 「재변환 가능」이라고 부른다. ClassFileLoadHook 가 처음 유효화 된 시점에서 이 권한을 소유하고 있지 않는 환경은 「재변환 불가능」이라고 부른다.
임의의 기능
can_retransform_any_class RetransformClasses 를 임의의 클래스에서 호출할 수 있다 (can_retransform_classes 도 설정할 필요가 있다)

 

파라미터
이름 설명
class_count jint 재변환되는 클래스의 수.
classes const jclass * 재변환되는 클래스의 배열.

 

에이전트는 jclassclass_count 요소의 배열을 건네준다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_retransform_classes 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_UNMODIFIABLE_CLASS 변경 불가능한 클래스가 classes 에 포함되어 있다. IsModifiableClass 를 참조.
JVMTI_ERROR_INVALID_CLASS classes 중 한쪽이 유효한 클래스가 아니다.
JVMTI_ERROR_UNSUPPORTED_VERSION 재변환되는 클래스 파일의 버젼 번호가 이 VM 로 지원되어 있지 않다.
JVMTI_ERROR_INVALID_CLASS_FORMAT 재변환되는 클래스 파일의 형식이 올바르지 않다 (VM ClassFormatError 를 돌려준다).
JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION 재변환되는 클래스 파일의 정의가 순환 정의가 된다 (VM 는 ClassCircularityError 를 돌려준다).
JVMTI_ERROR_FAILS_VERIFICATION 재변환되는 클래스 파일의 바이트가 검증에 실패한다.
JVMTI_ERROR_NAMES_DONT_MATCH 재변환되는 클래스 파일내에서 정의된 클래스명이, 구클래스 객체내의 이름과 다르다.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED 재변환되는 클래스 파일로 메소드의 추가가 필요.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED 재변환되는 클래스 파일에 의해 필드가 변경된다.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED 재변환되는 클래스 파일의 직접 슈퍼 클래스가 다르다, 또는 직접 구현되고 있는 인터페이스가 다르다.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED 재변환되는 클래스 파일에서는 구클래스의 버젼으로 선언한 메소드를 선언하지 않는다.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED 재변환된 클래스 파일에 다른 클래스 수식자가 포함되어 있다.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED 재변환되는 클래스 파일의 메소드의 수식자가 구클래스의 버젼의 수식자와 다르다.
JVMTI_ERROR_ILLEGAL_ARGUMENT class_count0 보다 작다.
JVMTI_ERROR_NULL_POINTER classesNULL.

클래스의 재정의

typedef struct {
    jclass klass;
    jint class_byte_count;
    const unsigned char* class_bytes;
} jvmtiClassDefinition;
jvmtiError
RedefineClasses(jvmtiEnv* env,
            jint class_count,
            const jvmtiClassDefinition* class_definitions)

지정된 클래스는 모두, 제공되는 정의에 따라 재정의됩니다. 이 함수는, 어느 클래스의 정의를 새로운 정의로 옮겨놓는 경우에 사용됩니다. 그러한 조작은, 수정하면서 디버그를 계속해 가는 경우에 필요하게 되는 일이 있습니다. 바이트코드Instrumentation을 실시하는 경우 등, 기존의 클래스 파일의 바이트를 변환할 필요가 있는 경우는,RetransformClasses 를 사용해 주세요.

 

재정의를 실시하면, 새로운 버젼의 메소드가 인스톨 될 가능성이 있습니다. 낡은 메소드 버젼은폐지되어 그 후의 호출에서는 새로운 메소드 버젼이 사용됩니다. 재정의된 메소드에 액티브한 스택 프레임이 있으면(자), 그 액티브 프레임은 원의 메소드의 바이트 코드의 실행을 속행합니다. 스택 프레임을 리셋 하는 경우는, 파기된 메소드와 함께 PopFrame 를 사용해, 프레임을 팝 해 주세요.

 

이 함수에 의해, 일반적인 JVM 시멘틱스의 아래에서 행해지는 이외의 초기화는 일어나지 않습니다. 즉, 클래스를 재정의해도, 그 클래스의 초기화는 실행되지 않습니다. static 필드의 값은, 호출전 상태인 채입니다.

 

thread를 중단할 필요는 없습니다.

 

클래스내의 breakpoint은 해제됩니다.

 

속성은 모두 갱신됩니다.

 

재정의된 클래스의 인스턴스는 영향을 받지 않습니다. 필드는 이전의 값을 보관 유지합니다. 인스턴스상의태그도, 영향을 받지 않습니다.

 

이 호출에 대답해, JVM TI 이벤트로서클래스 파일 로드 훅이 송신됩니다 (유효한 경우). 그러나, 그 외의 JVM TI 이벤트는 송신되지 않습니다.

 

재정의에 의해, 메소드의 본체, 정수 풀, 속성이 변경되는 일이 있습니다. 재정의에 의해, 필드나 메소드의 추가, 삭제, 이름의 변경, 메소드의 시그니챠의 변경, 수식자의 변경, 상속의 변경이 일어나지 않게 할 필요가 있습니다. 이러한 제한은, 장래의 버젼으로 해제될 가능성이 있습니다. 지원되어 있지 않은 재정의가 시행되었을 때 반환되는 에러 코드에 대해서는, 아래와 같은 에러 반환값의 설명을 참조해 주세요. 클래스 파일의 바이트가 검증 또는 인스톨 되는 것은, 그러한 바이트가 ClassFileLoadHook 이벤트의 체인을 통과 혀 후입니다. 따라서,class_definitions 에게 건네진 바이트에 적용된 변환의 결과가, 반환되는 에러 코드에 반영됩니다. JVMTI_ERROR_NONE 이외의 에러 코드가 돌려주어졌을 경우, 재정의 대상 클래스의 어느 것에도 새로운 정의는 인스톨 되지 않습니다. 이 함수가 (에러 코드 JVMTI_ERROR_NONE 로) 돌아왔을 경우, 재정의 대상의 모든 클래스에 새로운 정의가 인스톨 됩니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 87 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_redefine_classes RedefineClasses 로 클래스를 재정의할 수 있다.
임의의 기능
can_redefine_any_class 프리미티브(primitive) 클래스에서도 배열 클래스도 아닌 임의의 클래스를 변경 (재변환 또는 재정의)할 수 있다. IsModifiableClass 를 참조.

 

jvmtiClassDefinition - 클래스의 재정의의 설명
필드 설명
klass jclass 이 클래스의 클래스 객체
class_byte_count jint 정의하는 클래스의 바이트수
class_bytes const unsigned char* 클래스를 정의하는 바이트 (「Java 가상 머신 스펙」「Class File Format」의 설명을 참조)

 

파라미터
이름 설명
class_count jint class_definitions 로 지정된 클래스의 수
class_definitions const jvmtiClassDefinition * 새로운 클래스 정의의 배열수

 

에이전트는 jvmtiClassDefinitionclass_count 요소의 배열을 건네준다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_redefine_classes 를 가지지 않는다. AddCapabilities 을 사용한다.
JVMTI_ERROR_NULL_POINTER 몇개의 class_bytesNULL.
JVMTI_ERROR_UNMODIFIABLE_CLASS class_definitions 의 요소는 변경할 수 없다. IsModifiableClass 를 참조.
JVMTI_ERROR_INVALID_CLASS class_definitions 의 요소가 유효한 클래스는 아니다.
JVMTI_ERROR_UNSUPPORTED_VERSION 새로운 클래스 파일의 버젼이 이 VM 로 지원되어 있지 않다.
JVMTI_ERROR_INVALID_CLASS_FORMAT 새로운 클래스 파일의 형식이 올바르지 않다 (VM ClassFormatError 를 돌려준다).
JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION 새로운 클래스 파일의 정의가 순환 정의가 된다 (VM 는 ClassCircularityError 를 돌려준다).
JVMTI_ERROR_FAILS_VERIFICATION 클래스 바이트가 검증에 실패한다.
JVMTI_ERROR_NAMES_DONT_MATCH 새로운 클래스 파일내에서 정의된 클래스명이, 구클래스 객체내의 이름과 다르다.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED 새로운 클래스 파일로 메소드의 추가가 필요.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED 새로운 클래스의 버젼에 의해 필드가 변경된다.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED 새로운 클래스의 버젼의 직접 슈퍼 클래스가 다르다, 또는 직접 구현되고 있는 인터페이스가 다르다.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED 새로운 클래스의 버젼에서는 구클래스의 버젼으로 선언한 메소드를 선언하지 않는다.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED 새로운 클래스의 버젼의 수식자가 다르다.
JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED 새로운 클래스의 버젼의 메소드의 수식자가 구클래스의 버젼의 수식자와 다르다.
JVMTI_ERROR_ILLEGAL_ARGUMENT class_count0 보다 작다.
JVMTI_ERROR_NULL_POINTER classes_definitionsNULL.

 


객체

객체 함수:

객체의 형태:

 


객체 사이즈의 취득

jvmtiError
GetObjectSize(jvmtiEnv* env,
            jobject object,
            jlong* size_ptr)

object 로 지정된 객체의 사이즈를,size_ptr 를 개입시켜 돌려줍니다. 이 사이즈는, 이 객체에 의해 소비되는 기억 영역의 용량의 근사치이며, 구현 마다 다릅니다. 일부 또는 모든 객체의 오버헤드를 포함할 수가 있습니다. 이 때문에, 구현내에서의 비교에는 적합합니다만, 구현간에서의 비교에는 적합하지 않습니다. 예상치는, JVM 를 1 회 호출하는 동안으로 변경되는 일이 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 154 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
object jobject 조회하는 객체.
size_ptr jlong * 돌아왔을 때, 객체의 사이즈 (바이트 단위)를 포인트 한다.

 

에이전트는 jlong 에 포인터를 건네준다. 돌아왔을 때,jlong 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_OBJECT object 가 객체는 아니다.
JVMTI_ERROR_NULL_POINTER size_ptrNULL.

객체의 해시 코드의 취득

jvmtiError
GetObjectHashCode(jvmtiEnv* env,
            jobject object,
            jint* hash_code_ptr)

object 로 지정된 객체의 해시 코드를,hash_code_ptr 를 개입시켜 돌려줍니다. 객체 참조의 해시 테이블을 관리하기 위해서, 이 해시 코드를 사용할 수 있습니다. 그러나, 일부의 구현에서는, 퍼포먼스가 큰폭으로 저감 할 가능성이 있습니다. 대부분의 경우, 정보와 객체의 관련지어에는,태그를 사용하는 편이 효과적입니다. 이 함수는, 특정의 객체의 지속 기간중 쭉, 그 객체의 해시 코드값가 같은 것을 보증합니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 58 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
object jobject 조회하는 객체.
hash_code_ptr jint * 돌아왔을 때, 객체의 해시 코드를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_OBJECT object 가 객체는 아니다.
JVMTI_ERROR_NULL_POINTER hash_code_ptrNULL.

객체의 모니터의 이용 정보를 취득

typedef struct {
    jthread owner;
    jint entry_count;
    jint waiter_count;
    jthread* waiters;
    jint notify_waiter_count;
    jthread* notify_waiters;
} jvmtiMonitorUsage;
jvmtiError
GetObjectMonitorUsage(jvmtiEnv* env,
            jobject object,
            jvmtiMonitorUsage* info_ptr)

객체의 모니터에 관한 정보를 가져옵니다. jvmtiMonitorUsage 구조체의 필드에, 모니터의 사용에 관한 정보가 들어갑니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 59 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_get_monitor_info GetObjectMonitorUsage 를 실행할 수 있다.

 

jvmtiMonitorUsage - 객체 모니터의 사용 정보
필드 설명
owner jthread 이 모니터를 소유하고 있는 thread. 이 모니터가 사용되어 있지 않은 경우는 NULL.
entry_count jint 이 모니터를 소유하는 thread가 모니터를 사용한 회수
waiter_count jint 이 모니터를 소유하는 차례를 기다리고 있는 thread의 수
waiters jthread * waiter_count 대기 thread
notify_waiter_count jint 이 모니터로부터 통지를 받는 대기 thread의 수
notify_waiters jthread * 통지를 기다리고 있는 notify_waiter_count thread

 

파라미터
이름 설명
object jobject 조회하는 객체.
info_ptr jvmtiMonitorUsage * 돌아왔을 때, 지정된 객체의 모니터 정보가 들어가 있다.

 

에이전트는 jvmtiMonitorUsage 에 포인터를 건네준다. 돌아왔을 때,jvmtiMonitorUsage 가 설정되어 있다. jvmtiMonitorUsageowner 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다. jvmtiMonitorUsagewaiters 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiMonitorUsagewaiters 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다. jvmtiMonitorUsagenotify_waiters 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiMonitorUsagenotify_waiters 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_get_monitor_info 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_OBJECT object 가 객체는 아니다.
JVMTI_ERROR_NULL_POINTER info_ptrNULL.

 


필드

필드 함수:

 


필드의 이름과 시그니챠의 취득

jvmtiError
GetFieldName(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            char** name_ptr,
            char** signature_ptr,
            char** generic_ptr)

klassfield 로 지정된 필드에 도착해, 이름을 name_ptr 로 돌려주어, 시그니챠를 signature_ptr 로 돌려줍니다.

 

필드의 시그니챠는 JNI 스펙으로 정의되고 있어「Java 가상 머신 스펙」에서는필드 기술자로 불리고 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 60 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
klass jclass 조회하는 필드의 클래스.
field jfieldID 조회하는 필드.
name_ptr char ** 돌아왔을 때, 필드명 (수정 UTF-8 캐릭터 라인으로서 encode 된다)을 포인트 한다.

 

에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. name_ptrNULL 의 경우, 이름은 돌려주어지지 않다.
signature_ptr char ** 돌아왔을 때, 필드의 시그니챠 (수정 UTF-8 캐릭터 라인으로서 encode 된다)를 포인트 한다.

 

에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. signature_ptrNULL 의 경우, 시그니챠는 돌려주어지지 않다.
generic_ptr char ** 돌아왔을 때, 필드의 총칭 시그니챠 (수정 UTF-8 캐릭터 라인으로서 encode 된다)를 포인트 한다. 필드의 총칭 시그니챠 속성이 존재하지 않는 경우는, 돌아왔을 때 NULL 를 포인트 한다.

 

에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. generic_ptrNULL 의 경우, 총칭 시그니챠는 돌려주어지지 않다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_INVALID_FIELDID field 가 jfieldID 는 아니다.

필드의 선언 클래스의 취득

jvmtiError
GetFieldDeclaringClass(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            jclass* declaring_class_ptr)

klassfield 로 지정된 필드에 도착해, 그 필드를 정의하고 있는 클래스를 declaring_class_ptr 를 개입시켜 돌려줍니다. 선언하고 있는 클래스는,klass, 슈퍼 클래스, 또는 구현된 인터페이스의 머지않아인가입니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 61 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
field jfieldID 조회하는 필드.
declaring_class_ptr jclass * 돌아왔을 때, 선언하는 클래스를 포인트 한다.

 

에이전트는 jclass 에 포인터를 건네준다. 돌아왔을 때,jclass 가 설정되어 있다. declaring_class_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_INVALID_FIELDID field 가 jfieldID 는 아니다.
JVMTI_ERROR_NULL_POINTER declaring_class_ptrNULL.

필드의 수식자의 취득

jvmtiError
GetFieldModifiers(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            jint* modifiers_ptr)

klassfield 로 지정된 필드의 액세스 플래그를,modifiers_ptr 를 개입시켜 돌려줍니다. 액세스 플래그에 대해서는,「Java 가상 머신 스펙」「Class File Format」의 장으로 정의되고 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 62 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
klass jclass 조회하는 클래스.
field jfieldID 조회하는 필드.
modifiers_ptr jint * 돌아왔을 때, 액세스 플래그를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_INVALID_FIELDID field 가 jfieldID 는 아니다.
JVMTI_ERROR_NULL_POINTER modifiers_ptrNULL.

합성 필드인가 어떤가의 검사

jvmtiError
IsFieldSynthetic(jvmtiEnv* env,
            jclass klass,
            jfieldID field,
            jboolean* is_synthetic_ptr)

klassfield 로 지정된 필드에 대해,is_synthetic_ptr 를 개입시켜 그 필드가 합성일지 어떨지를 나타내는 값을 돌려줍니다. 합성 필드는 컴파일러에 의해 생성됩니다만, 원의 원시 코드내에는 존재하지 않습니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 63 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_get_synthetic_attribute 합성 필드 또는 합성 메소드일지 어떨지를 테스트할 수 있는 - IsFieldSyntheticIsMethodSynthetic

 

파라미터
이름 설명
klass jclass 조회하는 필드의 클래스.
field jfieldID 조회하는 필드.
is_synthetic_ptr jboolean * 돌아왔을 때, 이 함수의 boolean 형의 결과를 포인트 한다.

 

에이전트는 jboolean 에 포인터를 건네준다. 돌아왔을 때,jboolean 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_get_synthetic_attribute 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_CLASS klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다.
JVMTI_ERROR_INVALID_FIELDID field 가 jfieldID 는 아니다.
JVMTI_ERROR_NULL_POINTER is_synthetic_ptrNULL.

 


메소드

메소드 함수:

메소드의 형태:

이러한 함수는, 어느 메소드 (jmethodID 로서 표현)에 관한 정보를 제공하거나 메소드의 처리 방법을 설정하거나 합니다.

폐지 메소드

함수 RetransformClassesRedefineClasses 를 호출하면(자), 새로운 버젼의 메소드가 인스톨 됩니다. 원의 메소드와 재정의한 메소드가 동등으로 간주해지는 것은, 다음과 같은 경우입니다.

  • 쌍방의 메소드의 바이트 코드가 같다 (정수 풀의 인덱스를 제외하다)
  • 참조 정수가 동일하다

새로운 메소드 버젼과 등가가 아닌 원의 메소드 버젼은 「폐지」라고 불려 새로운 메소드 ID 를 할당할 수 있습니다. 그리고, 원의 메소드 ID 는 새로운 메소드 버젼을 참조하게 됩니다. 폐기된 메소드인가 어떤가를 테스트하려면 ,IsMethodObsolete 를 사용합니다.

 


메소드의 이름과 시그니챠의 취득

jvmtiError
GetMethodName(jvmtiEnv* env,
            jmethodID method,
            char** name_ptr,
            char** signature_ptr,
            char** generic_ptr)

method 로 지정된 메소드의 이름을 name_ptr 를 개입시켜 돌려주어, 메소드의 시그니챠를 signature_ptr 를 개입시켜 돌려줍니다.

 

메소드의 시그니챠는 JNI 스펙으로 정의되고 있어「Java 가상 머신 스펙」에서는메소드 기술자로 불리고 있습니다. 「Java 언어 스펙」에 정의된 메소드의 시그니챠와는 다른 점에 주의해 주세요.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 64 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
method jmethodID 조회하는 메소드.
name_ptr char ** 돌아왔을 때, 메소드명 (수정 UTF-8 캐릭터 라인으로서 encode 된다)을 포인트 한다.

 

에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. name_ptrNULL 의 경우, 이름은 돌려주어지지 않다.
signature_ptr char ** 돌아왔을 때, 메소드시그니챠 (수정 UTF-8 캐릭터 라인으로서 encode 된다)를 포인트 한다.

 

에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. signature_ptrNULL 의 경우, 시그니챠는 돌려주어지지 않다.
generic_ptr char ** 돌아왔을 때, 메소드의 총칭 시그니챠 (수정 UTF-8 캐릭터 라인으로서 encode 된다)를 포인트 한다. 메소드의 총칭 시그니챠 속성이 존재하지 않는 경우는, 돌아왔을 때 NULL 를 포인트 한다.

 

에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. generic_ptrNULL 의 경우, 총칭 시그니챠는 돌려주어지지 않다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_METHODID method 가 jmethodID 는 아니다.

메소드의 선언 클래스의 취득

jvmtiError
GetMethodDeclaringClass(jvmtiEnv* env,
            jmethodID method,
            jclass* declaring_class_ptr)

method 로 지정된 메소드를 정의하는 클래스를,declaring_class_ptr 를 개입시켜 돌려줍니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 65 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
method jmethodID 조회하는 메소드.
declaring_class_ptr jclass * 돌아왔을 때, 선언하는 클래스를 포인트 한다.

 

에이전트는 jclass 에 포인터를 건네준다. 돌아왔을 때,jclass 가 설정되어 있다. declaring_class_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_METHODID method 가 jmethodID 는 아니다.
JVMTI_ERROR_NULL_POINTER declaring_class_ptrNULL.

메소드의 수식자의 취득

jvmtiError
GetMethodModifiers(jvmtiEnv* env,
            jmethodID method,
            jint* modifiers_ptr)

method 로 지정된 메소드의 액세스 플래그를,modifiers_ptr 를 개입시켜 돌려줍니다. 액세스 플래그에 대해서는,「Java 가상 머신 스펙」「Class File Format」의 장으로 정의되고 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 66 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
method jmethodID 조회하는 메소드.
modifiers_ptr jint * 돌아왔을 때, 액세스 플래그를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_METHODID method 가 jmethodID 는 아니다.
JVMTI_ERROR_NULL_POINTER modifiers_ptrNULL.

국소 변수의 취득

jvmtiError
GetMaxLocals(jvmtiEnv* env,
            jmethodID method,
            jint* max_ptr)

method 로 지정된 메소드에 의해 사용되는 국소 변수 (호출시에 메소드에 파라미터를 건네주기 위해서(때문에) 사용되는 국소 변수를 포함한다)의 슬롯수를 돌려줍니다.

 

「Java 가상 머신 스펙」「Code Attribute」섹션의 max_locals 의 설명을 참조해 주세요.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 68 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
method jmethodID 조회하는 메소드.
max_ptr jint * 돌아왔을 때, 국소 변수의 슬롯의 최대수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_METHODID method 가 jmethodID 는 아니다.
JVMTI_ERROR_NATIVE_METHOD method 는 네이티브 메소드.
JVMTI_ERROR_NULL_POINTER max_ptrNULL.

인수의 사이즈의 취득

jvmtiError
GetArgumentsSize(jvmtiEnv* env,
            jmethodID method,
            jint* size_ptr)

method 로 지정된 메소드의 인수에 의해 사용되는 국소 변수의 슬롯수를,max_ptr 를 개입시켜 돌려줍니다. 덧붙여 2 워드의 인수는, 슬롯을 2 개 사용합니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 69 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
method jmethodID 조회하는 메소드.
size_ptr jint * 돌아왔을 때, 인수의 슬롯의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_METHODID method 가 jmethodID 는 아니다.
JVMTI_ERROR_NATIVE_METHOD method 는 네이티브 메소드.
JVMTI_ERROR_NULL_POINTER size_ptrNULL.

행 번호 테이블의 취득

typedef struct {
    jlocation start_location;
    jint line_number;
} jvmtiLineNumberEntry;
jvmtiError
GetLineNumberTable(jvmtiEnv* env,
            jmethodID method,
            jint* entry_count_ptr,
            jvmtiLineNumberEntry** table_ptr)

method 로 지정된 메소드에 대해, 소스행 번호의 엔트리로부터 완성되는 테이블을 돌려줍니다. 테이블의 사이즈는 entry_count_ptr, 테이블 자체는 table_ptr 를 개입시켜 돌려주어집니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 70 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_get_line_numbers 메소드의 행 번호 테이블을 취득할 수 있다

 

jvmtiLineNumberEntry - 행 번호 테이블의 엔트리
필드 설명
start_location jlocation 행을 개시하는 jlocation
line_number jint 행 번호

 

파라미터
이름 설명
method jmethodID 조회하는 메소드.
entry_count_ptr jint * 돌아왔을 때, 테이블내의 엔트리의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
table_ptr jvmtiLineNumberEntry ** 돌아왔을 때, 행 번호 테이블의 포인터를 포인트 한다.

 

에이전트는 jvmtiLineNumberEntry* 에 포인터를 건네준다. 돌아왔을 때,jvmtiLineNumberEntry* 는, 사이즈 *entry_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_get_line_numbers 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_ABSENT_INFORMATION 클래스의 정보에 행 번호가 포함되지 않았다.
JVMTI_ERROR_INVALID_METHODID method 가 jmethodID 는 아니다.
JVMTI_ERROR_NATIVE_METHOD method 는 네이티브 메소드.
JVMTI_ERROR_NULL_POINTER entry_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER table__ptrNULL.

메소드의 배치 위치의 취득

jvmtiError
GetMethodLocation(jvmtiEnv* env,
            jmethodID method,
            jlocation* start_location_ptr,
            jlocation* end_location_ptr)

method 로 지정된 메소드에 대해, 그 개시 주소와 종료 주소를 start_location_ptrend_location_ptr 를 개입시켜 돌려줍니다. 종래의 바이트 코드 인덱스 schema에서는,start_location_ptr 는 항상 제로를,end_location_ptr 는 항상 바이트 코드로부터 1 을 뺀 값을 포인트 합니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 71 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
method jmethodID 조회하는 메소드.
start_location_ptr jlocation * 돌아왔을 때, 최초의 위치를 포인트 한다. 위치 정보를 얻을 수 없는 경우는 -1 을 포인트 한다. 정보의 사용이 가능해,GetJLocationFormatJVMTI_JLOCATION_JVMBCI 를 돌려주는 경우, 항상 제로가 된다.

 

에이전트는 jlocation 에 포인터를 건네준다. 돌아왔을 때,jlocation 가 설정되어 있다.
end_location_ptr jlocation * 돌아왔을 때, 마지막 위치를 포인트 한다. 위치 정보를 얻을 수 없는 경우는 -1 을 포인트 한다.

 

에이전트는 jlocation 에 포인터를 건네준다. 돌아왔을 때,jlocation 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_ABSENT_INFORMATION 클래스 정보에 메소드의 사이즈가 포함되지 않았다.
JVMTI_ERROR_INVALID_METHODID method 가 jmethodID 는 아니다.
JVMTI_ERROR_NATIVE_METHOD method 는 네이티브 메소드.
JVMTI_ERROR_NULL_POINTER start_location_ptrNULL.
JVMTI_ERROR_NULL_POINTER end_location_ptrNULL.

국소 변수 테이블의 취득

typedef struct {
    jlocation start_location;
    jint length;
    char* name;
    char* signature;
    char* generic_signature;
    jint slot;
} jvmtiLocalVariableEntry;
jvmtiError
GetLocalVariableTable(jvmtiEnv* env,
            jmethodID method,
            jint* entry_count_ptr,
            jvmtiLocalVariableEntry** table_ptr)

국소 변수의 정보를 돌려줍니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 72 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_access_local_variables 국소 변수를 설정해, 취득할 수 있다

 

jvmtiLocalVariableEntry - 국소 변수 테이블의 엔트리
필드 설명
start_location jlocation 이 국소 변수가 처음 유효하게 되는 코드 배열 인덱스 (즉, 이 국소 변수는 거기서 값을 가지고 있지 않으면 안 된다).
length jint 이 국소 변수의 유효 부분의 길이. 이 국소 변수가 유효하다 마지막 코드 배열 인덱스는,start_location + length 가 된다.
name char * 국소 변수명. 수정 UTF-8 캐릭터 라인으로서 encode 된다.
signature char * 국소 변수의 형태 시그니챠. 수정 UTF-8 캐릭터 라인으로서 encode 된다. 이 시그니챠의 형식은,「Java 가상 머신 스펙」「Field Descriptors」섹션으로 정의된 형식과 같게 된다.
generic_signature char * 국소 변수의 총칭 시그니챠. 수정 UTF-8 캐릭터 라인으로서 encode 된다. 국소 변수가 총칭형을 가지지 않는 경우, 이 필드의 값은 NULL.
slot jint 국소 변수의 슬롯. 「국소 변수」를 참조.

 

파라미터
이름 설명
method jmethodID 조회하는 메소드.
entry_count_ptr jint * 돌아왔을 때, 테이블내의 엔트리의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
table_ptr jvmtiLocalVariableEntry ** 돌아왔을 때, 국소 변수 테이블의 엔트리의 배열을 포인트 한다.

 

에이전트는 jvmtiLocalVariableEntry* 에 포인터를 건네준다. 돌아왔을 때,jvmtiLocalVariableEntry* 는, 사이즈 *entry_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiLocalVariableEntryname 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiLocalVariableEntrysignature 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiLocalVariableEntrygeneric_signature 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_access_local_variables 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_ABSENT_INFORMATION 클래스 정보에 국소 변수의 정보가 포함되지 않았다.
JVMTI_ERROR_INVALID_METHODID method 가 jmethodID 는 아니다.
JVMTI_ERROR_NATIVE_METHOD method 는 네이티브 메소드.
JVMTI_ERROR_NULL_POINTER entry_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER table__ptrNULL.

바이트 코드의 취득

jvmtiError
GetBytecodes(jvmtiEnv* env,
            jmethodID method,
            jint* bytecode_count_ptr,
            unsigned char** bytecodes_ptr)

method 로 지정된 메소드를 구현하는 바이트 코드를 돌려줍니다. 바이트 코드의 수는,bytecode_count_ptr 를 개입시켜 돌려주어집니다. 바이트 코드 자체는,bytecodes_ptr 를 개입시켜 돌려주어집니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 75 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_get_bytecodes 메소드 GetBytecodes 의 바이트 코드를 취득할 수 있다.

 

파라미터
이름 설명
method jmethodID 조회하는 메소드.
bytecode_count_ptr jint * 돌아왔을 때, 바이트 코드의 배열의 길이를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
bytecodes_ptr unsigned char** 돌아왔을 때, 바이트 코드 배열에의 포인터를 포인트 한다.

 

에이전트는 unsigned char* 에 포인터를 건네준다. 돌아왔을 때,unsigned char* 는, 사이즈 *bytecode_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_get_bytecodes 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_METHODID method 가 jmethodID 는 아니다.
JVMTI_ERROR_NATIVE_METHOD method 는 네이티브 메소드.
JVMTI_ERROR_NULL_POINTER bytecode_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER bytecode_ptrNULL.

네이티브 메소드인가 어떤가의 검사

jvmtiError
IsMethodNative(jvmtiEnv* env,
            jmethodID method,
            jboolean* is_native_ptr)

method 로 지정된 메소드가 네이티브 메소드인가 어떤가를 나타내는 값을,is_native_ptr 를 개입시켜 돌려줍니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 76 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
method jmethodID 조회하는 메소드.
is_native_ptr jboolean * 돌아왔을 때, 이 함수의 boolean 형의 결과를 포인트 한다.

 

에이전트는 jboolean 에 포인터를 건네준다. 돌아왔을 때,jboolean 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_METHODID method 가 jmethodID 는 아니다.
JVMTI_ERROR_NULL_POINTER is_native_ptrNULL.

합성 메소드인가 어떤가의 검사

jvmtiError
IsMethodSynthetic(jvmtiEnv* env,
            jmethodID method,
            jboolean* is_synthetic_ptr)

method 로 지정된 메소드가 합성 메소드인가 어떤가를 나타내는 값을,is_synthetic_ptr 를 개입시켜 돌려줍니다. 합성 메소드는, 컴파일러에 의해 생성됩니다만, 원의 원시 코드내에는 존재하지 않습니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 77 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_get_synthetic_attribute 합성 필드 또는 합성 메소드일지 어떨지를 테스트할 수 있는 - IsFieldSyntheticIsMethodSynthetic

 

파라미터
이름 설명
method jmethodID 조회하는 메소드.
is_synthetic_ptr jboolean * 돌아왔을 때, 이 함수의 boolean 형의 결과를 포인트 한다.

 

에이전트는 jboolean 에 포인터를 건네준다. 돌아왔을 때,jboolean 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_get_synthetic_attribute 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_METHODID method 가 jmethodID 는 아니다.
JVMTI_ERROR_NULL_POINTER is_synthetic_ptrNULL.

폐기된 메소드인가 어떤가의 검사

jvmtiError
IsMethodObsolete(jvmtiEnv* env,
            jmethodID method,
            jboolean* is_obsolete_ptr)

메소드 ID 가폐지 메소드 버젼을 참조하고 있을지 어떨지를 판정합니다.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 91 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
method jmethodID 조회하는 메소드 ID.
is_obsolete_ptr jboolean * 돌아왔을 때, 이 함수의 boolean 형의 결과를 포인트 한다.

 

에이전트는 jboolean 에 포인터를 건네준다. 돌아왔을 때,jboolean 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_METHODID method 가 jmethodID 는 아니다.
JVMTI_ERROR_NULL_POINTER is_obsolete_ptrNULL.

네이티브 메소드 접두사의 설정

jvmtiError
SetNativeMethodPrefix(jvmtiEnv* env,
            const char* prefix)

이 함수는, 이름에 접두사를 적용해 재시행할 수 있도록(듯이) 하는 것으로써, 네이티브 메소드 해결의 에러 처리를 변경합니다. 이것을 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 는 실제의 네이티브 메소드의 래퍼로, 접두사 「wrapped_」가 부가되고 있습니다. 다만, 「wrapped_」는 기존의 메소드의 이름의 일부로서 사용되고 있을 가능성이 있기 (위해)때문에, 접두사로서는 좋은 선택사항이 아닙니다. 「$$$MyAgentWrapped$$$_」와 같은 접두사 쪽이 적절합니다만, 그렇다면 이 예가 읽기 어려워져 버립니다.

 

이 래퍼를 사용하면, 네이티브 메소드의 호출시에 데이터를 수집할 수가 있습니다. 그런데 그 경우, 이 랩이 끝난 메소드를 네이티브 구현에 링크할 때에 문제가 생깁니다. 즉, 메소드 wrapped_foo 는, 다음과 같은 네이티브 구현 foo 에 해결할 필요가 있습니다.

Java_somePackage_someClass_foo(JNIEnv* env, jint x)

 

이 함수를 사용하면(자), 접두사를 지정해, 적절한 해결을 하도록(듯이) 할 수가 있습니다. 구체적으로는, 표준의 해결이 실패하면(자), 접두사를 고려해 해결이 재시행됩니다. 해결에는 2 개의 방법이 있습니다. JNI 함수 RegisterNatives 를 사용한 명시적인 해결과 일반적으로의 자동 해결입니다. RegisterNatives 의 경우, VM 는 다음이 관련짓고를 시도합니다.

method(foo) -> nativeImplementation(foo)

 

이것에 실패하면(자), 지정된 접두사를 메소드명의 선두에 추가해 해결이 재시행되어 다음과 같은 올바른 해결을 얻을 수 있습니다.

method(wrapped_foo) -> nativeImplementation(foo)

 

자동 해결의 경우, VM 는 다음을 시도합니다.

method(wrapped_foo) -> nativeImplementation(wrapped_foo)

 

이것에 실패하면(자), 지정된 접두사를 구현명으로부터 삭제해 해결이 재시행되어 다음의 올바른 해결을 얻을 수 있습니다.

method(wrapped_foo) -> nativeImplementation(foo)

 

접두사가 사용되는 것은 표준의 해결이 실패했을 경우만이므로, 네이티브 메소드의 랩은 선택적으로 실시할 수 있습니다.

 

각 JVM TI 환경은 독립하고 있어, 각각이 독자적인 바이트 코드 변환을 실시할 수 있기 (위해)때문에, 복수의 층의 래퍼가 적용될 가능성이 있습니다. 따라서, 환경 마다 다른 접두사가 필요하게 됩니다. 변환은 차례로 적용되기 (위해)때문에, 접두사를 적용하는 경우, 접두사는 변환과 같은 차례로 적용됩니다. 변환의 적용순서에 대해서는,ClassFileLoadHook 이벤트를 참조해 주세요. 즉, 3 개의 환경이 래퍼를 적용했을 경우,foo$env3_$env2_$env1_foo 와 같이 됩니다. 그러나, 예를 들어 2 번째의 환경이 foo 에 래퍼를 적용하지 않았던 경우는, 단지 $env3_$env1_foo 가 됩니다. 접두사의 순서를 효율적으로 결정할 수 있도록(듯이) 하기 위한(해), 도중의 접두사는, 그 네이티브가 아닌 래퍼가 존재하는 경우에게만 적용됩니다. 즉 이 예에서는,$env1_foo 가 네이티브 메소드가 아니어도,$env1_foo 가 존재하기 위해(때문에),$env1_ 접두사가 적용됩니다.

 

접두사는 해결시에 사용됩니다만, 그 해결은 언제라도 지연 될 가능성이 있습니다. 따라서, 네이티브 메소드의 접두사는, 대응하는 접두사 첨부의 네이티브 메소드가 존재하고 있는 한, 설정된 채로 해 둘 필요가 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 아니오 73 1.1

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_set_native_method_prefix 네이티브 메소드를 해결할 수 없는 경우에 적용해야 할 접두사를 설정할 수 있는 - SetNativeMethodPrefixSetNativeMethodPrefixes

 

파라미터
이름 설명
prefix const char * 적용하는 접두사. 수정 UTF-8 캐릭터 라인으로서 encode 된다.

 

에이전트는,char 의 배열을 건네준다. prefixNULL 의 경우, 이 환경의 기존의 접두사가 삭제된다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_set_native_method_prefix 를 가지지 않는다. AddCapabilities 를 사용한다.

복수의 네이티브 메소드 접두사의 설정

jvmtiError
SetNativeMethodPrefixes(jvmtiEnv* env,
            jint prefix_count,
            char** prefixes)

일반적으로의 에이전트의 경우,SetNativeMethodPrefix 가, 네이티브 메소드의 접두사 설정에 필요하게 되는 모든 기능을 제공합니다. 복수의 독립한 클래스 파일 변환을 실행하는 메타에이젠트 (다른 층의 에이전트의 프록시로서의 에이전트등)의 경우, 이 함수를 사용하면(자), 각 변환에 독자적인 접두사를 할당할 수가 있습니다. 접두사는, 지정된 차례로 적용되어SetNativeMethodPrefix 로 설명한, 복수의 JVM TI 환경으로부터의 접두사의 적용 방법과 같은 방법으로 처리됩니다.

 

이전의 접두사는 모두 치환됩니다. 따라서,prefix_count0 을 지정해 이 함수를 호출하면(자), 이 환경의 접두사 기능이 무효가 됩니다.

 

SetNativeMethodPrefix 곳의 함수가, 접두사를 설정하기 위한 2 개의 방법입니다. 1 개의 접두사를 지정해 SetNativeMethodPrefix 를 호출하는 것은,prefix_count1 을 지정해 이 함수를 호출하는 것과 같습니다. NULL 를 지정해 SetNativeMethodPrefix 를 호출하는 것은,prefix_count0 을 지정해 이 함수를 호출하는 것과 같습니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 아니오 74 1.1

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_set_native_method_prefix 네이티브 메소드를 해결할 수 없는 경우에 적용해야 할 접두사를 설정할 수 있는 - SetNativeMethodPrefixSetNativeMethodPrefixes

 

파라미터
이름 설명
prefix_count jint 적용하는 접두사의 수.
prefixes char** 이 환경에서 적용하는 접두사. 각각 수정 UTF-8 캐릭터 라인으로서 encode 된다.

 

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_set_native_method_prefix 을 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_ILLEGAL_ARGUMENT prefix_count0 보다 작다.
JVMTI_ERROR_NULL_POINTER prefixesNULL.

 


raw 모니터

raw 모니터 함수:

 


raw 모니터의 작성

jvmtiError
CreateRawMonitor(jvmtiEnv* env,
            const char* name,
            jrawMonitorID* monitor_ptr)

raw 모니터를 작성합니다.

 

단계 콜백 안전 위치 도입된 버젼
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 이 함수는,heap 반복 함수의 콜백으로부터 호출할 수 있다. GarbageCollectionStart 이벤트,GarbageCollectionFinish 이벤트, 및 ObjectFree 이벤트의 이벤트 핸들러로부터의 호출도 가능하다. 31 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
name const char* 모니터를 식별하는 이름. 수정 UTF-8 캐릭터 라인으로서 encode 된다.

 

에이전트는,char 의 배열을 건네준다.
monitor_ptr jrawMonitorID * 돌아왔을 때, 작성된 모니터를 포인트 한다.

 

에이전트는 jrawMonitorID 에 포인터를 건네준다. 돌아왔을 때,jrawMonitorID 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER nameNULL.
JVMTI_ERROR_NULL_POINTER monitor_ptrNULL.

raw 모니터의 파기

jvmtiError
DestroyRawMonitor(jvmtiEnv* env,
            jrawMonitorID monitor)

raw 모니터를 파기합니다. 파기되는 모니터가 이 thread에 의해 입력되었을 경우, 파기되기 전에 종료합니다. 파기되는 모니터가 다른 thread에 의해 입력되었을 경우, 에러가 돌려주어져 모니터의 파기는 행해지지 않습니다.

 

단계 콜백 안전 위치 도입된 버젼
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 이 함수는,heap 반복 함수의 콜백으로부터 호출할 수 있다. GarbageCollectionStart 이벤트,GarbageCollectionFinish 이벤트, 및 ObjectFree 이벤트의 이벤트 핸들러로부터의 호출도 가능하다. 32 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
monitor jrawMonitorID 모니터

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NOT_MONITOR_OWNER 모니터의 소유자는 아니다.
JVMTI_ERROR_INVALID_MONITOR monitor 가 jrawMonitorID 는 아니다.

raw 모니터의 개시

jvmtiError
RawMonitorEnter(jvmtiEnv* env,
            jrawMonitorID monitor)

raw 모니터의 배타적 소유권을 가져옵니다. 같은 thread로 여러 차례 모니터를 입력할 수가 있습니다. thread는, 모니터를 입력 회수분만큼종료할 필요가 있습니다. 모니터가 OnLoad (접속된 thread가 생성되기 전)의 단계에서 입력되어 접속된 thread가 생성된 시점에서 종료하고 있지 않는 경우, 입력은 메인 thread로 행해졌다고 인식됩니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 이 함수는,heap 반복 함수의 콜백으로부터 호출할 수 있다. GarbageCollectionStart 이벤트,GarbageCollectionFinish 이벤트, 및 ObjectFree 이벤트의 이벤트 핸들러로부터의 호출도 가능하다. 33 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
monitor jrawMonitorID 모니터

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_MONITOR monitor 가 jrawMonitorID 는 아니다.

raw 모니터의 종료

jvmtiError
RawMonitorExit(jvmtiEnv* env,
            jrawMonitorID monitor)

raw 모니터의 배타적 소유권을 해제합니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 이 함수는,heap 반복 함수의 콜백으로부터 호출할 수 있다. GarbageCollectionStart 이벤트,GarbageCollectionFinish 이벤트, 및 ObjectFree 이벤트의 이벤트 핸들러로부터의 호출도 가능하다. 34 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
monitor jrawMonitorID 모니터

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NOT_MONITOR_OWNER 모니터의 소유자는 아니다.
JVMTI_ERROR_INVALID_MONITOR monitor 가 jrawMonitorID 는 아니다.

raw 모니터의 대기

jvmtiError
RawMonitorWait(jvmtiEnv* env,
            jrawMonitorID monitor,
            jlong millis)

raw 모니터의 통지를 기다립니다.

 

다른 thread가 지정된 raw 모니터의 RawMonitorNotify 또는 RawMonitorNotifyAll 를 호출하는지, 지정된 timeout 가 경과할 때까지, 현재의 thread를 대기시킵니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 이 함수는,heap 반복 함수의 콜백으로부터 호출할 수 있다. GarbageCollectionStart 이벤트,GarbageCollectionFinish 이벤트, 및 ObjectFree 이벤트의 이벤트 핸들러로부터의 호출도 가능하다. 35 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
monitor jrawMonitorID 모니터
millis jlong 타임 아웃 (밀리 세컨드 단위). 타임 아웃이 제로의 경우, 실제의 시간은 고려되지 않고, thread는 단지 통지될 때까지 대기한다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NOT_MONITOR_OWNER 모니터의 소유자는 아니다.
JVMTI_ERROR_INTERRUPT 대기중에 인터럽트가 발생했기 때문에, 재시행의 필요 있어.
JVMTI_ERROR_INVALID_MONITOR monitor 가 jrawMonitorID 는 아니다.

raw 모니터의 통지

jvmtiError
RawMonitorNotify(jvmtiEnv* env,
            jrawMonitorID monitor)

raw 모니터를 대기중의 1 개의 thread에 통지합니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 이 함수는,heap 반복 함수의 콜백으로부터 호출할 수 있다. GarbageCollectionStart 이벤트,GarbageCollectionFinish 이벤트, 및 ObjectFree 이벤트의 이벤트 핸들러로부터의 호출도 가능하다. 36 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
monitor jrawMonitorID 모니터

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NOT_MONITOR_OWNER 모니터의 소유자는 아니다.
JVMTI_ERROR_INVALID_MONITOR monitor 가 jrawMonitorID 는 아니다.

raw 모니터의 통지 (모두)

jvmtiError
RawMonitorNotifyAll(jvmtiEnv* env,
            jrawMonitorID monitor)

raw 모니터를 대기중의 모든 thread에 통지합니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 이 함수는,heap 반복 함수의 콜백으로부터 호출할 수 있다. GarbageCollectionStart 이벤트,GarbageCollectionFinish 이벤트, 및 ObjectFree 이벤트의 이벤트 핸들러로부터의 호출도 가능하다. 37 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
monitor jrawMonitorID 모니터

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NOT_MONITOR_OWNER 모니터의 소유자는 아니다.
JVMTI_ERROR_INVALID_MONITOR monitor 가 jrawMonitorID 는 아니다.

 


JNI 함수의 차단

JNI 함수의 차단 함수:

Java Native Interface (JNI) 함수 테이블의 조작에 의해, JNI 함수 호출의 차단 및 재발송신의 기능을 제공합니다. 「Java Native Interface 스펙」의「JNI 함수」의 설명을 참조해 주세요.

 

다음에, 카운트 참조의 작성순서에 JNI 호출 NewGlobalRef 를 차단하는 예를 나타냅니다.

JNIEnv original_jni_Functions;
JNIEnv redirected_jni_Functions;
int my_global_ref_count = 0;

jobject
MyNewGlobalRef(JNIEnv *jni_env, jobject lobj) {
   ++my_global_ref_count;
   return originalJNIFunctions->NewGlobalRef(env, lobj);
}

void
myInit() {
   jvmtiError err;

   err = (*jvmti_env)->GetJNIFunctionTable(jvmti_env, &original_jni_Functions);
   if (err ! = JVMTI_ERROR_NONE) {
      die();
   }
   err = (*jvmti_env)->GetJNIFunctionTable(jvmti_env, &redirected_jni_Functions);
   if (err ! = JVMTI_ERROR_NONE) {
      die();
   }
   redirectedJNIFunctions->NewGlobalRef = MyNewGlobalRef;
      err = (*jvmti_env)->SetJNIFunctionTable(jvmti_env, redirected_jni_Functions);
   if (err ! = JVMTI_ERROR_NONE) {
      die();
   }
}
      

myInit 를 호출한 뒤, 사용자의 JNI 코드가 실행되어 새로운 글로벌 참조를 작성하는 호출을 하는 일이 있습니다. 이 호출은, 일반적으로의 JNI 구현은 아니고,myNewGlobalRef 에게 건네집니다. 데이터의 수집 후도 일반적으로의 JNI 함수를 호출할 수 있도록(듯이), 원의 함수 테이블의 카피는 보관 유지됩니다. 또, 덧쓰기되지 않는 JNI 함수의 동작은, 일반적으로 대로입니다.

 


JNI 함수 테이블의 설정

jvmtiError
SetJNIFunctionTable(jvmtiEnv* env,
            const jniNativeInterface* function_table)

현재 그리고 장래의 모든 JNI 환경의 JNI 함수 테이블을 설정합니다. 결과적으로, 장래 행해지는 모든 JNI 호출은, 지정의 함수에게 건네집니다. 이 함수에게 건네지는 함수 테이블을 가져오려면 ,GetJNIFunctionTable 를 사용합니다. 이 함수가 유효하게 되기 위해서(때문에)는, JNI 클라이언트로, 갱신된 테이블 엔트리를 사용할 필요가 있습니다. 이 테이블은 const 로서 정의되기 (위해)때문에, 일부의 컴파일러는 이 테이블에의 액세스를 최적화할 가능성이 있습니다. 그 경우, 이 함수는 유효하게 되지 않습니다. 테이블의 카피가 작성됩니다. 테이블의 로컬 카피로 변경을 더해도, 원의 테이블에 영향은 없습니다. 이 함수는, 함수 테이블인 만큼 영향을 미칩니다. 환경의 그 외의 부분에는, 일절 영향을 미치지 않습니다. 상기의 예를 참조해 주세요.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 120 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
function_table const jniNativeInterface * 새로운 JNI 함수 테이블을 포인트 한다.

 

에이전트는 jniNativeInterface 에 포인터를 건네준다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER function_tableNULL.

JNI 함수 테이블의 취득

jvmtiError
GetJNIFunctionTable(jvmtiEnv* env,
            jniNativeInterface** function_table)

JNI 함수 테이블을 가져옵니다. JNI 함수 테이블은, 할당할 수 있었던 메모리에 카피됩니다. SetJNIFunctionTable 가 불려 갔을 경우, 변경된 함수 테이블 (원의 함수 테이블은 아니다)이 돌려주어집니다. 카피되는 것은 함수 테이블 뿐입니다. 환경의 그 외의 부분은 일절 카피되지 않습니다. 상기의 예를 참조해 주세요.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 121 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
function_table jniNativeInterface ** 돌아왔을 때,*function_table 는 새롭게 할당할 수 있었던 JNI 함수 테이블의 카피를 포인트 한다.

 

에이전트는 jniNativeInterface* 에 포인터를 건네준다. 돌아왔을 때,jniNativeInterface* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER function_tableNULL.

 


이벤트 관리

이벤트 관리 함수:

이벤트 관리의 형태:

 


이벤트 콜백의 설정

jvmtiError
SetEventCallbacks(jvmtiEnv* env,
            const jvmtiEventCallbacks* callbacks,
            jint size_of_callbacks)

이벤트 마다 불려 가는 함수를 설정합니다. 대체 함수 테이블을 제공하는 것으로써, 콜백이 지정됩니다. 함수 테이블의 카피가 작성됩니다. 테이블의 로컬 카피로 변경을 더해도, 원의 테이블에 영향은 없습니다. 이것은 불가분인 처리입니다. 모든 콜백이 동시에 설정됩니다. 이 함수가 불려 갈 때까지, 이벤트는 송신되지 않습니다. 엔트리가 NULL 의 경우, 또는 이벤트가 size_of_callbacks 의 사이즈를 넘었을 경우, 이벤트의 송신은 행해지지 않습니다. 이벤트의 자세한 것은, 이 문서로후술 합니다. 이벤트는, 유효해, 송신된 순서에 콜백을 가지고 있을 필요가 있습니다. 이 함수로 SetEventNotificationMode 가 불려 간 차례는, 결과에 영향을 미치지 않습니다.

 

단계 콜백 안전 위치 도입된 버젼
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 122 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
callbacks const jvmtiEventCallbacks * 새로운 이벤트 콜백.

 

에이전트는 jvmtiEventCallbacks 에 포인터를 건네준다. callbacksNULL 의 경우, 기존의 호출은 삭제된다.
size_of_callbacks jint sizeof(jvmtiEventCallbacks)-- 버젼간의 호환성을 실현.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_ILLEGAL_ARGUMENT size_of_callbacks0 보다 작다.

이벤트 통지 모드의 설정

typedef enum {
    JVMTI_ENABLE = 1,
    JVMTI_DISABLE = 0
} jvmtiEventMode;
jvmtiError
SetEventNotificationMode(jvmtiEnv* env,
            jvmtiEventMode mode,
            jvmtiEvent event_type,
            jthread event_thread,
             ...)

이벤트의 생성을 제어합니다.

이벤트의 유효화와 무효화 (jvmtiEventMode)
정수 설명
JVMTI_ENABLE 1 modeJVMTI_ENABLE 의 경우, 이벤트 event_type 가 유효화 된다
JVMTI_DISABLE 0 modeJVMTI_DISABLE 의 경우, 이벤트 event_type 가 무효화된다

threadNULL 의 경우는, 이 이벤트는 글로벌하게 유효 또는 무효로 됩니다. 그렇지 않은 경우는, 특정의 thread에 대해 유효 또는 무효로 됩니다. 특정의 thread에 대해 이벤트가 생성되는 것은, 이벤트가 thread 레벨 또는 글로벌 레벨의 어느 쪽인지로 유효하게 되고 있는 경우입니다.

 

개개의 이벤트에 대한 정보는,후술 하는 설명을 참조해 주세요.

 

다음의 이벤트는, 이 함수를 사용해 thread 레벨에서는 제어할 수 없습니다.

 

처음은, thread 레벨로 유효하게 되고 있는 이벤트도, 글로벌 레벨로 유효하게 되고 있는 이벤트도 없습니다.

 

이 함수를 호출하기 전에, 필요한 권한 (후술의 「이벤트를 유효화하는 권한」을 참조)을 소유하고 있을 필요가 있습니다.

 

이벤트의 상세한 것에 대하여는,후술 합니다.

 

단계 콜백 안전 위치 도입된 버젼
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 2 1.0

 

권한
필요한 기능
이벤트를 유효화하는 권한
권한 이벤트
can_generate_field_modification_events FieldModification
can_generate_field_access_events FieldAccess
can_generate_single_step_events SingleStep
can_generate_exception_events Exception
ExceptionCatch
can_generate_frame_pop_events FramePop
can_generate_breakpoint_events Breakpoint
can_generate_method_entry_events MethodEntry
can_generate_method_exit_events MethodExit
can_generate_compiled_method_load_events CompiledMethodLoad
CompiledMethodUnload
can_generate_monitor_events MonitorContendedEnter
MonitorContendedEntered
MonitorWait
MonitorWaited
can_generate_vm_object_alloc_events VMObjectAlloc
can_generate_native_method_bind_events NativeMethodBind
can_generate_garbage_collection_events GarbageCollectionStart
GarbageCollectionFinish
can_generate_object_free_events ObjectFree

 

파라미터
이름 설명
mode jvmtiEventMode JVMTI_ENABLE 또는 JVMTI_DISABLE
event_type jvmtiEvent 제어하는 이벤트
event_thread jthread 제어하는 thread

 

event_threadNULL 의 경우, 이벤트는 글로벌 레벨로 제어된다.
... ... 장래의 확장용

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_INVALID_THREAD event_threadNULL 이외로, 유효한 thread가 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE event_threadNULL 이외로, 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_ILLEGAL_ARGUMENT thread 레벨의 제어가 허가되어 있지 않은 이벤트로, thread 레벨의 제어가 시행되었다.
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 필요한 이벤트를 유효화하는 권한을 가지고 있지 않다.
JVMTI_ERROR_ILLEGAL_ARGUMENT mode 가 jvmtiEventMode 는 아니다.
JVMTI_ERROR_INVALID_EVENT_TYPE event_type 가 jvmtiEvent 는 아니다.

이벤트의 생성

jvmtiError
GenerateEvents(jvmtiEnv* env,
            jvmtiEvent event_type)

현재의 VM 의 상태를 나타내는 이벤트를 생성합니다. 예를 들어,event_typeJVMTI_EVENT_COMPILED_METHOD_LOAD 의 경우, 최근 컴파일 된 각 메소드에 CompiledMethodLoad 이벤트가 송신됩니다. 로드 되고 나서, 아직 언로드되어 있지 않은 메소드는 송신되지 않습니다. 이전에 송신된 이벤트의 이력은, 이 함수에 의해 송신되는 이벤트에 영향을 미치지 않습니다. 예를 들어, 이 함수가 불려 갈 때마다, 최근 컴파일 된 모든 메소드가 송신됩니다.

 

에이전트가 프로그램의 실행 개시 후에 접속된 것에 의해, 이벤트가 없어졌을 경우는, 이 함수를 사용해 없어진 이벤트를 생성할 수 있습니다.

 

Java 프로그램 언어 코드 또는 JNI 함수의 실행은, 이 함수가 종료할 때까지 일시정지할 수가 있습니다. 그 때문에, 어느쪽이나 이벤트를 송신하는 thread로부터 불려 가지 않게 할 필요가 있습니다. 이 함수는, 없어진 이벤트가 송신되어 처리되어 종료할 때까지 종료하지 않습니다. 이벤트가, 발생원의 thread와는 다른 thread에 송신되는 일이 있습니다. 이벤트를 발생시키기 위해서(때문에)는,SetEventCallbacks 로 이벤트의 콜백을 설정해,SetEventNotificationMode 로 이벤트를 유효하게 할 필요가 있습니다. 요구된 이벤트의 일부 또는 모든 것을 생성하기 위해서 필요한 정보가 VM 로부터 없어졌을 경우, 이벤트는 송신되지 않고, 에러도 돌려주어지지 않습니다.

 

지원되는 이벤트는 다음과 같습니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 123 1.0

 

권한
필요한 기능
임의의 기능
권한 효과
can_generate_compiled_method_load_events 메소드의 컴파일시 또는 언로드시에 이벤트를 생성할 수 있다

 

파라미터
이름 설명
event_type jvmtiEvent 생성하는 이벤트의 형태. 다음의 어느쪽이든으로 한다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY event_typeJVMTI_EVENT_COMPILED_METHOD_LOAD 로,can_generate_compiled_method_load_eventsfalse.
JVMTI_ERROR_ILLEGAL_ARGUMENT event_typeJVMTI_EVENT_COMPILED_METHOD_LOADJVMTI_EVENT_DYNAMIC_CODE_GENERATED 도 아니다.
JVMTI_ERROR_INVALID_EVENT_TYPE event_type 가 jvmtiEvent 는 아니다.

 


확장 기능 기구

확장 기능 기구 함수:

확장 기능 기구의 함수형:

확장 기능 기구의 형태:

JVM TI 구현은, 이러한 함수를 사용해, 이 스펙에 정의되어 있지 않은 함수 및 이벤트를 제공합니다.

 

확장 함수와 확장 이벤트의 파라미터는, 각각 다음의 겉(표)에 나타내는 「형태」와「종류」를 가집니다.

확장 함수/이벤트 파라미터의 형태 (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 TI 형 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 로 해제.
JVMTI_KIND_ALLOC_ALLOC_BUF 95 할당하고가 끝난 배열 인수의 할당이 끝난 출력 배열 - foo***. Deallocate 로 해제.
JVMTI_KIND_OUT 96 출력 인수 - foo*.
JVMTI_KIND_OUT_BUF 97 출력 배열 인수 (에이전트에 의해 사전에 할당하고가 끝난) - foo*. Deallocate 는 불가.

확장 함수/이벤트 파라미터 정보

typedef struct {
    char* name;
    jvmtiParamKind kind;
    jvmtiParamTypes base_type;
    jboolean null_ok;
} jvmtiParamInfo;
jvmtiParamInfo - 확장 함수/이벤트 파라미터 정보
필드 설명
name char * 파라미터명. 수정 UTF-8 캐릭터 라인으로 encode 된다.
kind jvmtiParamKind 파라미터의 종류 - 형 수식자
base_type jvmtiParamTypes 파라미터의 기저형 - kind 에 의해 변경이 끝난 상태.
null_ok jboolean NULL 인수를 허가할까. 포인터형과 객체형에만 적용.

 


확장 함수

typedef jvmtiError (JNICALL *jvmtiExtensionFunction)
    (jvmtiEnv* jvmti_env,
      ...);
구현 고유의 확장 함수입니다.

 

 

파라미터
이름 설명
jvmti_env jvmtiEnv * JVM TI 환경은, 확장 함수의 유일한 고정 파라미터.
... ... 확장 함수 고유의 파라미터.

확장 함수의 취득

typedef struct {
    jvmtiExtensionFunction func;
    char* id;
    char* short_description;
    jint param_count;
    jvmtiParamInfo* params;
    jint error_count;
    jvmtiError* errors;
} jvmtiExtensionFunctionInfo;
jvmtiError
GetExtensionFunctions(jvmtiEnv* env,
            jint* extension_count_ptr,
            jvmtiExtensionFunctionInfo** extensions)

확장 함수세트를 돌려줍니다.

 

단계 콜백 안전 위치 도입된 버젼
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 124 1.0

 

권한
필요한 기능

 

jvmtiExtensionFunctionInfo - 확장 함수 정보
필드 설명
func jvmtiExtensionFunction 불려 가는 실제의 함수
id char * 확장 함수의 식별자. 수정 UTF-8 캐릭터 라인으로 encode 된다. 패키지의 명명 규칙에 따른다. 예를 들어,com.sun.hotspot.bar
short_description char * 함수를 1 문으로 설명. 수정 UTF-8 캐릭터 라인으로 encode 된다.
param_count jint jvmtiEnv *jvmti_env 를 제외하는 파라미터수
params jvmtiParamInfo * param_count 파라미터의 배열 (jvmtiEnv *jvmti_env 를 제외한다)
error_count jint 에러 반환값의 수 (범용 에러를 제외하다)
errors jvmtiError * error_count 의 에러의 배열

 

파라미터
이름 설명
extension_count_ptr jint * 돌아왔을 때, 확장 함수의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
extensions jvmtiExtensionFunctionInfo ** 확장 함수 정보의 배열을, 함수 마다 1 개(살)씩 돌려준다.

 

에이전트는 jvmtiExtensionFunctionInfo* 에 포인터를 건네준다. 돌아왔을 때,jvmtiExtensionFunctionInfo* 는, 사이즈 *extension_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiExtensionFunctionInfoid 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiExtensionFunctionInfoshort_description 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiExtensionFunctionInfoparams 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiParamInfoname 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiExtensionFunctionInfoerrors 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER extension_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER extensionsNULL.

확장 이벤트의 취득

typedef struct {
    jint extension_event_index;
    char* id;
    char* short_description;
    jint param_count;
    jvmtiParamInfo* params;
} jvmtiExtensionEventInfo;
jvmtiError
GetExtensionEvents(jvmtiEnv* env,
            jint* extension_count_ptr,
            jvmtiExtensionEventInfo** extensions)

확장 이벤트세트를 돌려줍니다.

 

단계 콜백 안전 위치 도입된 버젼
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 125 1.0

 

권한
필요한 기능

 

jvmtiExtensionEventInfo - 확장 이벤트 정보
필드 설명
extension_event_index jint 이벤트를 식별하는 인덱스
id char * 확장 이벤트의 식별자. 수정 UTF-8 캐릭터 라인으로서 encode 된다. 패키지의 명명 규칙에 따른다. 예를 들어,com.sun.hotspot.bar
short_description char * 이벤트를 1 문으로 설명. 수정 UTF-8 캐릭터 라인으로서 encode 된다.
param_count jint jvmtiEnv *jvmti_env 를 제외하는 파라미터수
params jvmtiParamInfo * param_count 파라미터의 배열 (jvmtiEnv *jvmti_env 를 제외한다)

 

파라미터
이름 설명
extension_count_ptr jint * 돌아왔을 때, 확장 이벤트의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
extensions jvmtiExtensionEventInfo ** 확장 이벤트 정보의 배열을, 이벤트 마다 1 개(살)씩 돌려준다.

 

에이전트는 jvmtiExtensionEventInfo* 에 포인터를 건네준다. 돌아왔을 때,jvmtiExtensionEventInfo* 는, 사이즈 *extension_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiExtensionEventInfoid 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiExtensionEventInfoshort_description 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiExtensionEventInfoparams 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiParamInfoname 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER extension_count_ptrNULL.
JVMTI_ERROR_NULL_POINTER extensionsNULL.

확장 이벤트

typedef void (JNICALL *jvmtiExtensionEvent)
    (jvmtiEnv* jvmti_env,
      ...);
구현 고유의 이벤트입니다. 이벤트 핸들러의 설정에는,SetExtensionEventCallback 를 사용합니다.

 

확장 이벤트의 이벤트 핸들러는, 이 정의에 일치하는 것 같은 선언형의 가변 인수가 아니면 안됩니다. 선언형의 가변 인수가 아닌 경우, 일부의 플랫폼에서, 일치하지 않는 규약의 호출이나 미정도리의 동작이 발생할 가능성이 있습니다.

 

예를 들어,GetExtensionEvents 로부터 반환된 jvmtiParamInfo 에,jint 파라미터의 존재가 나타나고 있는 경우, 이벤트 핸들러를 다음과 같이 선언할 필요가 있습니다.
    void JNICALL myHandler(jvmtiEnv* jvmti_env, jint myInt, ...)
...」(은)는 가변 인수를 나타냅니다.

 

 

파라미터
이름 설명
jvmti_env jvmtiEnv * JVM TI 환경은, 확장 이벤트의 유일한 고정 파라미터.
... ... 확장 이벤트 고유의 파라미터

확장 이벤트 콜백의 설정

jvmtiError
SetExtensionEventCallback(jvmtiEnv* env,
            jint extension_event_index,
            jvmtiExtensionEvent callback)

확장 이벤트에 콜백 함수를 설정해, 이벤트를 유효하게 합니다. 콜백이 NULL 의 경우, 이벤트를 무효로 합니다. 표준 이벤트와는 달라, 콜백을 설정해 이벤트를 유효하게 하는 처리는 단일의 조작입니다.

 

단계 콜백 안전 위치 도입된 버젼
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 126 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
extension_event_index jint 설정하는 콜백을 식별한다. 이 인덱스는,jvmtiExtensionEventInfoextension_event_index 필드.
callback jvmtiExtensionEvent callbackNULL 이외의 경우,callback 를 이벤트 콜백 함수로 설정해, 이벤트를 유효하게 한다.

 

callbackNULL 의 경우, 이벤트를 무효로 한다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_ILLEGAL_ARGUMENT extension_event_indexGetExtensionEvents 로부터 반환된 extension_event_index 이 아니다.

 


권한

권한 함수:

권한의 형태:

권한 함수에서는, JVM TI 를 사용할 수 있는 기능 (어느 JVM TI 함수를 호출할 수 있는지, 어떤 이벤트를 생성할 수 있는지, 이러한 이벤트나 함수가 어떤 기능을 제공할 수 있을까 등)을 변경할 수 있습니다.

 

각 함수 및 이벤트의 「권한」의 섹션에는, 관련지을 수 있고 있는 권한의 설명이 기재되어 있습니다 (존재하는 경우). 「필요한 기능」은, 사용 가능하고, 권한을 추가하지 않아도 사용할 수 있는 것을 나타내고 있습니다. 「임의의 기능」은, 사용하기 위해서는 에이전트에 권한이 필요한 것을 나타내고 있습니다. 권한을 가지기 위해서(때문에)는, 에이전트는권한을 추가할 필요가 있습니다. 「임의의 기능」에는, 기능 세트를 확장하는 권한의 설명이 기재되어 있습니다.

 

각 JVM TI 구현을 잠재적으로 사용할 수 있는 권한은 다릅니다. 구현에 의해, 다음과 같은 일을 말할 수 있습니다.

  • 결코 추가해서는 안 되는 권한이 있다
  • 모든 환경에서, 어느 권한을 OnLoad 또는 라이브 단계에서 추가할 수 있다
  • 어느 권한을 OnLoad 단계에서 밖에 추가할 수 없다
  • 어느 권한을 복수의 환경에서 동시에 소유할 수 없다
  • 어느 권한을 복수의 환경에서 동시에 소유할 수 없다. 또,OnLoad 단계에서 밖에 소유할 수 없다
  • 그 외

자주, 권한을 추가하는 것에 의해, 실행 속도, 기동 시간, 메모리 사용량(footprint) 등에 영향이 나오는 일이 있습니다. 권한을 사용하는 오버헤드는, 권한을 소유하는 오버헤드와는 완전히 다른 점에 주의해 주세요. 예로서 스텝 실행에 대해 생각해 봅시다. 스텝 실행이 유효한 경우는 (이벤트가 유효해, 액티브하게 이벤트를 송신하고 있는 상태), 어느 구현에서도, 각 명령으로 이벤트를 송신해, 처리하는 오버헤드가 커집니다. 한편, 권한을 소유하는 오버헤드는, 구현에 의해 크기도 하고 작거나 합니다. 또, 권한을 잠재적으로 사용할 수 있을지 어떨지도, 구현에 따라서 다릅니다. 사용예를 다음에 나타냅니다.

  • 어느 VM 는, 바이트 코드를 native code에 컴파일 하는 것에 의해 모든 것을 실행해, 스텝 실행 명령을 생성할 수 없게 되고 있다. 이 구현에서는, 권한은 추가할 수 없다.
  • 다른 VM 는, 실행을 스텝 실행 interpreter에 언제라도 교체된다. 이 구현에서는, 권한을 소유하는 것으로 오버헤드는 생기지 않고, 권한은 언제라도 추가할 수 있다.
  • 한층 더 다른 VM 는, 바이트 코드의 컴파일 또는 스텝 실행 가능한 해석이 끝난 실행 엔진을 기동시에 선택할 수 있지만, 이것들을 바꿀 수 없다. 이 구현에서는,OnLoad 단계 (바이트 코드의 실행을 개시하기 전)에서 권한을 추가할 필요가 있다. 스텝 실행을 사용했던 적이 없는 경우에서도, 실행 속도에는 상당한 영향이 있다.
  • 한층 더 다른 VM 는, 컴파일이 끝난 바이트 코드 또는 생성이 끝난 interpreter에 [is single stepping on] 체크를 추가할 수 있다. 이 구현에서도,OnLoad 단계에서 권한을 추가할 필요가 있지만, 오버헤드 ( 각 명령의 테스트와 브랜치(branch))는 꽤 낮아진다.

 

JVM TI 환경 마다, 고유의 권한 세트가 있습니다. 최초, 이 세트는 빈 상태(empty)입니다. 필요한 권한이 있으면, 추가합니다. 가능하면, 권한은 OnLoad 단계에서 추가합니다. 대부분의 가상 머신에서는, 특정의 권한에는, 가상 머신용의 특별한 설정이 필요합니다. 이 설정은, 가상 머신의 실행을 개시하기 전에,OnLoad 단계에서 실시할 필요가 있습니다. 추가한 권한을 삭제할 수 있는 것은, 환경에 의해 명시적으로 방폐되었을 경우만입니다.

 

에이전트는,이 VM 를 잠재적으로 제공할 수 있는 권한을 특정해,사용하는 권한을 추가해,불필요하게 된 권한을 해제해,현재 사용 가능한 권한을 조사할 수가 있습니다.

권한의 예

예를 들어,OnLoad 함수로 신규에 기동한 에이전트로, 사용 가능한 모든 권한을 유효하게 하는 경우가 있습니다. 사용하고 있지 않는 기능에 의해 에이전트의 퍼포먼스가 저감 할 가능성이 있기 (위해)때문에, 일반적으로 이 설정은 추천하지 않습니다. 다음에, C 로 기술한 코드예를 나타냅니다.

        jvmtiCapabilities capa;
        jvmtiError err;

        err = (*jvmti)->GetPotentialCapabilities(jvmti, &capa);
        if (err == JVMTI_ERROR_NONE) {
           err = (*jvmti)->AddCapabilities(jvmti, &capa);
      

예를 들어, 에이전트로, 메소드의 바이트 코드를 취득할 수 있을지 어떨지 체크하는 경우 (이전에 이 권한을 추가해, 아직 방폐하고 있지 않는지 어떤지를 체크하는 경우), C 로 기술한 코드는 다음과 같이 됩니다.

        jvmtiCapabilities capa;
        jvmtiError err;

        err = (*jvmti)->GetCapabilities(jvmti, &capa);
        if (err == JVMTI_ERROR_NONE) {
           if (capa.can_get_bytecodes) { ... } }
      

권한의 구조체

이 카테고리에 포함되는 함수는, 다음의 권한 구조체를 사용합니다. 이 구조체에는, 각 권한으로 대응하는 불형 플래그가 포함되어 있습니다.

 

typedef struct {
    unsigned int can_tag_objects : 1;
    unsigned int can_generate_field_modification_events : 1;
    unsigned int can_generate_field_access_events : 1;
    unsigned int can_get_bytecodes : 1;
    unsigned int can_get_synthetic_attribute : 1;
    unsigned int can_get_owned_monitor_info : 1;
    unsigned int can_get_current_contended_monitor : 1;
    unsigned int can_get_monitor_info : 1;
    unsigned int can_pop_frame : 1;
    unsigned int can_redefine_classes : 1;
    unsigned int can_signal_thread : 1;
    unsigned int can_get_source_file_name : 1;
    unsigned int can_get_line_numbers : 1;
    unsigned int can_get_source_debug_extension : 1;
    unsigned int can_access_local_variables : 1;
    unsigned int can_maintain_original_method_order : 1;
    unsigned int can_generate_single_step_events : 1;
    unsigned int can_generate_exception_events : 1;
    unsigned int can_generate_frame_pop_events : 1;
    unsigned int can_generate_breakpoint_events : 1;
    unsigned int can_suspend : 1;
    unsigned int can_redefine_any_class : 1;
    unsigned int can_get_current_thread_cpu_time : 1;
    unsigned int can_get_thread_cpu_time : 1;
    unsigned int can_generate_method_entry_events : 1;
    unsigned int can_generate_method_exit_events : 1;
    unsigned int can_generate_all_class_hook_events : 1;
    unsigned int can_generate_compiled_method_load_events : 1;
    unsigned int can_generate_monitor_events : 1;
    unsigned int can_generate_vm_object_alloc_events : 1;
    unsigned int can_generate_native_method_bind_events : 1;
    unsigned int can_generate_garbage_collection_events : 1;
    unsigned int can_generate_object_free_events : 1;
    unsigned int can_force_early_return : 1;
    unsigned int can_get_owned_monitor_stack_depth_info : 1;
    unsigned int can_get_constant_pool : 1;
    unsigned int can_set_native_method_prefix : 1;
    unsigned int can_retransform_classes : 1;
    unsigned int can_retransform_any_class : 1;
    unsigned int can_generate_resource_exhaustion_heap_events : 1;
    unsigned int can_generate_resource_exhaustion_threads_events : 1;
    unsigned int : 7;
    unsigned int : 16;
    unsigned int : 16;
    unsigned int : 16;
    unsigned int : 16;
    unsigned int : 16;
} jvmtiCapabilities;
jvmtiCapabilities - 권한의 구조체
모든 형태는 unsigned int : 1
필드 설명 도입된 버젼
can_tag_objects heap의 카테고리에 설명되고 있도록(듯이), 태그를 설정해, 취득할 수 있다. 1.0
can_generate_field_modification_events 필드의 변경에 감시 포인트를 설정할 수 있는 - SetFieldModificationWatch 1.0
can_generate_field_access_events 필드 액세스에 감시 포인트를 설정할 수 있는 - SetFieldAccessWatch 1.0
can_get_bytecodes 메소드 GetBytecodes 의 바이트 코드를 취득할 수 있다. 1.0
can_get_synthetic_attribute 합성 필드 또는 합성 메소드일지 어떨지를 테스트할 수 있는 - IsFieldSyntheticIsMethodSynthetic 1.0
can_get_owned_monitor_info 모니터의 소유에 관한 정보를 취득할 수 있는 - GetOwnedMonitorInfo 1.0
can_get_current_contended_monitor GetCurrentContendedMonitor 를 실행할 수 있다. 1.0
can_get_monitor_info GetObjectMonitorUsage 를 실행할 수 있다. 1.0
can_pop_frame 스택으로부터 프레임을 팝 할 수 있는 - PopFrame 1.0
can_redefine_classes RedefineClasses 로 클래스를 재정의할 수 있다. 1.0
can_signal_thread thread에 정지 또는 끼어들어 신호를 송신할 수 있다. 1.0
can_get_source_file_name 클래스의 원시 파일의 이름을 취득할 수 있다. 1.0
can_get_line_numbers 메소드의 행 번호 테이블을 취득할 수 있다. 1.0
can_get_source_debug_extension 클래스의 소스 디버그 확장 기능을 취득할 수 있다. 1.0
can_access_local_variables 국소 변수를 설정해, 취득할 수 있다. 1.0
can_maintain_original_method_order 클래스 파일내에 출현하는 순서로 메소드를 돌려줄 수가 있다. 1.0
can_generate_single_step_events 스텝 실행 이벤트를 취득할 수 있다. 1.0
can_generate_exception_events throw 된 예외예외 캐치 이벤트를 취득할 수 있다. 1.0
can_generate_frame_pop_events FramePop 이벤트를설정해, 취득할 수가 있다. 1.0
can_generate_breakpoint_events Breakpoint 이벤트를설정해, 취득할 수가 있다. 1.0
can_suspend thread를 중단해, 재개할 수 있다. 1.0
can_redefine_any_class 프리미티브(primitive) 클래스에서도 배열 클래스도 아닌 임의의 클래스를 변경 (재변환 또는 재정의)할 수 있다. IsModifiableClass 를 참조. 1.0
can_get_current_thread_cpu_time 현재의 thread CPU 시간을취득할 수 있다. 1.0
can_get_thread_cpu_time thread CPU 시간을취득할 수 있다. 1.0
can_generate
_method_entry_events
메소드의 입력시에 메소드 입력 이벤트를 생성할 수 있다. 1.0
can_generate
_method_exit_events
메소드의 종료시에 메소드 종료 이벤트를 생성할 수 있다. 1.0
can_generate
_all_class_hook_events
로드 된 모든 클래스에 대해서, ClassFileLoadHook 이벤트를 생성할 수 있다. 1.0
can_generate
_compiled_method_load_events
메소드의 컴파일시 또는 언로드시에 이벤트를 생성할 수 있다. 1.0
can_generate
_monitor_events
모니터의 사용율에 관한 이벤트를 생성할 수 있다. 1.0
can_generate
_vm_object_alloc_events
객체의 VM 할당해에 관한 이벤트를 생성할 수 있다. 1.0
can_generate
_native_method_bind_events
네이티브 메소드가 구현에 바인드 되고 있을 때 이벤트를 생성할 수 있다. 1.0
can_generate
_garbage_collection_events
가베지 컬렉션의 개시 또는 종료시에 이벤트를 생성할 수 있다. 1.0
can_generate
_object_free_events
가비지 컬렉터가 객체를 해제할 경우에 이벤트를 생성할 수 있다. 1.0
can_force_early_return 조기 복귀의 강제의 카테고리로 설명하고 있도록(듯이), 메소드로부터 조기 복귀할 수 있다. 1.1
can_get_owned_monitor_stack_depth_info 소유되고 있는 모니터에 관한 정보와 스택의 깊이를 취득할 수 있는 - GetOwnedMonitorStackDepthInfo 1.1
can_get_constant_pool 있는 클래스의 정수 풀을 취득할 수 있는 - GetConstantPool 1.1
can_set_native_method_prefix 네이티브 메소드를 해결할 수 없는 경우에 적용해야 할 접두사를 설정할 수 있는 - SetNativeMethodPrefixSetNativeMethodPrefixes 1.1
can_retransform_classes RetransformClasses 으로 클래스를 재변환할 수 있다. 특정의 구현에 의한 이 권한의 제한 (「권한」섹션을 참조)에 가세해 이 권한은, 이 환경에서 ClassFileLoadHook 이벤트가 처음 유효화 되기 전으로 설정해야 한다. ClassFileLoadHook 가 처음 유효화 된 시점에서 이 권한을 소유하고 있는 환경을 「재변환 가능」이라고 부른다. ClassFileLoadHook 가 처음 유효화 된 시점에서 이 권한을 소유하고 있지 않는 환경은 「재변환 불가능」이라고 부른다. 1.1
can_retransform_any_class RetransformClasses 를 임의의 클래스에서 호출할 수 있다 (can_retransform_classes 도 설정할 필요가 있다). 1.1
can_generate_resource_exhaustion_heap_events VM 가 JavaTM 플랫폼 heap로부터 메모리의 할당을 실시할 수 없는 경우에, 이벤트를 생성할 수 있다. ResourceExhausted 를 참조. 1.1
can_generate_resource_exhaustion_threads_events VM 가 thread를 작성할 수 없는 경우에 이벤트를 생성할 수 있다. ResourceExhausted 를 참조. 1.1

 


잠재적인 권한의 취득

jvmtiError
GetPotentialCapabilities(jvmtiEnv* env,
            jvmtiCapabilities* capabilities_ptr)

capabilities_ptr 를 개입시켜, 현시점에서 이 환경을 소유할 수 있는 JVM TI 기능을 돌려줍니다. 반환되는 기능이, VM 가 구현하는 완전한 권한 세트와는 다른 경우가 있습니다. 해당하는 것은, 다른 환경이, 복수의 환경에 의한 소유를 허가되어 있지 않은 권한을 소유하고 있는 경우, 그리고 현재의단계가 라이브 단계에서, 특정의 권한은 OnLoad 단계에서 밖에 추가할 수 없는 경우입니다. 이러한 권한의 일부 또는 모든 것을 설정하려면 ,AddCapabilities 함수를 사용할 수 있습니다. 현재 소유되고 있는 권한이 포함됩니다.

 

일반적으로, 이 함수는,OnLoad 함수로 사용됩니다. 일부의 가상 머신에서는, 라이브 단계에서 추가할 수 있는 권한세트가 제한되고 있습니다. 이 경우, 잠재적으로 사용 가능한 권한세트가,OnLoad 단계세트와는 다릅니다.

 

「권한의 예」를 참조해 주세요.

 

단계 콜백 안전 위치 도입된 버젼
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 140 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
capabilities_ptr jvmtiCapabilities * 돌아왔을 때, 추가 가능한 JVM TI 의 기능을 포인트 한다.

 

에이전트는 jvmtiCapabilities 에 포인터를 건네준다. 돌아왔을 때,jvmtiCapabilities 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER capabilities_ptrNULL.

권한의 추가

jvmtiError
AddCapabilities(jvmtiEnv* env,
            const jvmtiCapabilities* capabilities_ptr)

*capabilities_ptr 내에서 값이 1 으로 설정되어 있는 권한을 추가하는 것으로, 새로운 권한을 설정합니다. 이전의 권한은 모두 보관 유지됩니다. 일반적으로, 이 함수는,OnLoad 함수로 사용됩니다. 일부의 가상 머신에서는, 라이브 단계에서 추가할 수 있는 권한세트가 제한되고 있습니다.

 

「권한의 예」를 참조해 주세요.

 

단계 콜백 안전 위치 도입된 버젼
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 142 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
capabilities_ptr const jvmtiCapabilities * 추가하는 JVM TI 권한을 포인트 한다.

 

에이전트는 jvmtiCapabilities 에 포인터를 건네준다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NOT_AVAILABLE 필요한 권한이 잠재적으로 사용 가능한 권한이 아니다.
JVMTI_ERROR_NULL_POINTER capabilities_ptrNULL.

권한의 방폐

jvmtiError
RelinquishCapabilities(jvmtiEnv* env,
            const jvmtiCapabilities* capabilities_ptr)

*capabilities_ptr 내에서 값이 1 으로 설정되어 있는 권한을 방폐합니다. 구현에 따라서는, 단일의 환경 밖에 권한의 소유가 허가되지 않는 경우가 있습니다 (「권한의 개요」를 참조). 이 함수는, 그 외의 에이전트를 사용할 수 있도록(듯이), 권한을 해제합니다. 그 외의 모든 권한은 보관 유지됩니다. 권한은,GetCapabilities 로부터는 없어집니다. 에이전트가 소유하고 있지 않는 권한을 방폐하려고 해도, 에러는 발생하지 않습니다.

 

단계 콜백 안전 위치 도입된 버젼
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 143 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
capabilities_ptr const jvmtiCapabilities * 방폐하는 JVM TI 권한을 포인트 한다.

 

에이전트는 jvmtiCapabilities 에 포인터를 건네준다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER capabilities_ptrNULL.

기능의 취득

jvmtiError
GetCapabilities(jvmtiEnv* env,
            jvmtiCapabilities* capabilities_ptr)

capabilities_ptr 를 개입시켜, 이 환경이 현재 소유하고 있는 임의의 JVM TI 기능을 돌려줍니다. 소유하고 있는 각 권한은,권한 구조체의 대응하는 필드의 1 에 의해 나타납니다. 환경은,AddCapabilities 를 사용해 추가에 성공할 때까지, 권한을 소유하지 않습니다. 환경은,RelinquishCapabilities 를 사용해 방폐하지 않는 한, 권한을 잃지 않습니다. 따라서, 이 함수는,AddCapabilities 호출과 RelinquishCapabilities 호출의 최종 결과를 돌려줍니다.

 

「권한의 예」를 참조해 주세요.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 아니오 89 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
capabilities_ptr jvmtiCapabilities * 돌아왔을 때, JVM TI 의 기능을 포인트 한다.

 

에이전트는 jvmtiCapabilities 에 포인터를 건네준다. 돌아왔을 때,jvmtiCapabilities 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER capabilities_ptrNULL.

 


타이머

타이머 함수:

타이머의 형태:

이러한 함수는, 타이밍 정보를 제공합니다. 시간이 갱신되는 정밀도는 지정되고 있지 않습니다. 나노초단위의 정밀도가 제공됩니다만, 반드시 나노초단위의 정밀도를 얻을 수 있다고는 할 수 없습니다. 최대치 등, 타이머의 상세 정보에는, 타이머 정보 함수를 사용해 액세스 할 수 있습니다.

타이머 정보

각 타이머의 정보 함수는, 이 데이터 구조체를 돌려줍니다.

 

typedef struct {
    jlong max_value;
    jboolean may_skip_forward;
    jboolean may_skip_backward;
    jvmtiTimerKind kind;
    jlong reserved1;
    jlong reserved2;
} jvmtiTimerInfo;
jvmtiTimerInfo - 타이머 정보
필드 설명
max_value jlong 타이머를 도달할 수 있는 최대치. 이 값에 도달하면(자), 타이머의 값은 제로에 돌아온다. 이것은 부호 없음의 값이다. jlong (부호 첨0 보다 작은 값)로서 테스트 또는 출력했을 경우, 부의 수치로서 표시되는 경우가 있다.
may_skip_forward jboolean true 의 경우, 타이머는 외부에서 조정되어 결과적으로 전에 스킵 한다. false 의 경우, 타이머의 값이 실제의 시간보다 빠르게 증가할 것은 없다.
may_skip_backward jboolean true 의 경우, 타이머는 외부에서 조정되어 결과적으로 뒤에 스킵 한다. false 의 경우, 타이머의 값은 일정해 증가한다.
kind jvmtiTimerKind 타이머의 종류. 사용자 타임과 시스템 타임을 구별하지 않는 플랫폼에서는,JVMTI_TIMER_TOTAL_CPU 가 반환된다.
reserved1 jlong 장래의 사용을 위해서(때문에) 예약이 끝난 상태.
reserved2 jlong 장래의 사용을 위해서(때문에) 예약이 끝난 상태.

타이머의 종류는 다음과 같습니다.

타이머의 종류 (jvmtiTimerKind)
정수 설명
JVMTI_TIMER_USER_CPU 30 thread가 사용자 모드인 CPU 시간.
JVMTI_TIMER_TOTAL_CPU 31 thread가 사용자 모드 또는 시스템 모드인 CPU 시간.
JVMTI_TIMER_ELAPSED 32 경과시간.

 


현재의 thread의 CPU 타이머 정보를 취득

jvmtiError
GetCurrentThreadCpuTimerInfo(jvmtiEnv* env,
            jvmtiTimerInfo* info_ptr)

GetCurrentThreadCpuTime 타이머의 정보를 가져옵니다. jvmtiTimerInfo 구조체의 필드에, 타이머의 상세가 들어갑니다. 이 정보는, 플랫폼과 GetCurrentThreadCpuTime 의 구현에 고유해서, thread 마다 변화하거나 VM 의 호출중에 변화할 것은 없습니다.

 

GetCurrentThreadCpuTimeGetThreadCpuTime 의 구현이 다른 경우,GetCurrentThreadCpuTimerInfoGetThreadCpuTimerInfo 에 의해 반환되는 값은 다른 일이 있습니다. 상세한 것에 대하여는,GetCurrentThreadCpuTime 를 참조해 주세요.

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 이 함수는,heap 반복 함수의 콜백으로부터 호출할 수 있다. GarbageCollectionStart 이벤트,GarbageCollectionFinish 이벤트, 및 ObjectFree 이벤트의 이벤트 핸들러로부터의 호출도 가능하다. 134 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_get_current_thread_cpu_time 현재의 thread CPU 시간을 취득할 수 있다.

 

파라미터
이름 설명
info_ptr jvmtiTimerInfo * 돌아왔을 때,GetCurrentThreadCpuTime 에 의해 반환되는 시간을 설명하는 정보가 들어가 있다.

 

에이전트는 jvmtiTimerInfo 에 포인터를 건네준다. 돌아왔을 때,jvmtiTimerInfo 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_get_current_thread_cpu_time 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_NULL_POINTER info_ptrNULL.

현재의 thread의 CPU 시간을 취득

jvmtiError
GetCurrentThreadCpuTime(jvmtiEnv* env,
            jlong* nanos_ptr)

현재의 thread에 의해 사용되고 있는 CPU 시간을 돌려줍니다.

 

GetThreadCpuTime 함수는, 현재의 thread를 포함한 모든 thread의 CPU 시간을 제공합니다. GetCurrentThreadCpuTime 은, 현재의 thread 또는 현재의 thread보다 정밀한 정보를 가지는 thread 이외의 thread의 CPU 시간을 제공할 수 없는 플랫폼을 지원합니다 (GetCurrentThreadCpuTimerInfoGetThreadCpuTimerInfo 를 참조). 많은 플랫폼에서는, 이 호출은 다음의 코드와 동등합니다.

  GetThreadCpuTime(env, NULL, nanos_ptr)

 

단계 콜백 안전 위치 도입된 버젼
개시 또는 라이브 단계에서 밖에 호출할 수 없다 이 함수는,heap 반복 함수의 콜백으로부터 호출할 수 있다. GarbageCollectionStart 이벤트,GarbageCollectionFinish 이벤트, 및 ObjectFree 이벤트의 이벤트 핸들러로부터의 호출도 가능하다. 135 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_get_current_thread_cpu_time 현재의 thread CPU 시간을 취득할 수 있다.

 

이 권한이 thread의 개시 후에 유효하게 되었을 경우, 구현은, 권한이 유효하게 된 시간까지의 임의의 시간을, CPU 시간의 수집을 개시하는 포인트로서 선택할 수 있다.

 

이 권한은,can_get_thread_cpu_time 를 잠재적으로 사용할 수 있는 모든 플랫폼에서 잠재적으로 사용 가능.

 

파라미터
이름 설명
nanos_ptr jlong * 돌아왔을 때, 이 thread에 의해 사용되는 CPU 시간 (나노초단위)을 포인트 하는 이것은 부호 없음의 값. jlong (부호 첨0 보다 작은 값)로서 테스트 또는 출력했을 경우, 부의 수치로서 표시되는 경우가 있다.

 

에이전트는 jlong 에 포인터를 건네준다. 돌아왔을 때,jlong 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_get_current_thread_cpu_time 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_NULL_POINTER nanos_ptrNULL.

thread의 CPU 타이머 정보를 취득

jvmtiError
GetThreadCpuTimerInfo(jvmtiEnv* env,
            jvmtiTimerInfo* info_ptr)

GetThreadCpuTime 타이머의 정보를 가져옵니다. jvmtiTimerInfo 구조체의 필드에, 타이머의 상세가 들어갑니다. 이 정보는, 플랫폼과 GetThreadCpuTime 의 구현에 고유해서, thread 마다 변화하거나 VM 의 호출중에 변화할 것은 없습니다.

 

GetCurrentThreadCpuTimeGetThreadCpuTime 의 구현이 다른 경우,GetCurrentThreadCpuTimerInfoGetThreadCpuTimerInfo 에 의해 반환되는 값은 다른 일이 있습니다. 상세한 것에 대하여는,GetCurrentThreadCpuTime 를 참조해 주세요.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 136 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_get_thread_cpu_time thread CPU 시간을 취득할 수 있다.

 

파라미터
이름 설명
info_ptr jvmtiTimerInfo * 돌아왔을 때,GetThreadCpuTime 에 의해 반환되는 시간을 설명하는 정보가 들어가 있다.

 

에이전트는 jvmtiTimerInfo 에 포인터를 건네준다. 돌아왔을 때,jvmtiTimerInfo 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_get_thread_cpu_time 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_NULL_POINTER info_ptrNULL.

thread의 CPU 시간을 취득

jvmtiError
GetThreadCpuTime(jvmtiEnv* env,
            jthread thread,
            jlong* nanos_ptr)

지정의 thread에 의해 사용되고 있는 CPU 시간을 돌려줍니다.

 

GetThreadCpuTimerInfo 에 의해, 이 타이머의 정보를 가져옵니다.

 

단계 콜백 안전 위치 도입된 버젼
라이브 단계에서 밖에 호출할 수 없다 아니오 137 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_get_thread_cpu_time thread CPU 시간을 취득할 수 있다.

 

이 권한이 thread의 개시 후에 유효하게 되었을 경우, 구현은, 권한이 유효하게 된 시간까지의 임의의 시간을, CPU 시간의 수집을 개시하는 포인트로서 선택할 수 있다.

 

파라미터
이름 설명
thread jthread 조회하는 thread. threadNULL 의 경우, 현재의 thread가 사용된다.
nanos_ptr jlong * 돌아왔을 때, 지정된 thread에 의해 사용되는 CPU 시간 (나노초단위)을 포인트 하는 이것은 부호 없음의 값. jlong (부호 첨0 보다 작은 값)로서 테스트 또는 출력했을 경우, 부의 수치로서 표시되는 경우가 있다.

 

에이전트는 jlong 에 포인터를 건네준다. 돌아왔을 때,jlong 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_MUST_POSSESS_CAPABILITY 환경은 권한 can_get_thread_cpu_time 를 가지지 않는다. AddCapabilities 를 사용한다.
JVMTI_ERROR_INVALID_THREAD thread 는 thread 객체는 아니다.
JVMTI_ERROR_THREAD_NOT_ALIVE thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다).
JVMTI_ERROR_NULL_POINTER nanos_ptrNULL.

타이머 정보의 취득

jvmtiError
GetTimerInfo(jvmtiEnv* env,
            jvmtiTimerInfo* info_ptr)

GetTime 타이머의 정보를 가져옵니다. jvmtiTimerInfo 구조체의 필드에, 타이머의 상세가 들어갑니다. 이 정보는, VM 의 호출중으로 변경되지 않습니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 이 함수는,heap 반복 함수의 콜백으로부터 호출할 수 있다. GarbageCollectionStart 이벤트,GarbageCollectionFinish 이벤트, 및 ObjectFree 이벤트의 이벤트 핸들러로부터의 호출도 가능하다. 138 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
info_ptr jvmtiTimerInfo * 돌아왔을 때,GetTime 에 의해 반환되는 시간을 설명하는 정보가 들어가 있다.

 

에이전트는 jvmtiTimerInfo 에 포인터를 건네준다. 돌아왔을 때,jvmtiTimerInfo 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER info_ptrNULL.

시간의 취득

jvmtiError
GetTime(jvmtiEnv* env,
            jlong* nanos_ptr)

시스템 타이머-의 현재의 값 (나노초단위)을 돌려줍니다.

 

반환되는 값은, 고정된 임의의 시간부터의 경과시간 (나노초)입니다. 장래적으로, 값이 부의 수가 될 가능성이 있습니다. 이 함수에서는, 나노초단위의 정밀도가 제공됩니다만, 반드시 나노초단위의 정밀도를 얻을 수 있다고는 할 수 없습니다. 값의 변경 빈도는 보증되지 않습니다.

 

GetTimerInfo 에 의해, 이 타이머의 정보를 가져옵니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 이 함수는,heap 반복 함수의 콜백으로부터 호출할 수 있다. GarbageCollectionStart 이벤트,GarbageCollectionFinish 이벤트, 및 ObjectFree 이벤트의 이벤트 핸들러로부터의 호출도 가능하다. 139 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
nanos_ptr jlong * 돌아왔을 때, 나노초단위로 시간을 포인트 한다. 이것은 부호 없음의 값. jlong (부호 첨0 보다 작은 값)로서 테스트 또는 출력했을 경우, 부의 수치로서 표시되는 경우가 있다.

 

에이전트는 jlong 에 포인터를 건네준다. 돌아왔을 때,jlong 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER nanos_ptrNULL.

사용 가능한 프로세서의 취득

jvmtiError
GetAvailableProcessors(jvmtiEnv* env,
            jint* processor_count_ptr)

Java 가상 머신을 사용할 수 있는 프로세서의 수를 돌려줍니다.

 

이 값은, 가상 머신의 호출중으로 변경될 가능성이 있습니다. 이 때문에, 사용 가능한 프로세서의 수에 영향을 받는 어플리케이션은, 가끔 이 프로퍼티을 폴링 할 필요가 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 아니오 144 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
processor_count_ptr jint * 돌아왔을 때, 가상 머신을 사용할 수 있는 최대 프로세서수를 포인트 한다 (반드시 1 이상).

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER processor_count_ptrNULL.

 


클래스 로더 검색

클래스 로더 검색의 함수:

이러한 함수를 사용하면, 에이전트는, 클래스 로더가 클래스를 검색할 때의 장소를 추가할 수 있습니다. 이것은, 올바른 클래스 로더로 Instrumentation을 인스톨 할 때에 편리합니다.

 


bootstrap 클래스 로더 검색의 추가

jvmtiError
AddToBootstrapClassLoaderSearch(jvmtiEnv* env,
            const char* segment)

이 함수에서는, bootstrap 클래스 로더를 사용해 Instrumentation크라스를 정의할 수 있습니다. 「Java 가상 머신 스펙」「Loading Using the Bootstrap Class Loader」를 참조해 주세요. bootstrap 클래스 로더가 클래스의 검색에 실패한 뒤, 지정된 플랫폼 의존의 검색 패스세그먼트(segment) 를 검색합니다. segment 로 지정할 수 있는 세그먼트(segment)는, 1 개(살) 뿐입니다. 복수의 세그먼트(segment)를 추가하는 경우, 이 함수를 여러 차례 호출할 수가 있습니다. 세그먼트(segment)는, 이 함수가 불려 간 순서에 검색됩니다.

 

OnLoad 단계에서 이 함수를 사용하면(자), bootstrap 클래스 로더가 클래스의 검색에 실패했을 때에, 추가로 검색하는 임의의 플랫폼 의존의 검색 패스 세그먼트(segment)를 지정할 수 있습니다. 이 세그먼트(segment)는 일반적으로, 디렉토리와 JAR 파일의 어느 쪽인가에 됩니다.

 

라이브 단계에서 segment 를 사용하면(자), 임의의 플랫폼 의존의 JAR 파일에의 패스를 지정할 수 있습니다. bootstrap 클래스 로더가 Instrumentation 목적으로 정의하는 클래스나 자원 이외의 것이 JAR 파일에 포함되지 않게, 에이전트로 확인하도록 해 주세요.

 

「Java 가상 머신 스펙」에 의하면,Java 가상 머신이 이전에 상징적 참조를 해결하려고 해 실패했을 경우, 그 후 이 상징적 참조를 해결하려고 해도 반드시 실패해, 최초로 해결하려고 한 결과적으로 throw 된 에러와 같은 에러가 됩니다. 따라서, Java 가상 머신이 참조를 해결할 수 없었던 클래스에 대응하는 엔트리가 JAR 파일에 포함되는 경우, 그 참조를 해결하려고 해도 최초의 에러와 같은 에러로 실패합니다.

 

단계 콜백 안전 위치 도입된 버젼
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 149 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
segment const char* 플랫폼 의존의 검색 패스 세그먼트(segment). 수정 UTF-8 캐릭터 라인으로서 encode 된다.

 

에이전트는,char 의 배열을 건네준다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_ILLEGAL_ARGUMENT segment 가 무효인 패스. 라이브 단계에서는, 기존의 JAR 파일 이외는 모두 무효인 패스가 된다.
JVMTI_ERROR_NULL_POINTER segmentNULL.

시스템 클래스 로더 검색의 추가

jvmtiError
AddToSystemClassLoaderSearch(jvmtiEnv* env,
            const char* segment)

이 함수에서는, 시스템 클래스 로더를 사용해 Instrumentation크라스를 정의할 수 있습니다. 「Java 가상 머신 스펙」「Loading Using a User-defined Class Loader」를 참조해 주세요. 클래스 로더가 클래스의 검색에 실패한 뒤, 지정된 플랫폼 의존의 검색 패스세그먼트(segment) 를 검색합니다. segment 로 지정할 수 있는 세그먼트(segment)는, 1 개(살) 뿐입니다. 복수의 세그먼트(segment)를 추가하는 경우, 이 함수를 여러 차례 호출할 수가 있습니다. 세그먼트(segment)는, 이 함수가 불려 간 순서에 검색됩니다.

 

OnLoad 단계에서 이 함수를 사용하면(자), 시스템 클래스 로더가 클래스의 검색에 실패했을 때에, 추가로 검색하는 임의의 플랫폼 의존의 검색 패스 세그먼트(segment)를 지정할 수 있습니다. 이 세그먼트(segment)는 일반적으로, 디렉토리와 JAR 파일의 어느 쪽인가에 됩니다.

 

라이브 단계에서는,segment 는, 시스템 클래스 로더가 클래스의 검색에 실패했을 때에, 추가로 검색하는 플랫폼 의존의 JAR 파일에의 패스가 됩니다. 시스템 클래스 로더가 Instrumentation 목적으로 정의하는 클래스나 자원 이외의 것이 JAR 파일에 포함되지 않게, 에이전트로 확인하도록 해 주세요.

 

라이브 단계에서 시스템 클래스 로더가 검색 대상 JAR 파일의 추가를 지원하는 것은,java.lang.String 형의 단일 파라미터를 취하는 appendToClassPathForInstrumentation 라는 이름의 메소드를 시스템 클래스 로더가 구현하고 있는 경우입니다. 이 메소드는,public 액세스를 갖추지 않아도 괜찮습니다.

 

「Java 가상 머신 스펙」에 의하면,Java 가상 머신이 이전에 상징적 참조를 해결하려고 해 실패했을 경우, 그 후 이 상징적 참조를 해결하려고 해도 반드시 실패해, 최초로 해결하려고 한 결과적으로 throw 된 에러와 같은 에러가 됩니다. 따라서, Java 가상 머신이 참조를 해결할 수 없었던 클래스에 대응하는 엔트리가 JAR 파일에 포함되는 경우, 그 참조를 해결하려고 해도 최초의 에러와 같은 에러로 실패합니다.

 

단계 콜백 안전 위치 도입된 버젼
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 151 1.1

 

권한
필요한 기능

 

파라미터
이름 설명
segment const char* 플랫폼 의존의 검색 패스 세그먼트(segment). 수정 UTF-8 캐릭터 라인으로서 encode 된다.

 

에이전트는,char 의 배열을 건네준다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_ILLEGAL_ARGUMENT segment 가 무효인 패스. 라이브 단계에서는, 기존의 JAR 파일 이외는 모두 무효인 패스가 된다.
JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED 시스템 클래스 로더가 지원하지 않는 조작.
JVMTI_ERROR_NULL_POINTER segmentNULL.

 


시스템 프로퍼티

시스템 프로퍼티 함수:

이러한 함수는, 시스템 프로퍼티을 취득 및 설정합니다.

 


시스템 프로퍼티의 취득

jvmtiError
GetSystemProperties(jvmtiEnv* env,
            jint* count_ptr,
            char*** property_ptr)

GetSystemProperty 로 사용 가능한 VM 시스템 프로퍼티 키의 리스트가 돌려주어집니다. 가상 머신이 다음의 프로퍼티 키를 제공하도록(듯이) 하는 것을 강하게 추천합니다.

  • 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 내의 프로퍼티 세트와는 다릅니다. java.lang.System.getProperties 의 액세스에는, JNI 메소드 호출을 사용할 수 있습니다.

 

프로퍼티세트는, 실행중에 증가하는 일이 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 130 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
count_ptr jint * 돌아왔을 때, 반환되는 프로퍼티 키의 수를 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.
property_ptr char*** 돌아왔을 때, 프로퍼티 키의 배열 (수정 UTF-8 캐릭터 라인으로서 encode 된다)을 포인트 한다.

 

에이전트는 char** 에 포인터를 건네준다. 돌아왔을 때,char** 는, 사이즈 *count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. 각 요소는,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER count_ptrNULL.
JVMTI_ERROR_NULL_POINTER property_ptrNULL.

시스템 프로퍼티의 취득

jvmtiError
GetSystemProperty(jvmtiEnv* env,
            const char* property,
            char** value_ptr)

프로퍼티 키에 의해 지정된 VM 시스템 프로퍼티을 돌려줍니다.

 

함수 GetSystemProperties 는, 사용 가능한 프로퍼티 키세트를 돌려줍니다. 취득 가능한 프로퍼티은, 실행중에 증가하는 일이 있습니다.

 

이것은 시스템 프로퍼티의 VM 뷰이므로, 프로퍼티의 값은,java.lang.System.getProperty(String) 에 의해 반환되는 프로퍼티의 값과는 다릅니다. 일반적으로의 VM 는, 클래스의 초기화중에, VM 시스템 프로퍼티의 값을 java.lang.System 에 포함되고 있는 Properties 에 카피할 수 있습니다. 그 후,SetSystemProperty 를 사용해 VM 시스템 프로퍼티을 변경하거나java.lang.System.setProperty(String, String) 를 사용해 java.lang.System 시스템 프로퍼티을 변경하거나 하면(자), 값이 변경됩니다. java.lang.System.getProperty(String) 의 액세스에는, JNI 메소드 호출을 사용할 수 있습니다.

 

단계 콜백 안전 위치 도입된 버젼
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 아니오 131 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
property const char* 취득되는 프로퍼티의 키. 수정 UTF-8 캐릭터 라인으로서 encode 된다.

 

에이전트는,char 의 배열을 건네준다.
value_ptr char** 돌아왔을 때, 프로퍼티의 값 (수정 UTF-8 캐릭터 라인으로서 encode 된다)을 포인트 한다.

 

에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NOT_AVAILABLE 이 프로퍼티을 사용할 수 없다. GetSystemProperties 를 사용해, 사용 가능한 프로퍼티을 검색한다.
JVMTI_ERROR_NULL_POINTER propertyNULL.
JVMTI_ERROR_NULL_POINTER value__ptrNULL.

시스템 프로퍼티의 설정

jvmtiError
SetSystemProperty(jvmtiEnv* env,
            const char* property,
            const char* value)

VM 시스템 프로퍼티의 값을 설정합니다.

 

함수 GetSystemProperties 는, 프로퍼티 키세트를 돌려줍니다. 그 중의 몇개인가는 설정 가능합니다. GetSystemProperty 를 참조해 주세요.

 

단계 콜백 안전 위치 도입된 버젼
OnLoad 단계에서 밖에 호출할 수 없다 아니오 132 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
property const char* 프로퍼티의 키. 수정 UTF-8 캐릭터 라인으로서 encode 된다.

 

에이전트는,char 의 배열을 건네준다.
value const char * 설정하는 프로퍼티치. 수정 UTF-8 캐릭터 라인으로서 encode 된다.

 

에이전트는,char 의 배열을 건네준다. valueNULL 의 경우는 값이 설정되지 않지만, 프로퍼티이 기입해 가능하지 않은 경우는 JVMTI_ERROR_NOT_AVAILABLE 가 반환된다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NOT_AVAILABLE 이 프로퍼티을 사용할 수 없는, 또는 이 프로퍼티은 기입해 가능하지 않다.
JVMTI_ERROR_NULL_POINTER propertyNULL.

 


전반

전반 함수:

전반의 형태:

전반의 플래그 및 정수:

 


단계의 취득

typedef enum {
    JVMTI_PHASE_ONLOAD = 1,
    JVMTI_PHASE_PRIMORDIAL = 2,
    JVMTI_PHASE_START = 6,
    JVMTI_PHASE_LIVE = 4,
    JVMTI_PHASE_DEAD = 8
} jvmtiPhase;
jvmtiError
GetPhase(jvmtiEnv* env,
            jvmtiPhase* phase_ptr)

VM 실행의 현재의 단계를 돌려줍니다. 단계는 다음의 순서로 진행합니다.

실행의 단계 (jvmtiPhase)
정수 설명
JVMTI_PHASE_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 는 중간의 단계를 생략 해 직접 데드 단계로 나아갑니다. 이 경우,VMInit 이벤트도 VMDeath 이벤트도 송신되지 않습니다.

 

대부분의 JVM TI 함수는, 라이브 단계에서 밖에 동작하지 않습니다. 다음의 함수는,OnLoad 단계에서도 라이브 단계에서도 동작합니다.

다음의 함수는,OnLoad 단계에서만 동작합니다.

다음의 함수는, 개시 단계에서도 라이브 단계에서도 동작합니다.

다음의 함수는, 어느 단계에서도 동작합니다.

JNI 함수 (호출 API 를 제외한다)는, 개시 단계 또는 라이브 단계에서 사용할 필요가 있습니다.

 

대부분의 JVM TI 이벤트는, 라이브 단계에서 밖에 송신되지 않습니다. 다음의 이벤트는, 그 외의 단계에서 다루어집니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 아니오 133 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
phase_ptr jvmtiPhase * 돌아왔을 때, 단계를 포인트 한다.

 

에이전트는 jvmtiPhase 에 포인터를 건네준다. 돌아왔을 때,jvmtiPhase 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER phase__ptrNULL.

환경의 파기

jvmtiError
DisposeEnvironment(jvmtiEnv* env)

JNI GetEnv 로 작성된 JVM TI 접속을 정지합니다 (「JVM TI 환경」을 참조). 환경이 보관 유지하고 있던 모든 자원을 파기합니다. 이 환경에 의해 중단된 thread는, 이 호출에 의해 재개되지 않습니다. 이것은 에이전트가 명시적으로 실시할 필요가 있습니다. 이 환경이 JVM TI 함수를 호출하는 것으로 할당한 메모리는, 해제되지 않습니다. 이것은, 에이전트가 Deallocate 를 호출하는 것으로 명시적으로 실시할 수 있습니다. 이 환경에 의해 작성된 raw 모니터는 파기되지 않습니다. 이것은, 에이전트가 DestroyRawMonitor 를 호출하는 것으로 명시적으로 실시할 수 있습니다. 이 환경에 의해 작성된 raw 모니터상에서 대기하고 있는 thread 상태는, 어떤 영향도 받지 않습니다.

 

이 환경의네이티브 메소드 접두사는 모두 설정 해제됩니다. 에이전트는, 파기를 호출하기 전에 접두사 첨부 네이티브 메소드를 모두 삭제하지 않으면 안됩니다.

 

이 환경에서 보관 유지되고 있는권한은 모두 방폐됩니다.

 

이 환경에 의해 유효화 된 이벤트는, 송신되지 않게 됩니다. 다만, 현재 실행중의 이벤트 핸들러는, 계속 실행됩니다. 실행중에 환경이 파기되어 무효가 될 가능성이 있는 이벤트 핸들러를 설계하려면 , 충분히 주의해 주세요.

 

이 환경은, 이 호출뒤는 사용할 수 없습니다. 이 호출은 호출해 원래대로 돌아갑니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 아니오 127 1.0

 

권한
필요한 기능

 

파라미터
이름 설명

 

에러
이 함수는,범용 에러를 돌려준다

환경 로컬 기억 영역의 설정

jvmtiError
SetEnvironmentLocalStorage(jvmtiEnv* env,
            const void* data)

VM 는, 개개의 환경에 관련지을 수 있었던 포인터치를 포함합니다. 이 포인터치를 「환경 로컬인 기억 영역」이라고 부릅니다. 이 함수로 설정되지 않는 경우, 값은 NULL 가 됩니다. 에이전트는, 환경 고유의 정보를 포함하기 위해(때문에), 메모리를 할당할 수가 있습니다. 환경 로컬인 기억 영역을 설정하는 것으로써,GetEnvironmentLocalStorage 를 사용해 액세스 할 수 있게 됩니다.

 

JVM TI 의 환경 로컬인 기억 영역의 값을 설정하기 위해(때문에), 에이전트에 의해 불려 갑니다. JVM TI 는, 에이전트에 대해서, 환경마다의 정보를 기록하기 위해서 이용할 수 있는, 포인터 사이즈의 환경 로컬인 기억 영역을 제공합니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 이 함수는,heap 반복 함수의 콜백으로부터 호출할 수 있다. GarbageCollectionStart 이벤트,GarbageCollectionFinish 이벤트, 및 ObjectFree 이벤트의 이벤트 핸들러로부터의 호출도 가능하다. 148 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
data const void * 환경 로컬인 기억 영역에 입력하는 값.

 

에이전트가 포인터를 건네준다. dataNULL 의 경우, 값은 NULL 로 설정된다.

 

에러
이 함수는,범용 에러를 돌려준다

환경 로컬 기억 영역의 취득

jvmtiError
GetEnvironmentLocalStorage(jvmtiEnv* env,
            void** data_ptr)

JVM TI 의 환경 로컬인 기억 영역의 값을 취득하기 위해(때문에), 에이전트에 의해 불려 갑니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 이 함수는,heap 반복 함수의 콜백으로부터 호출할 수 있다. GarbageCollectionStart 이벤트,GarbageCollectionFinish 이벤트, 및 ObjectFree 이벤트의 이벤트 핸들러로부터의 호출도 가능하다. 147 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
data_ptr void** 환경 로컬인 기억 영역의 값을 돌려주는 포인터. 환경 로컬인 기억 영역이 SetEnvironmentLocalStorage 로 설정되어 있지 않은 경우, 반환되는 포인터는 NULL.

 

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER data_ptrNULL.

버젼 번호의 취득

jvmtiError
GetVersionNumber(jvmtiEnv* env,
            jint* version_ptr)

JVM TI 의 버젼이 version_ptr 에 의해 돌려주어집니다. 반환값은 버젼 식별자입니다. 버젼 식별자에는, 인터페이스의 형태와 메이저 버젼 번호, 마이너 버젼 번호, 마이크로 버젼 번호가 포함됩니다.

버젼의 인터페이스의 형태
정수 설명
JVMTI_VERSION_INTERFACE_JNI 0x00000000 JNI 의 JVMTI_VERSION_MASK_INTERFACE_TYPE 의 값.
JVMTI_VERSION_INTERFACE_JVMTI 0x30000000 JVM TI 의 JVMTI_VERSION_MASK_INTERFACE_TYPE 의 값.
버젼 마스크
정수 설명
JVMTI_VERSION_MASK_INTERFACE_TYPE 0x70000000 마스크에 의해, 인터페이스의 형태를 추출한다. 이것은 JVM TI 함수이므로,JVMTI_VERSION_MASK_INTERFACE_TYPE 로 마스크 된, 이 함수에 의해 반환되는 버젼의 값은, 항상 JVMTI_VERSION_INTERFACE_JVMTI.
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 쉬프트에 의해, 마이너 버젼 번호를 추출한다.
JVMTI_VERSION_SHIFT_MICRO 0 쉬프트에 의해, 마이크로 버젼 번호를 추출한다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 아니오 88 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
version_ptr jint * 돌아왔을 때, JVM TI 의 버젼을 포인트 한다.

 

에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER version_ptrNULL.

에러명의 취득

jvmtiError
GetErrorName(jvmtiEnv* env,
            jvmtiError error,
            char** name_ptr)

에러 코드의 상징적명을 돌려줍니다.

 

예를 들어,GetErrorName(env, JVMTI_ERROR_NONE, &err_name) 는,err_name 에 캐릭터 라인 "JVMTI_ERROR_NONE" 를 돌려줍니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 아니오 128 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
error jvmtiError 에러 코드.
name_ptr char** 돌아왔을 때, 에러명을 포인트 한다. 이름은,수정 UTF-8 캐릭터 라인으로서 encode 되지만, ASCII 부분집합에 제한된다.

 

에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_ILLEGAL_ARGUMENT error 는 jvmtiError 는 아니다.
JVMTI_ERROR_NULL_POINTER name_ptrNULL.

장황 플래그의 설정

typedef enum {
    JVMTI_VERBOSE_OTHER = 0,
    JVMTI_VERBOSE_GC = 1,
    JVMTI_VERBOSE_CLASS = 2,
    JVMTI_VERBOSE_JNI = 4
} jvmtiVerboseFlag;
jvmtiError
SetVerboseFlag(jvmtiEnv* env,
            jvmtiVerboseFlag flag,
            jboolean value)
장황 플래그의 열거 (jvmtiVerboseFlag)
정수 설명
JVMTI_VERBOSE_OTHER 0 장황 출력 (이하를 제외하다).
JVMTI_VERBOSE_GC 1 장황 가비지 컬렉터 출력 (-verbose:gc 로 지정된 것과 같이).
JVMTI_VERBOSE_CLASS 2 장황 클래스 로드 출력 (-verbose:class 로 지정된 것과 같이).
JVMTI_VERBOSE_JNI 4 장황 JNI 출력 (-verbose:jni 로 지정된 것과 같이).

장황 출력을 제어합니다. 이것은, 일반적으로 stderr 에 송신되는 출력입니다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 아니오 150 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
flag jvmtiVerboseFlag 어느 장황 플래그를 설정할까.
value jboolean 플래그의 새로운 값.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_ILLEGAL_ARGUMENT flag 는 jvmtiVerboseFlag 는 아니다.

JLocation 형식의 취득

typedef enum {
    JVMTI_JLOCATION_JVMBCI = 1,
    JVMTI_JLOCATION_MACHINEPC = 2,
    JVMTI_JLOCATION_OTHER = 0
} jvmtiJlocationFormat;
jvmtiError
GetJLocationFormat(jvmtiEnv* env,
            jvmtiJlocationFormat* format_ptr)

가상 머신의 바이트 코드 인덱스를 참조하는 위치 정보로부터 최대의 기능을 얻을 수 있습니다만,jlocation 의 정의는, 이 정보를 가지지 않는 VM 구현을 허가하기 위해(때문에), 의도적으로 제약을 받고 있지 않습니다.

 

이 함수는, 이 VM 로 사용되는 jlocation 의 표현을 설명합니다. 반환되는 형식이 JVMTI_JLOCATION_JVMBCI 의 경우,jlocation 를,GetBytecodes 로부터 반환되는 배열의 인덱스로서 사용할 수 있습니다.

JLocation 의 형식의 열거 (jvmtiJlocationFormat)
정수 설명
JVMTI_JLOCATION_JVMBCI 1 jlocation 의 값은, 가상 머신의 바이트 코드 인덱스를 나타낸다. 즉, 메소드의 가상 머신 코드의 오프셋(offset).
JVMTI_JLOCATION_MACHINEPC 2 jlocation 의 값은, 네이티브 머신의 프로그램 카운터치를 나타낸다.
JVMTI_JLOCATION_OTHER 0 jlocation 의 값은, 그 외의 표현을 가진다.

 

단계 콜백 안전 위치 도입된 버젼
어느 단계에서도 호출할 수 있다 아니오 129 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
format_ptr jvmtiJlocationFormat * 돌아왔을 때,jlocation 치의 형식 식별자를 포인트 한다.

 

에이전트는 jvmtiJlocationFormat 에 포인터를 건네준다. 돌아왔을 때,jvmtiJlocationFormat 가 설정되어 있다.

 

에러
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다
에러 설명
JVMTI_ERROR_NULL_POINTER format_ptrNULL.

 

 


에러

 

JVM TI 함수는 모두,jvmtiError 에러 코드를 돌려줍니다.

 

에이전트는, 유효한 파라미터를 가지는 JVM TI 함수를, 적절한 문맥 (예를 들어, 호출측 thread가 접속되고 있어, 단계가 적절)으로 호출합니다. 구현에 의해, 일부의 에러 조건의 검출이 곤란하거나 비효율적이거나 불가능해 있기도 합니다. 구현은,「함수 고유의 필수 에러」에 일람 되고 있는 에러를 검출할 필요가 있습니다. 그 외의 에러는, 에러 조건에 대한 추천 되고 있는 응답을 나타냅니다.

 

범용 에러

다음의 에러는, 어느 함수로부터도 돌려주어질 가능성이 있는 에러입니다.

 

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)
이 함수의 호출에 사용되고 있는 thread가, 가상 머신에 접속되어 있지 않다. 호출은, 접속된 thread로부터 실시할 필요가 있다. JNI 호출 API 의 AttachCurrentThread 를 참조.

 

JVMTI_ERROR_INVALID_ENVIRONMENT (116)
지정된 JVM TI 환경은 이제 접속되어 있지 않은, 또는 환경은 아니다.

 

JVMTI_ERROR_WRONG_PHASE (112)
현재의단계에서는, 필요한 기능을 사용할 수 없다. 가상 머신이 실행을 완료하고 있는 경우, 항상 반환된다.

 

JVMTI_ERROR_INTERNAL (113)
예기치 않은 내부 에러가 발생했다.

 

 

함수 고유의 필수 에러

일부의 JVM TI 함수는, 다음의 에러를 돌려줍니다. 이러한 에러는, 조건이 채워졌을 때, 구현에 의해 돌려주어질 필요가 있습니다.

 

JVMTI_ERROR_INVALID_PRIORITY (12)
무효인 우선 순위.

 

JVMTI_ERROR_THREAD_NOT_SUSPENDED (13)
thread는 중단되어 있지 않다.

 

JVMTI_ERROR_THREAD_SUSPENDED (14)
thread는 벌써 중단되고 있다.

 

JVMTI_ERROR_THREAD_NOT_ALIVE (15)
이 조작을 실시하려면 , thread가 활동중 (개시되어 아직 종료하고 있지 않다)이 아니면 안된다.

 

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)
목적의 요소 (필드나 breakpoint등)가 발견되지 않는다.

 

JVMTI_ERROR_NOT_MONITOR_OWNER (51)
이 thread는 raw 모니터를 소유하고 있지 않다.

 

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)
지정된 이벤트형의 ID 가 인식되지 않는다.

 

JVMTI_ERROR_NATIVE_METHOD (104)
요구된 정보가 네이티브 메소드로 사용할 수 없다.

 

JVMTI_ERROR_CLASS_LOADER_UNSUPPORTED (106)
클래스 로더가 이 조작을 지원하지 않는다.

 

 

함수 고유의 에이전트 에러

다음의 에러는, 일부의 JVM TI 함수로부터 돌려주어질 가능성이 있는 에러입니다. 이러한 에러는, 에이전트에 의해 무효인 파라미터가 건네받았을 경우나, 무효인 문맥으로 사용되었을 경우에 돌려주어집니다. 이러한 에러는, 구현없이 검출할 수 있습니다.

 

JVMTI_ERROR_INVALID_THREAD (10)
건네받은 thread는 유효한 thread는 아니다.

 

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)
이 환경에서 사용되는 권한이 false.

 

JVMTI_ERROR_INVALID_THREAD_GROUP (11)
thread 그룹이 무효.

 

JVMTI_ERROR_INVALID_MONITOR (50)
무효인 raw 모니터.

 

JVMTI_ERROR_ILLEGAL_ARGUMENT (103)
부정한 인수.

 

JVMTI_ERROR_INVALID_TYPESTATE (65)
thread 상태가 변경되었기 때문에, 부정합이 생기고 있다.

 

JVMTI_ERROR_UNSUPPORTED_VERSION (68)
새로운 클래스 파일의 버젼이 이 VM 로 지원되어 있지 않다.

 

JVMTI_ERROR_INVALID_CLASS_FORMAT (60)
새로운 클래스 파일의 형식이 올바르지 않다 (VM ClassFormatError 를 돌려준다).

 

JVMTI_ERROR_CIRCULAR_CLASS_DEFINITION (61)
새로운 클래스 파일의 정의가 순환 정의가 된다 (VM 는 ClassCircularityError 를 돌려준다).

 

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_ADDED (63)
새로운 클래스 파일로 메소드의 추가가 필요.

 

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_SCHEMA_CHANGED (64)
새로운 클래스의 버젼에 의해 필드가 변경된다.

 

JVMTI_ERROR_FAILS_VERIFICATION (62)
클래스 바이트가 검증에 실패한다.

 

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_HIERARCHY_CHANGED (66)
새로운 클래스의 버젼의 직접 슈퍼 클래스가 다르다, 또는 직접 구현되고 있는 인터페이스가 다르다.

 

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_DELETED (67)
새로운 클래스의 버젼에서는 구클래스의 버젼으로 선언한 메소드를 선언하지 않는다.

 

JVMTI_ERROR_NAMES_DONT_MATCH (69)
새로운 클래스 파일내에서 정의된 클래스명이, 구클래스 객체내의 이름과 다르다.

 

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_CLASS_MODIFIERS_CHANGED (70)
새로운 클래스의 버젼의 수식자가 다르다.

 

JVMTI_ERROR_UNSUPPORTED_REDEFINITION_METHOD_MODIFIERS_CHANGED (71)
새로운 클래스의 버젼의 메소드의 수식자가 구클래스의 버젼의 수식자와 다르다.

 

 

 

 

 


데이터형

 

JVM TI 는, JNI 에 의해 정의된 데이터형을 확장합니다.

 

JVMTI 로 사용하는 JNI 의 형태
설명
jboolean Java 프로그램 언어 boolean 를 보관 유지한다. 부호 없음 8 비트.
jint Java 프로그램 언어 int 를 보관 유지한다. 부호 첨부 32 비트.
jlong Java 프로그램 언어 long 를 보관 유지한다. 부호 첨부 64 비트.
jfloat Java 프로그램 언어 float 를 보관 유지한다. 32 비트.
jdouble Java 프로그램 언어 double 를 보관 유지한다. 64 비트.
jobject Java 프로그램 언어 객체를 보관 유지한다.
jclass Java 프로그램 언어 클래스를 보관 유지한다.
jvalue 모든 원시형 및 jobject 의 화집합이다. 즉, Java 프로그램 언어의 임의의 값을 보관 유지한다.
jfieldID Java 프로그램 언어의 필드를 식별한다. JVM TI 의 함수나 이벤트로부터 반환된 jfieldID 는, 안전하게 포함할 수 있다.
jmethodID Java 프로그램 언어 메소드, 이니샤라이자, 또는 생성자 을 식별한다. JVM TI 의 함수나 이벤트로부터 반환된 jmethodID 는, 안전하게 포함할 수 있다. 다만, 클래스가 언로드되었을 경우, 그것들은 무효가 되므로 사용해선 안 된다.
JNIEnv JNI 함수 테이블의 포인터. JNIEnv * 의 포인터는 JNI 환경.

 

JVMTI 기저형
설명
jvmtiEnv * JVM TI 환경의 포인터. 「함수」를 참조. jvmtiEnv함수 테이블의 포인터를 포인트 한다.
jthread thread를 보관 유지하는 jobject 의 subtype.
typedef jobject jthread;
jthreadGroup thread 그룹을 보관 유지하는 jobject 의 subtype.
typedef jobject jthreadGroup;
jlocation 64 비트의 값으로, 메소드내에서 단조롭게 증가하는 실행 가능 위치를 나타낸다. -1 (은)는 네이티브 메소드를 나타낸다. 지정의 VM 의 형식에 대해서는,GetJLocationFormat 를 참조.
typedef jlong jlocation;
jrawMonitorID raw 모니터.
struct _jrawMonitorID;
typedef struct _jrawMonitorID *jrawMonitorID;
jvmtiError 귀가 에러 코드를 보관 유지한다. 가능한 값에 대해서는,「에러」를 참조.
typedef enum {
    JVMTI_ERROR_NONE = 0,
    JVMTI_ERROR_INVALID_THREAD = 10,
      ...
} jvmtiError;
jvmtiEvent 이벤트형의 식별자. 가능한 값에 대해서는,「이벤트」를 참조. 이 스펙의 장래의 버젼에서는, 이벤트형 식별자로서 제로를 할당할 수 없는 것이 보증된다.
typedef enum {
    JVMTI_EVENT_SINGLE_STEP = 1,
    JVMTI_EVENT_BREAKPOINT = 2,
      ...
} jvmtiEvent;
jvmtiEventCallbacks 이벤트용 콜백.
typedef struct {
    jvmtiEventVMInit VMInit;
    jvmtiEventVMDeath VMDeath;
      ...
} jvmtiEventCallbacks;
완전한 구조에 대해서는이벤트 콜백을 참조.

 

예를 들어, VM 초기화 콜백은 다음과 같이 정의된다.
typedef void (JNICALL *jvmtiEventVMInit)
    (jvmtiEnv *jvmti_env,
     JNIEnv* jni_env,
     jthread thread);
콜백 함수의 정의에 대해서는 개개의 이벤트를 참조.
jniNativeInterface JNI 스펙으로 정의된 JNI 함수 테이블 JNINativeInterface 의 형태 식별자. JNI 참조 구현에서는, 밑줄 첨부로 정의된다.
typedef struct JNINativeInterface_ jniNativeInterface;

 

구조형의 정의
설명
jvmtiAddrLocationMap 위치 엔트리의 네이티브 주소
jvmtiCapabilities 권한의 구조체
jvmtiClassDefinition 클래스의 재정의의 설명
jvmtiExtensionEventInfo 확장 이벤트 정보
jvmtiExtensionFunctionInfo 확장 함수 정보
jvmtiFrameInfo 스택 프레임 정보 구조체
jvmtiHeapCallbacks heap 콜백 함수 구조체
jvmtiHeapReferenceInfo 참조 정보 구조체
jvmtiHeapReferenceInfoArray 배열 참조용의 참조 정보 구조체
jvmtiHeapReferenceInfoConstantPool 정수 풀 참조용의 참조 정보 구조체
jvmtiHeapReferenceInfoField 필드 참조용의 참조 정보 구조체
jvmtiHeapReferenceInfoJniLocal JNI 로컬 참조용의 참조 정보 구조체
jvmtiHeapReferenceInfoReserved 그 외의 참조용의 참조 정보 구조체
jvmtiHeapReferenceInfoStackLocal 국소 변수 참조용의 참조 정보 구조체
jvmtiLineNumberEntry 행 번호 테이블의 엔트리
jvmtiLocalVariableEntry 국소 변수 테이블의 엔트리
jvmtiMonitorStackDepthInfo 모니터 스택 깊이 정보 구조체
jvmtiMonitorUsage 객체 모니터의 사용 정보
jvmtiParamInfo 확장 함수/이벤트 파라미터 정보
jvmtiStackInfo 스택 정보 구조체
jvmtiThreadGroupInfo thread 그룹 정보 구조체
jvmtiThreadInfo thread 정보 구조체
jvmtiTimerInfo 타이머 정보

 

함수형의 정의
설명
jvmtiArrayPrimitiveValueCallback 배열 프리미티브(primitive)치 콜백
jvmtiExtensionEvent 확장 이벤트
jvmtiExtensionFunction 확장 함수
jvmtiHeapIterationCallback heap 반복 콜백
jvmtiHeapObjectCallback heap 객체의 콜백
jvmtiHeapReferenceCallback heap 참조 콜백
jvmtiHeapRootCallback heap 루트 객체의 콜백
jvmtiObjectReferenceCallback 객체 참조의 콜백
jvmtiPrimitiveFieldCallback 프리미티브(primitive) 필드 콜백
jvmtiReservedCallback 장래 사용하기 위해서 예약된 콜백
jvmtiStackReferenceCallback 스택 참조 객체의 콜백
jvmtiStartFunction 에이전트 기동 함수
jvmtiStringPrimitiveValueCallback 캐릭터 라인 프리미티브(primitive)치 콜백

 

열거형의 정의
설명
jvmtiEventMode 이벤트의 유효화와 무효화
jvmtiHeapObjectFilter heap 객체의 필터의 열거
jvmtiHeapReferenceKind heap 참조의 열거
jvmtiHeapRootKind heap 루트의 종류의 열거
jvmtiIterationControl 반복 제어의 열거
jvmtiJlocationFormat JLocation 의 형식의 열거
jvmtiObjectReferenceKind 객체 참조의 열거
jvmtiParamKind 확장 함수/이벤트 파라미터의 종류
jvmtiParamTypes 확장 함수/이벤트 파라미터의 형태
jvmtiPhase 실행의 단계
jvmtiPrimitiveType 원시형의 열거
jvmtiTimerKind 타이머의 종류
jvmtiVerboseFlag 장황 플래그의 열거

 

함수 테이블의 레이아웃
위치 기능 선언
1 예약이 끝난 상태
void *reserved1;
2 이벤트 통지 모드의 설정
jvmtiError (JNICALL *SetEventNotificationMode) (jvmtiEnv* env,
                       jvmtiEventMode mode,
                       jvmtiEvent event_type,
                       jthread event_thread,
                        ...);
3 예약이 끝난 상태
void *reserved3;
4 모든 thread의 취득
jvmtiError (JNICALL *GetAllThreads) (jvmtiEnv* env,
                       jint* threads_count_ptr,
                       jthread** threads_ptr);
5 thread의 중단
jvmtiError (JNICALL *SuspendThread) (jvmtiEnv* env,
                       jthread thread);
6 thread의 재개
jvmtiError (JNICALL *ResumeThread) (jvmtiEnv* env,
                       jthread thread);
7 thread의 정지
jvmtiError (JNICALL *StopThread) (jvmtiEnv* env,
                       jthread thread,
                       jobject exception);
8 thread의 인터럽트
jvmtiError (JNICALL *InterruptThread) (jvmtiEnv* env,
                       jthread thread);
9 thread 정보의 취득
jvmtiError (JNICALL *GetThreadInfo) (jvmtiEnv* env,
                       jthread thread,
                       jvmtiThreadInfo* info_ptr);
10 소유 모니터 정보의 취득
jvmtiError (JNICALL *GetOwnedMonitorInfo) (jvmtiEnv* env,
                       jthread thread,
                       jint* owned_monitor_count_ptr,
                       jobject** owned_monitors_ptr);
11 현재 경합 하고 있는 모니터의 취득
jvmtiError (JNICALL *GetCurrentContendedMonitor) (jvmtiEnv* env,
                       jthread thread,
                       jobject* monitor_ptr);
12 에이전트 thread의 실행
jvmtiError (JNICALL *RunAgentThread) (jvmtiEnv* env,
                       jthread thread,
                       jvmtiStartFunction proc,
                       const void* arg,
                       jint priority);
13 톱 레벨의 thread 그룹의 취득
jvmtiError (JNICALL *GetTopThreadGroups) (jvmtiEnv* env,
                       jint* group_count_ptr,
                       jthreadGroup** groups_ptr);
14 thread 그룹 정보의 취득
jvmtiError (JNICALL *GetThreadGroupInfo) (jvmtiEnv* env,
                       jthreadGroup group,
                       jvmtiThreadGroupInfo* info_ptr);
15 자 thread 그룹의 취득
jvmtiError (JNICALL *GetThreadGroupChildren) (jvmtiEnv* env,
                       jthreadGroup group,
                       jint* thread_count_ptr,
                       jthread** threads_ptr,
                       jint* group_count_ptr,
                       jthreadGroup** groups_ptr);
16 프레임 카운트의 취득
jvmtiError (JNICALL *GetFrameCount) (jvmtiEnv* env,
                       jthread thread,
                       jint* count_ptr);
17 thread 상태의 취득
jvmtiError (JNICALL *GetThreadState) (jvmtiEnv* env,
                       jthread thread,
                       jint* thread_state_ptr);
18 현재의 thread의 취득
jvmtiError (JNICALL *GetCurrentThread) (jvmtiEnv* env,
                       jthread* thread_ptr);
19 프레임의 위치의 취득
jvmtiError (JNICALL *GetFrameLocation) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jmethodID* method_ptr,
                       jlocation* location_ptr);
20 프레임의 팝의 통지
jvmtiError (JNICALL *NotifyFramePop) (jvmtiEnv* env,
                       jthread thread,
                       jint depth);
21 국소 변수의 취득 - 객체형
jvmtiError (JNICALL *GetLocalObject) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jobject* value_ptr);
22 국소 변수의 취득 - 정수형
jvmtiError (JNICALL *GetLocalInt) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jint* value_ptr);
23 국소 변수의 취득 - 장 정수형
jvmtiError (JNICALL *GetLocalLong) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jlong* value_ptr);
24 국소 변수의 취득 - 부동 소수점수(실수)형
jvmtiError (JNICALL *GetLocalFloat) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jfloat* value_ptr);
25 국소 변수의 취득 - 배정밀도 부동 소수점수(실수)형
jvmtiError (JNICALL *GetLocalDouble) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jdouble* value_ptr);
26 국소 변수의 설정 - 객체형
jvmtiError (JNICALL *SetLocalObject) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jobject value);
27 국소 변수의 설정 - 정수형
jvmtiError (JNICALL *SetLocalInt) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jint value);
28 국소 변수의 설정 - 장 정수형
jvmtiError (JNICALL *SetLocalLong) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jlong value);
29 국소 변수의 설정 - 부동 소수점수(실수)형
jvmtiError (JNICALL *SetLocalFloat) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jfloat value);
30 국소 변수의 설정 - 배정밀도 부동 소수점수(실수)형
jvmtiError (JNICALL *SetLocalDouble) (jvmtiEnv* env,
                       jthread thread,
                       jint depth,
                       jint slot,
                       jdouble value);
31 raw 모니터의 작성
jvmtiError (JNICALL *CreateRawMonitor) (jvmtiEnv* env,
                       const char* name,
                       jrawMonitorID* monitor_ptr);
32 raw 모니터의 파기
jvmtiError (JNICALL *DestroyRawMonitor) (jvmtiEnv* env,
                       jrawMonitorID monitor);
33 raw 모니터의 개시
jvmtiError (JNICALL *RawMonitorEnter) (jvmtiEnv* env,
                       jrawMonitorID monitor);
34 raw 모니터의 종료
jvmtiError (JNICALL *RawMonitorExit) (jvmtiEnv* env,
                       jrawMonitorID monitor);
35 raw 모니터의 대기
jvmtiError (JNICALL *RawMonitorWait) (jvmtiEnv* env,
                       jrawMonitorID monitor,
                       jlong millis);
36 raw 모니터의 통지
jvmtiError (JNICALL *RawMonitorNotify) (jvmtiEnv* env,
                       jrawMonitorID monitor);
37 raw 모니터의 통지 (모두)
jvmtiError (JNICALL *RawMonitorNotifyAll) (jvmtiEnv* env,
                       jrawMonitorID monitor);
38 breakpoint의 설정
jvmtiError (JNICALL *SetBreakpoint) (jvmtiEnv* env,
                       jmethodID method,
                       jlocation location);
39 breakpoint의 해제
jvmtiError (JNICALL *ClearBreakpoint) (jvmtiEnv* env,
                       jmethodID method,
                       jlocation location);
40 예약이 끝난 상태
void *reserved40;
41 필드 액세스의 감시의 설정
jvmtiError (JNICALL *SetFieldAccessWatch) (jvmtiEnv* env,
                       jclass klass,
                       jfieldID field);
42 필드 액세스의 감시의 해제
jvmtiError (JNICALL *ClearFieldAccessWatch) (jvmtiEnv* env,
                       jclass klass,
                       jfieldID field);
43 필드 변경의 감시의 설정
jvmtiError (JNICALL *SetFieldModificationWatch) (jvmtiEnv* env,
                       jclass klass,
                       jfieldID field);
44 필드 변경의 감시의 해제
jvmtiError (JNICALL *ClearFieldModificationWatch) (jvmtiEnv* env,
                       jclass klass,
                       jfieldID field);
45 변경 가능 클래스인가 어떤가의 검사
jvmtiError (JNICALL *IsModifiableClass) (jvmtiEnv* env,
                       jclass klass,
                       jboolean* is_modifiable_class_ptr);
46 Allocate
jvmtiError (JNICALL *Allocate) (jvmtiEnv* env,
                       jlong size,
                       unsigned char** mem_ptr);
47 Deallocate
jvmtiError (JNICALL *Deallocate) (jvmtiEnv* env,
                       unsigned char* mem);
48 클래스의 시그니챠의 취득
jvmtiError (JNICALL *GetClassSignature) (jvmtiEnv* env,
                       jclass klass,
                       char** signature_ptr,
                       char** generic_ptr);
49 클래스의 상태의 취득
jvmtiError (JNICALL *GetClassStatus) (jvmtiEnv* env,
                       jclass klass,
                       jint* status_ptr);
50 원시 파일명의 취득
jvmtiError (JNICALL *GetSourceFileName) (jvmtiEnv* env,
                       jclass klass,
                       char** source_name_ptr);
51 클래스의 수식자의 취득
jvmtiError (JNICALL *GetClassModifiers) (jvmtiEnv* env,
                       jclass klass,
                       jint* modifiers_ptr);
52 클래스의 메소드의 취득
jvmtiError (JNICALL *GetClassMethods) (jvmtiEnv* env,
                       jclass klass,
                       jint* method_count_ptr,
                       jmethodID** methods_ptr);
53 클래스의 필드의 취득
jvmtiError (JNICALL *GetClassFields) (jvmtiEnv* env,
                       jclass klass,
                       jint* field_count_ptr,
                       jfieldID** fields_ptr);
54 구현된 인터페이스의 취득
jvmtiError (JNICALL *GetImplementedInterfaces) (jvmtiEnv* env,
                       jclass klass,
                       jint* interface_count_ptr,
                       jclass** interfaces_ptr);
55 인터페이스인가 어떤가의 검사
jvmtiError (JNICALL *IsInterface) (jvmtiEnv* env,
                       jclass klass,
                       jboolean* is_interface_ptr);
56 배열 클래스인가 어떤가의 검사
jvmtiError (JNICALL *IsArrayClass) (jvmtiEnv* env,
                       jclass klass,
                       jboolean* is_array_class_ptr);
57 클래스 로더의 취득
jvmtiError (JNICALL *GetClassLoader) (jvmtiEnv* env,
                       jclass klass,
                       jobject* classloader_ptr);
58 객체의 해시 코드의 취득
jvmtiError (JNICALL *GetObjectHashCode) (jvmtiEnv* env,
                       jobject object,
                       jint* hash_code_ptr);
59 객체의 모니터의 이용 정보를 취득
jvmtiError (JNICALL *GetObjectMonitorUsage) (jvmtiEnv* env,
                       jobject object,
                       jvmtiMonitorUsage* info_ptr);
60 필드의 이름과 시그니챠의 취득
jvmtiError (JNICALL *GetFieldName) (jvmtiEnv* env,
                       jclass klass,
                       jfieldID field,
                       char** name_ptr,
                       char** signature_ptr,
                       char** generic_ptr);
61 필드의 선언 클래스의 취득
jvmtiError (JNICALL *GetFieldDeclaringClass) (jvmtiEnv* env,
                       jclass klass,
                       jfieldID field,
                       jclass* declaring_class_ptr);
62 필드의 수식자의 취득
jvmtiError (JNICALL *GetFieldModifiers) (jvmtiEnv* env,
                       jclass klass,
                       jfieldID field,
                       jint* modifiers_ptr);
63 합성 필드인가 어떤가의 검사
jvmtiError (JNICALL *IsFieldSynthetic) (jvmtiEnv* env,
                       jclass klass,
                       jfieldID field,
                       jboolean* is_synthetic_ptr);
64 메소드의 이름과 시그니챠의 취득
jvmtiError (JNICALL *GetMethodName) (jvmtiEnv* env,
                       jmethodID method,
                       char** name_ptr,
                       char** signature_ptr,
                       char** generic_ptr);
65 메소드의 선언 클래스의 취득
jvmtiError (JNICALL *GetMethodDeclaringClass) (jvmtiEnv* env,
                       jmethodID method,
                       jclass* declaring_class_ptr);
66 메소드의 수식자의 취득
jvmtiError (JNICALL *GetMethodModifiers) (jvmtiEnv* env,
                       jmethodID method,
                       jint* modifiers_ptr);
67 예약이 끝난 상태
void *reserved67;
68 국소 변수의 취득
jvmtiError (JNICALL *GetMaxLocals) (jvmtiEnv* env,
                       jmethodID method,
                       jint* max_ptr);
69 인수의 사이즈의 취득
jvmtiError (JNICALL *GetArgumentsSize) (jvmtiEnv* env,
                       jmethodID method,
                       jint* size_ptr);
70 행 번호 테이블의 취득
jvmtiError (JNICALL *GetLineNumberTable) (jvmtiEnv* env,
                       jmethodID method,
                       jint* entry_count_ptr,
                       jvmtiLineNumberEntry** table_ptr);
71 메소드의 배치 위치의 취득
jvmtiError (JNICALL *GetMethodLocation) (jvmtiEnv* env,
                       jmethodID method,
                       jlocation* start_location_ptr,
                       jlocation* end_location_ptr);
72 국소 변수 테이블의 취득
jvmtiError (JNICALL *GetLocalVariableTable) (jvmtiEnv* env,
                       jmethodID method,
                       jint* entry_count_ptr,
                       jvmtiLocalVariableEntry** table_ptr);
73 네이티브 메소드 접두사의 설정
jvmtiError (JNICALL *SetNativeMethodPrefix) (jvmtiEnv* env,
                       const char* prefix);
74 복수의 네이티브 메소드 접두사의 설정
jvmtiError (JNICALL *SetNativeMethodPrefixes) (jvmtiEnv* env,
                       jint prefix_count,
                       char** prefixes);
75 바이트 코드의 취득
jvmtiError (JNICALL *GetBytecodes) (jvmtiEnv* env,
                       jmethodID method,
                       jint* bytecode_count_ptr,
                       unsigned char** bytecodes_ptr);
76 네이티브 메소드인가 어떤가의 검사
jvmtiError (JNICALL *IsMethodNative) (jvmtiEnv* env,
                       jmethodID method,
                       jboolean* is_native_ptr);
77 합성 메소드인가 어떤가의 검사
jvmtiError (JNICALL *IsMethodSynthetic) (jvmtiEnv* env,
                       jmethodID method,
                       jboolean* is_synthetic_ptr);
78 로드가 끝난 클래스의 취득
jvmtiError (JNICALL *GetLoadedClasses) (jvmtiEnv* env,
                       jint* class_count_ptr,
                       jclass** classes_ptr);
79 클래스 로더 클래스의 취득
jvmtiError (JNICALL *GetClassLoaderClasses) (jvmtiEnv* env,
                       jobject initiating_loader,
                       jint* class_count_ptr,
                       jclass** classes_ptr);
80 프레임의 팝
jvmtiError (JNICALL *PopFrame) (jvmtiEnv* env,
                       jthread thread);
81 조기 복귀의 강제 - 객체형
jvmtiError (JNICALL *ForceEarlyReturnObject) (jvmtiEnv* env,
                       jthread thread,
                       jobject value);
82 조기 복귀의 강제 - 정수형
jvmtiError (JNICALL *ForceEarlyReturnInt) (jvmtiEnv* env,
                       jthread thread,
                       jint value);
83 조기 복귀의 강제 - 장 정수형
jvmtiError (JNICALL *ForceEarlyReturnLong) (jvmtiEnv* env,
                       jthread thread,
                       jlong value);
84 조기 복귀의 강제 - 부동 소수점수(실수)형
jvmtiError (JNICALL *ForceEarlyReturnFloat) (jvmtiEnv* env,
                       jthread thread,
                       jfloat value);
85 조기 복귀의 강제 - 배정밀도 부동 소수점수(실수)형
jvmtiError (JNICALL *ForceEarlyReturnDouble) (jvmtiEnv* env,
                       jthread thread,
                       jdouble value);
86 조기 복귀의 강제 - void 형
jvmtiError (JNICALL *ForceEarlyReturnVoid) (jvmtiEnv* env,
                       jthread thread);
87 클래스의 재정의
jvmtiError (JNICALL *RedefineClasses) (jvmtiEnv* env,
                       jint class_count,
                       const jvmtiClassDefinition* class_definitions);
88 버젼 번호의 취득
jvmtiError (JNICALL *GetVersionNumber) (jvmtiEnv* env,
                       jint* version_ptr);
89 기능의 취득
jvmtiError (JNICALL *GetCapabilities) (jvmtiEnv* env,
                       jvmtiCapabilities* capabilities_ptr);
90 소스 디버그 확장 기능의 취득
jvmtiError (JNICALL *GetSourceDebugExtension) (jvmtiEnv* env,
                       jclass klass,
                       char** source_debug_extension_ptr);
91 폐기된 메소드인가 어떤가의 검사
jvmtiError (JNICALL *IsMethodObsolete) (jvmtiEnv* env,
                       jmethodID method,
                       jboolean* is_obsolete_ptr);
92 threaded list의 중단
jvmtiError (JNICALL *SuspendThreadList) (jvmtiEnv* env,
                       jint request_count,
                       const jthread* request_list,
                       jvmtiError* results);
93 threaded list의 재개
jvmtiError (JNICALL *ResumeThreadList) (jvmtiEnv* env,
                       jint request_count,
                       const jthread* request_list,
                       jvmtiError* results);
94 예약이 끝난 상태
void *reserved94;
95 예약이 끝난 상태
void *reserved95;
96 예약이 끝난 상태
void *reserved96;
97 예약이 끝난 상태
void *reserved97;
98 예약이 끝난 상태
void *reserved98;
99 예약이 끝난 상태
void *reserved99;
100 모든 스택 트레이스의 취득
jvmtiError (JNICALL *GetAllStackTraces) (jvmtiEnv* env,
                       jint max_frame_count,
                       jvmtiStackInfo** stack_info_ptr,
                       jint* thread_count_ptr);
101 threaded list의 스택 트레이스의 취득
jvmtiError (JNICALL *GetThreadListStackTraces) (jvmtiEnv* env,
                       jint thread_count,
                       const jthread* thread_list,
                       jint max_frame_count,
                       jvmtiStackInfo** stack_info_ptr);
102 thread 로컬인 기억 영역의 취득
jvmtiError (JNICALL *GetThreadLocalStorage) (jvmtiEnv* env,
                       jthread thread,
                       void** data_ptr);
103 thread 로컬인 기억 영역의 설정
jvmtiError (JNICALL *SetThreadLocalStorage) (jvmtiEnv* env,
                       jthread thread,
                       const void* data);
104 스택 트레이스의 취득
jvmtiError (JNICALL *GetStackTrace) (jvmtiEnv* env,
                       jthread thread,
                       jint start_depth,
                       jint max_frame_count,
                       jvmtiFrameInfo* frame_buffer,
                       jint* count_ptr);
105 예약이 끝난 상태
void *reserved105;
106 태그의 취득
jvmtiError (JNICALL *GetTag) (jvmtiEnv* env,
                       jobject object,
                       jlong* tag_ptr);
107 태그의 설정
jvmtiError (JNICALL *SetTag) (jvmtiEnv* env,
                       jobject object,
                       jlong tag);
108 가베지 컬렉션의 강제
jvmtiError (JNICALL *ForceGarbageCollection) (jvmtiEnv* env);
109 객체로부터 도달 가능한 객체의 반복
jvmtiError (JNICALL *IterateOverObjectsReachableFromObject) (jvmtiEnv* env,
                       jobject object,
                       jvmtiObjectReferenceCallback object_reference_callback,
                       const void* user_data);
110 도달 가능한 객체의 반복
jvmtiError (JNICALL *IterateOverReachableObjects) (jvmtiEnv* env,
                       jvmtiHeapRootCallback heap_root_callback,
                       jvmtiStackReferenceCallback stack_ref_callback,
                       jvmtiObjectReferenceCallback object_ref_callback,
                       const void* user_data);
111 heap의 반복
jvmtiError (JNICALL *IterateOverHeap) (jvmtiEnv* env,
                       jvmtiHeapObjectFilter object_filter,
                       jvmtiHeapObjectCallback heap_object_callback,
                       const void* user_data);
112 클래스의 인스턴스의 반복
jvmtiError (JNICALL *IterateOverInstancesOfClass) (jvmtiEnv* env,
                       jclass klass,
                       jvmtiHeapObjectFilter object_filter,
                       jvmtiHeapObjectCallback heap_object_callback,
                       const void* user_data);
113 예약이 끝난 상태
void *reserved113;
114 태그를 사용한 객체의 취득
jvmtiError (JNICALL *GetObjectsWithTags) (jvmtiEnv* env,
                       jint tag_count,
                       const jlong* tags,
                       jint* count_ptr,
                       jobject** object_result_ptr,
                       jlong** tag_result_ptr);
115 참조의 추적
jvmtiError (JNICALL *FollowReferences) (jvmtiEnv* env,
                       jint heap_filter,
                       jclass klass,
                       jobject initial_object,
                       const jvmtiHeapCallbacks* callbacks,
                       const void* user_data);
116 heap내에서의 반복해
jvmtiError (JNICALL *IterateThroughHeap) (jvmtiEnv* env,
                       jint heap_filter,
                       jclass klass,
                       const jvmtiHeapCallbacks* callbacks,
                       const void* user_data);
117 예약이 끝난 상태
void *reserved117;
118 예약이 끝난 상태
void *reserved118;
119 예약이 끝난 상태
void *reserved119;
120 JNI 함수 테이블의 설정
jvmtiError (JNICALL *SetJNIFunctionTable) (jvmtiEnv* env,
                       const jniNativeInterface* function_table);
121 JNI 함수 테이블의 취득
jvmtiError (JNICALL *GetJNIFunctionTable) (jvmtiEnv* env,
                       jniNativeInterface** function_table);
122 이벤트 콜백의 설정
jvmtiError (JNICALL *SetEventCallbacks) (jvmtiEnv* env,
                       const jvmtiEventCallbacks* callbacks,
                       jint size_of_callbacks);
123 이벤트의 생성
jvmtiError (JNICALL *GenerateEvents) (jvmtiEnv* env,
                       jvmtiEvent event_type);
124 확장 함수의 취득
jvmtiError (JNICALL *GetExtensionFunctions) (jvmtiEnv* env,
                       jint* extension_count_ptr,
                       jvmtiExtensionFunctionInfo** extensions);
125 확장 이벤트의 취득
jvmtiError (JNICALL *GetExtensionEvents) (jvmtiEnv* env,
                       jint* extension_count_ptr,
                       jvmtiExtensionEventInfo** extensions);
126 확장 이벤트 콜백의 설정
jvmtiError (JNICALL *SetExtensionEventCallback) (jvmtiEnv* env,
                       jint extension_event_index,
                       jvmtiExtensionEvent callback);
127 환경의 파기
jvmtiError (JNICALL *DisposeEnvironment) (jvmtiEnv* env);
128 에러명의 취득
jvmtiError (JNICALL *GetErrorName) (jvmtiEnv* env,
                       jvmtiError error,
                       char** name_ptr);
129 JLocation 형식의 취득
jvmtiError (JNICALL *GetJLocationFormat) (jvmtiEnv* env,
                       jvmtiJlocationFormat* format_ptr);
130 시스템 프로퍼티의 취득
jvmtiError (JNICALL *GetSystemProperties) (jvmtiEnv* env,
                       jint* count_ptr,
                       char*** property_ptr);
131 시스템 프로퍼티의 취득
jvmtiError (JNICALL *GetSystemProperty) (jvmtiEnv* env,
                       const char* property,
                       char** value_ptr);
132 시스템 프로퍼티의 설정
jvmtiError (JNICALL *SetSystemProperty) (jvmtiEnv* env,
                       const char* property,
                       const char* value);
133 단계의 취득
jvmtiError (JNICALL *GetPhase) (jvmtiEnv* env,
                       jvmtiPhase* phase_ptr);
134 현재의 thread의 CPU 타이머 정보를 취득
jvmtiError (JNICALL *GetCurrentThreadCpuTimerInfo) (jvmtiEnv* env,
                       jvmtiTimerInfo* info_ptr);
135 현재의 thread의 CPU 시간을 취득
jvmtiError (JNICALL *GetCurrentThreadCpuTime) (jvmtiEnv* env,
                       jlong* nanos_ptr);
136 thread의 CPU 타이머 정보를 취득
jvmtiError (JNICALL *GetThreadCpuTimerInfo) (jvmtiEnv* env,
                       jvmtiTimerInfo* info_ptr);
137 thread의 CPU 시간을 취득
jvmtiError (JNICALL *GetThreadCpuTime) (jvmtiEnv* env,
                       jthread thread,
                       jlong* nanos_ptr);
138 타이머 정보의 취득
jvmtiError (JNICALL *GetTimerInfo) (jvmtiEnv* env,
                       jvmtiTimerInfo* info_ptr);
139 시간의 취득
jvmtiError (JNICALL *GetTime) (jvmtiEnv* env,
                       jlong* nanos_ptr);
140 잠재적인 권한의 취득
jvmtiError (JNICALL *GetPotentialCapabilities) (jvmtiEnv* env,
                       jvmtiCapabilities* capabilities_ptr);
141 예약이 끝난 상태
void *reserved141;
142 권한의 추가
jvmtiError (JNICALL *AddCapabilities) (jvmtiEnv* env,
                       const jvmtiCapabilities* capabilities_ptr);
143 권한의 방폐
jvmtiError (JNICALL *RelinquishCapabilities) (jvmtiEnv* env,
                       const jvmtiCapabilities* capabilities_ptr);
144 사용 가능한 프로세서의 취득
jvmtiError (JNICALL *GetAvailableProcessors) (jvmtiEnv* env,
                       jint* processor_count_ptr);
145 클래스 버젼 번호의 취득
jvmtiError (JNICALL *GetClassVersionNumbers) (jvmtiEnv* env,
                       jclass klass,
                       jint* minor_version_ptr,
                       jint* major_version_ptr);
146 정수 풀의 취득
jvmtiError (JNICALL *GetConstantPool) (jvmtiEnv* env,
                       jclass klass,
                       jint* constant_pool_count_ptr,
                       jint* constant_pool_byte_count_ptr,
                       unsigned char** constant_pool_bytes_ptr);
147 환경 로컬 기억 영역의 취득
jvmtiError (JNICALL *GetEnvironmentLocalStorage) (jvmtiEnv* env,
                       void** data_ptr);
148 환경 로컬 기억 영역의 설정
jvmtiError (JNICALL *SetEnvironmentLocalStorage) (jvmtiEnv* env,
                       const void* data);
149 bootstrap 클래스 로더 검색의 추가
jvmtiError (JNICALL *AddToBootstrapClassLoaderSearch) (jvmtiEnv* env,
                       const char* segment);
150 장황 플래그의 설정
jvmtiError (JNICALL *SetVerboseFlag) (jvmtiEnv* env,
                       jvmtiVerboseFlag flag,
                       jboolean value);
151 시스템 클래스 로더 검색의 추가
jvmtiError (JNICALL *AddToSystemClassLoaderSearch) (jvmtiEnv* env,
                       const char* segment);
152 클래스의 재변환
jvmtiError (JNICALL *RetransformClasses) (jvmtiEnv* env,
                       jint class_count,
                       const jclass* classes);
153 소유 모니터 스택 깊이 정보의 취득
jvmtiError (JNICALL *GetOwnedMonitorStackDepthInfo) (jvmtiEnv* env,
                       jthread thread,
                       jint* monitor_info_count_ptr,
                       jvmtiMonitorStackDepthInfo** monitor_info_ptr);
154 객체 사이즈의 취득
jvmtiError (JNICALL *GetObjectSize) (jvmtiEnv* env,
                       jobject object,
                       jlong* size_ptr);

 

 

 


이벤트

이벤트의 처리

에이전트는, 응용 프로그램내에서 발생하는 많은 이벤트에 대한 통지를 받을 수가 있습니다.

 

이벤트를 처리하려면 ,SetEventCallbacks 를 사용해 콜백 함수세트를 지정합니다. 이벤트 마다, 대응하는 콜백 함수가 불려 갑니다. 콜백 함수의 인수는, 이벤트에 관한 추가 정보를 제공합니다.

 

콜백 함수는 일반적으로, 어플리케이션 thread내로부터 불려 갑니다. JVM TI 구현이 이벤트를 큐에 넣는 것은, 결코 없습니다. 이것은, 이벤트의 콜백 함수를 주의 깊게 기술할 필요가 있는 것을 의미하고 있습니다. 이후에, 일반적인 가이드 라인을 설명합니다. 한층 더 자세한 제안에 대해서는, 개개의 이벤트의 설명을 참조해 주세요.

 

  • 이벤트 콜백 함수의 실행중에 throw 된 예외는, 현재의 어플리케이션 thread내에서 현재 보류중의 예외를 덧쓰기 가능하게 됩니다. 따라서, 예외를 생성할 가능성이 있는 JNI 호출을 이벤트 콜백 함수로부터 실행하는 경우는, 보류중의 예외를 보존하도록(듯이) 조심하지 않으면 되지 않습니다.
  • 이벤트 콜백 함수는, 재입 가능하지 않으면 안됩니다. JVM TI 구현은, 이벤트를 큐에 넣지 않습니다. 에이전트가 복수의 이벤트를 한 번에 1 개(살)씩 처리할 필요가 있는 경우는, 이벤트 콜백 함수의 내부에서 raw 모니터를 사용하면(자), 이벤트의 처리를 직렬화할 수 있습니다.
  • JNI 의 FindClass 함수를 실행해 클래스를 로드하는 이벤트 콜백 함수에 대해서는, FindClass 가 현재의 네이티브 메소드에 관련짓고 된 클래스 로더를 찾아내는 것에 주의할 필요가 있습니다. 클래스의 로드를 목적으로 하는 경우, 콜백에의 파라미터로서 JNI 환경을 포함한 이벤트 콜백은, 그것이 네이티브 호출인것 같이 다루어집니다. 이 경우, 그 네이티브 메소드는 이벤트 thread의 현재의 프레임의 클래스내에 존재합니다.

 

JVM TI 이벤트안에는, JNI 참조를 사용해 객체를 식별하는 것이 있습니다. JVM TI 이벤트내의 모든 참조는, JNI 로컬 참조로, 이벤트 콜백 함수로부터 복귀하면(자) 무효가 됩니다. 기술되어 있지 않은 경우, 이벤트 콜백내에서 송신된 포인터에 의해 참조되는 메모리는, 이벤트 콜백의 종료후는 참조할 수 없습니다.

 

기술되어 있지 않은 경우, 이벤트는, 그 이벤트를 일으킨 thread에 전달됩니다. 이벤트는, 발생과 동시에 송신됩니다. 각 이벤트의 스펙에는, 이 이벤트를 송신할 수 있을단계에 대한 기술이 포함되어 있습니다. 이벤트를 송신할 수 있을 단계 이외의 단계에서 이벤트를 트리거해도, 이벤트는 송신되지 않습니다.

 

이벤트의 실행 상태가, 이벤트의 생성원thread에 의해 변경될 것은 없습니다. 예를 들어, thread가 이벤트에 의해 중단될 것은 없습니다. 이벤트를 중단시킬 필요가 있는 에이전트는,SuspendThread 를 사용해 명시적으로 thread를 중단시키지 않으면 안됩니다.

 

복수의 환경에서 유효하게 되어 있는 이벤트는, 이러한 환경이 작성된 순서에, 각 에이전트에 송신됩니다.

이벤트의 유효화

모든 이벤트는, 초기 단계에서는 무효가 되어 있습니다. 이벤트를 수신하려면 , 다음과 같이 합니다.

  • 이벤트가 권한을 필요로 하는 경우,AddCapabilities 을 사용해 그 권한을 추가할 필요가 있다.
  • SetEventCallbacks 를 사용해, 이벤트의 콜백을 설정할 필요가 있다.
  • SetEventNotificationMode 를 사용해, 이벤트를 유효하게 할 필요가 있다.

같은 위치에서 발생하는 복수의 이벤트

많은 상황으로, 1 개의 thread내의 같은 위치에서 복수의 이벤트가 발생할 가능성이 있습니다. 그러한 상황에서는, 이 마디로 설명하는 순서로, 이벤트 콜백에 의해 모든 이벤트가 리포트됩니다.

 

현재 위치가 메소드의 엔트리 포인트인 경우는, 동일 thread내의 현재 위치에서 발생한 것 외의 모든 이벤트보다 전에,MethodEntry 이벤트가 리포트됩니다.

 

현재 위치에서 예외의 캐치가 검출되었을 경우 (catch 절의 선두의 경우인가, 미처리의 예외를 해제한 네이티브 메소드가 복귀한 위치의 경우)는, 동일 thread내의 현재 위치에서 발생한 것 외의 모든 이벤트보다 전에,exceptionCatch 이벤트가 리포트됩니다.

 

singleStep 이벤트 또는 breakpoint 이벤트가 현재 위치에서 트리거되는 경우, 그 이벤트는, 현재 위치의 코드가 실행되기 직전에 발생하는 것이라고 정의되고 있습니다. 이러한 이벤트는, 동일 thread내의 현재 위치에 있는 코드의 실행에 의해 트리거되는 어느 이벤트 (특히,exception,fieldAccess, 및 fieldModification)보다 전에 리포트됩니다. 스텝 이벤트와 breakpoint 이벤트의 양쪽 모두가 동일한 thread 및 장소에서 트리거되었을 경우는, 스텝 이벤트가 breakpoint 이벤트보다 전에 리포트됩니다.

 

현재 위치가 메소드의 종료 포인트 (즉, 호출 측에 복귀하기 전의 마지막 위치)인 경우,MethodExit 이벤트 및 FramePop 이벤트 (요구되고 있는 경우)는, 동일 thread내의 현재 위치에서 발생하는 것 외의 모든 이벤트의 후에 리포트됩니다. 이것들 2 개의 이벤트에 대해서는, 리포트되는 순서는 특히 지정되고 있지 않습니다.

 

같은 위치에서 발생하는 이벤트는, 같은 thread내의 같은 위치에서의 에이전트에 의한 처리중에 트리거되는 일이 있습니다. 그 종의 이벤트 (타입 y)가, 타입 x 의 이벤트의 처리중에 트리거되었다고 합시다. 전술의 설명에 있는 순서에 의하면 xy 보다 전에 리포트된다고 하는 경우는, 같은 위치에서 발생한 이벤트 y 가, 현재의 thread 및 위치에 도착해 리포트됩니다. 반대로,xy 보다 전에 리포트되지 않는다고 하는 경우는, 이벤트 y 는, 현재의 thread 및 위치에 도착해 리포트되지 않습니다. 예를 들어,SingleStep 의 처리중에 현재 위치에 breakpoint가 설정되었을 경우는, thread가 현재 위치를 떠나기 전에, 그 breakpoint가 리포트됩니다.

 

이하의 이벤트는, 다른 이벤트와 같은 위치에서 발생했다고 보이는 일이 없습니다.

이벤트 콜백

이하의 이벤트 콜백 구조체에서는, 이벤트의 핸들러 함수를 지정할 수 있습니다. 이것은,SetEventCallbacks 함수로 설정됩니다.

typedef struct {
    jvmtiEventVMInit VMInit;
    jvmtiEventVMDeath VMDeath;
    jvmtiEventThreadStart ThreadStart;
    jvmtiEventThreadEnd ThreadEnd;
    jvmtiEventClassFileLoadHook ClassFileLoadHook;
    jvmtiEventClassLoad ClassLoad;
    jvmtiEventClassPrepare ClassPrepare;
    jvmtiEventVMStart VMStart;
    jvmtiEventException Exception;
    jvmtiEventExceptionCatch ExceptionCatch;
    jvmtiEventSingleStep SingleStep;
    jvmtiEventFramePop FramePop;
    jvmtiEventBreakpoint Breakpoint;
    jvmtiEventFieldAccess FieldAccess;
    jvmtiEventFieldModification FieldModification;
    jvmtiEventMethodEntry MethodEntry;
    jvmtiEventMethodExit MethodExit;
    jvmtiEventNativeMethodBind NativeMethodBind;
    jvmtiEventCompiledMethodLoad CompiledMethodLoad;
    jvmtiEventCompiledMethodUnload CompiledMethodUnload;
    jvmtiEventDynamicCodeGenerated DynamicCodeGenerated;
    jvmtiEventDataDumpRequest DataDumpRequest;
    jvmtiEventReserved reserved72;
    jvmtiEventMonitorWait MonitorWait;
    jvmtiEventMonitorWaited MonitorWaited;
    jvmtiEventMonitorContendedEnter MonitorContendedEnter;
    jvmtiEventMonitorContendedEntered MonitorContendedEntered;
    jvmtiEventReserved reserved77;
    jvmtiEventReserved reserved78;
    jvmtiEventReserved reserved79;
    jvmtiEventResourceExhausted ResourceExhausted;
    jvmtiEventGarbageCollectionStart GarbageCollectionStart;
    jvmtiEventGarbageCollectionFinish GarbageCollectionFinish;
    jvmtiEventObjectFree ObjectFree;
    jvmtiEventVMObjectAlloc VMObjectAlloc;
} jvmtiEventCallbacks;

 


이벤트의 색인

 


스텝 실행

 

void JNICALL
SingleStep(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location)

스텝 실행 이벤트를 이용하면(자), 에이전트는, VM 로 가능한 최소의 단위로 thread의 실행을 추적할 수 있습니다. 스텝 실행 이벤트는, thread가 새로운 위치에 이를 때마다 생성됩니다. 일반적으로, 스텝 실행 이벤트는,「Java 가상 머신 스펙」에 정의되고 있도록(듯이),1 개의 VM 명령이 완료한 것을 나타냅니다. 다만, 위치의 정의가 다른 구현도 있습니다. 어쨌든,methodlocation 파라미터에 의해 현재의 위치를 일의에 식별할 수 있기 (위해)때문에, 이 정보가 있으면 원시 파일과 행 번호에의 매핑이 가능합니다.

 

네이티브 메소드내로부터는, 스텝 실행 이벤트는 생성되지 않습니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
라이브 단계에서 밖에 송신되지 않는다 JVMTI_EVENT_SINGLE_STEP 60 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_SINGLE_STEP, NULL) 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다
권한 효과
can_generate_single_step_events 스텝 실행 이벤트를 취득할 수 있다

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경
thread jthread 새로운 명령을 실행하려고 하고 있는 thread
method jmethodID 새로운 명령을 실행하려고 하고 있는 메소드
location jlocation 새로운 명령의 위치

 


breakpoint

 

void JNICALL
Breakpoint(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location)

breakpoint 이벤트는,SetBreakpoint 를 사용해 breakpoint로서 지정된 위치에 thread가 달한 시점에서 생성됩니다. methodlocation 파라미터에 의해 현재의 위치를 일의에 식별할 수 있기 (위해)때문에, 이 정보가 있으면 원시 파일과 행 번호에의 매핑이 가능합니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
라이브 단계에서 밖에 송신되지 않는다 JVMTI_EVENT_BREAKPOINT 62 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_BREAKPOINT, NULL) 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_breakpoint_events Breakpoint 이벤트를설정해, 취득할 수가 있다.

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경
thread jthread breakpoint에 이른 thread
method jmethodID breakpoint에 이른 메소드
location jlocation breakpoint의 위치

 


필드 액세스

 

void JNICALL
FieldAccess(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location,
            jclass field_klass,
            jobject object,
            jfieldID field)

필드 액세스 이벤트는,SetFieldAccessWatch 를 사용해 시계 포인트로서 지정된 필드에 thread가 액세스 한 시점에서 생성됩니다. methodlocation 파라미터에 의해 현재의 위치를 일의에 식별할 수 있기 (위해)때문에, 이 정보가 있으면 원시 파일과 행 번호에의 매핑이 가능합니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
라이브 단계에서 밖에 송신되지 않는다 JVMTI_EVENT_FIELD_ACCESS 63 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_FIELD_ACCESS, NULL) 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_field_access_events 필드 액세스에 시계 포인트를 설정할 수 있는 - SetFieldAccessWatch

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경
thread jthread 필드에 액세스 하는 thread
method jmethodID 액세스가 발생하고 있는 메소드
location jlocation 액세스가 발생하고 있는 위치
field_klass jclass 액세스 되는 필드의 클래스
object jobject 필드가 인스턴스 필드의 경우는 액세스 되고 있는 필드를 가지는 객체, 그 이외의 경우는 NULL
field jfieldID 액세스 되고 있는 필드

 


필드의 변경

 

void JNICALL
FieldModification(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location,
            jclass field_klass,
            jobject object,
            jfieldID field,
            char signature_type,
            jvalue new_value)

필드의 변경 이벤트는,SetFieldModificationWatch 를 사용해 시계 포인트로서 지정된 필드를 thread가 변경한 시점에서 생성됩니다. methodlocation 파라미터에 의해 현재의 위치를 일의에 식별할 수 있기 (위해)때문에, 이 정보가 있으면 원시 파일과 행 번호에의 매핑이 가능합니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
라이브 단계에서 밖에 송신되지 않는다 JVMTI_EVENT_FIELD_MODIFICATION 64 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_FIELD_MODIFICATION, NULL) 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_field_modification_events 필드의 변경에 시계 포인트를 설정할 수 있는 - SetFieldModificationWatch

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경
thread jthread 필드를 변경하는 thread
method jmethodID 변경이 발생하고 있는 메소드
location jlocation 변경이 발생하고 있는 위치
field_klass jclass 변경되고 있는 필드의 클래스
object jobject 필드가 인스턴스 필드의 경우는 변경되고 있는 필드를 가지는 객체, 그 이외의 경우는 NULL
field jfieldID 변경되고 있는 필드
signature_type char 새로운 값의 시그니챠의 형태
new_value jvalue 새로운 값

 


프레임의 팝

 

void JNICALL
FramePop(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jboolean was_popped_by_exception)

프레임 팝 이벤트는,NotifyFramePop 의 호출로 지정된 단일의 프레임내의 단일의 메소드로부터 나오는 시점에서 생성됩니다 이것은, 귀가 명령의 실행에 의해 종료되었는지, 호출측에게로의 예외의 throw에 의해 종료되었을 경우, true 가 됩니다 (was_popped_by_exception 를 참조). 다만,PopFrame 함수에 의한 프레임의 팝은 리포트되지 않습니다.

 

GetFrameLocation 에 의해 리포트되는 위치는, 복귀하려고 하고 있는 메소드내의 복귀 직전의 실행 가능 위치를 식별합니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
라이브 단계에서 밖에 송신되지 않는다 JVMTI_EVENT_FRAME_POP 61 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_FRAME_POP, NULL) 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_frame_pop_events FramePop 이벤트를설정해, 취득할 수가 있다

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경
thread jthread 프레임을 팝 하는 thread
method jmethodID 팝 되는 메소드
was_popped_by_exception jboolean 프레임이 예외의 throw에 의해 팝 되었을 경우는 true. 메소드가 돌아와 명령에 의해 종료했을 경우는 false.

 


메소드 엔트리

 

void JNICALL
MethodEntry(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method)

메소드 엔트리 이벤트는, Java 프로그램 언어 메소드 (네이티브 메소드를 포함한다)에 들어가는 시점에서 생성됩니다.

 

GetFrameLocation 에 의해 리포트되는 위치는, 메소드내의 초기 실행 가능 위치를 식별합니다.

 

많은 플랫폼에서는, 메소드 엔트리 이벤트 또는 메소드 종료 이벤트를 유효하게 하면(자), 퍼포먼스가 큰폭으로 저하합니다. 따라서, 프로 파일링 등, 퍼포먼스를 중시하는 처리에서의 사용은 추천하지 않습니다. 이러한 경우에는,바이트코드Instrumentation을 사용해야 합니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
라이브 단계에서 밖에 송신되지 않는다 JVMTI_EVENT_METHOD_ENTRY 65 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_METHOD_ENTRY, NULL) 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_method_entry_events 메소드의 입력시에 메소드 입력 이벤트를 생성할 수 있다

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경
thread jthread 메소드를 입력하는 thread
method jmethodID 입력되는 메소드

 


메소드 종료

 

void JNICALL
MethodExit(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jboolean was_popped_by_exception,
            jvalue return_value)

메소드 종료 이벤트는, Java 프로그램 언어 메소드 및 네이티브 메소드로부터 종료하는 시점에서 생성됩니다. 이것은, 귀가 명령의 실행에 의해 종료되었는지, 호출측에게로의 예외의 throw에 의해 종료되었을 경우, true 가 됩니다 (was_popped_by_exception 를 참조).

 

method 필드는, 들어가는 메소드 또는 나오는 메소드를 일의에 식별합니다. frame 필드는, 메소드의 스택 프레임에의 액세스를 제공합니다.

 

GetFrameLocation 에 의해 리포트되는 위치는, 복귀하려고 하고 있는 메소드내의 복귀 직전의 실행 가능 위치를 식별합니다.

 

많은 플랫폼에서는, 메소드 엔트리 이벤트 또는 메소드 종료 이벤트를 유효하게 하면(자), 퍼포먼스가 큰폭으로 저하합니다. 따라서, 프로 파일링 등, 퍼포먼스를 중시하는 처리에서의 사용은 추천하지 않습니다. 이러한 경우에는,바이트코드Instrumentation을 사용해야 합니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
라이브 단계에서 밖에 송신되지 않는다 JVMTI_EVENT_METHOD_EXIT 66 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_METHOD_EXIT, NULL) 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_method_exit_events 메소드의 종료시에 메소드 종료 이벤트를 생성할 수 있다

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경
thread jthread 메소드를 종료하는 thread
method jmethodID 종료되는 메소드
was_popped_by_exception jboolean 프레임이 예외의 throw에 의해 팝 되었을 경우는 true. 메소드가 돌아와 명령에 의해 종료했을 경우는 false.
return_value jvalue 종료되는 메소드의 반환값. was_popped_by_exception 가 true 의 경우, 미정도리로, 사용 해서는 안된다.

 


네이티브 메소드의 바인드

 

void JNICALL
NativeMethodBind(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            void* address,
            void** new_address_ptr)

네이티브메소드바인드이벤트는, VM 가 Java 프로그램 언어의 네이티브 메소드를, 이 네이티브 메소드를 구현하는 함수의 주소에 바인드 한 시점에서 송신됩니다. 이 처리는, 네이티브 메소드가 처음 불려 갔을 때와 JNI 함수 RegisterNatives 가 불려 갔을 때에 발생합니다. 이 이벤트에 의해, 바인드를 에이전트 고유의 프록시 함수에 리다이렉트(redirect) 할 수가 있습니다. 이 이벤트는, 네이티브 메소드가 바인드 해제되고 있을 때는 송신할 수 없습니다. 일반적으로, 이 프록시 함수는, 특정의 메소드에 고유하지 않으면 안됩니다. 또는 일반적인 케이스를 취급하는 경우는, 자동적으로 생성된 어셈블리 코드가 아니면 안됩니다. 일반적으로, 명령 코드의 실행 후는, 원의 바인딩 주소의 함수가 불려 갑니다. 원의 바인딩은 복원 가능합니다. 또, 리다이렉트(redirect)는, JNI 함수 RegisterNatives 의 사용에 의해 변경됩니다. 초기 단계안에 일부의 이벤트는 송신되는 경우가 있습니다. JNI 및 대부분의 JVM TI 는 이 시점에서 사용할 수가 없습니다만, 메소드 및 주소는 보존해 나중에 사용할 수 있겠습니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
초기 단계, 개시 단계, 및 라이브 단계에서 송신된다 JVMTI_EVENT_NATIVE_METHOD_BIND 67 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_NATIVE_METHOD_BIND, NULL) 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_native_method_bind_events 네이티브 메소드가 구현에 바인드 되고 있을 때 이벤트를 생성할 수 있다

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경은, 초기단계안에 송신되면(자) NULL 가 된다.
thread jthread 바인드를 요구하는 thread
method jmethodID 바인드 되는 네이티브 메소드
address void * VM 의 바인드처의 주소 (네이티브 메소드의 구현 주소)
new_address_ptr void** 참조 주소가 변경되었을 경우 (즉,*new_address_ptr 가 설정되었을 경우), 대신에, 제공된 주소에의 바인드를 한다.

 


예외

 

void JNICALL
Exception(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location,
            jobject exception,
            jmethodID catch_method,
            jlocation catch_location)

예외 이벤트는, Java 프로그램 언어 메소드내에서 예외가 최초로 검출된 시점에서 생성됩니다. 여기서, 「예외」는 임의의 java.lang.Throwable 를 의미합니다. 예외는, Java 프로그램 언어 메소드에 의해 throw 되는 경우와 네이티브 메소드에 의해 throw 되는 경우가 있습니다. 네이티브 메소드에 의해 throw 되는 경우는, 그 예외가 Java 프로그램 언어 메소드에 의해 최초로 인식될 때까지, 이 이벤트는 생성되지 않습니다. 예외가 네이티브 메소드내에서 생성되어 해제되었을 경우 (즉, Java 프로그램 언어 코드로부터는 인식되지 않는 경우)는, 예외 이벤트는 생성되지 않습니다.

 

methodlocation 파라미터에 의해 현재의 위치 (예외가 검출된 위치)를 일의에 식별할 수 있기 (위해)때문에, 이 정보가 있으면 원시 파일과 행 번호에의 매핑이 가능합니다. exception 필드는, throw 된 예외 객체를 인식합니다. catch_methodcatch_location 는, throw 된 예외를 처리하는 catch 절의 위치를 식별합니다 (그러한 마디가 존재하는 경우). 그러한 catch 절이 없는 경우, 그러한 각 필드는 0 으로 설정됩니다. thread가 이 catch 절에 도달한다고 하는 보증은 없습니다. 호출 스택상에서 예외 throw의 위치와 catch 절의 사이에 네이티브 메소드가 있는 경우, 그러한 네이티브 메소드의 어느 쪽인가에 따라 예외가 리셋 될 가능성이 있기 때문입니다. 같이 캐치 되지 않으면 리포트된 예외 (catch_klass 등. 0 으로 설정)은, 실제로는 native code에 의해 캐치 됩니다. 에이전트는, 이러한 발생을,ExceptionCatch 이벤트를 감시하는 것에 의해 체크합니다. finally 절은, 캐치/재throw로서 구현되는 점에 주의해 주세요. 이 때문에, 이것들은 캐치의 위치에서 리포트됩니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
라이브 단계에서 밖에 송신되지 않는다 JVMTI_EVENT_EXCEPTION 58 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_EXCEPTION, NULL) 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_exception_events throw 된 예외예외 캐치 이벤트를 취득할 수 있다

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경
thread jthread 예외를 생성하는 thread
method jmethodID 예외를 생성하는 메소드
location jlocation 예외가 발생한 위치
exception jobject throw 되는 예외
catch_method jmethodID 예외를 캐치 하는 메소드. 기존의 캐치가 없는 경우는 NULL
catch_location jlocation 예외를 캐치 하는 메소드. 기존의 캐치가 없는 경우는 제로

 


예외 캐치

 

void JNICALL
ExceptionCatch(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jmethodID method,
            jlocation location,
            jobject exception)

예외 캐치 이벤트는, throw 된 예외가 캐치 된 시점에서 생성됩니다. 여기서, 「예외」는 임의의 java.lang.Throwable 를 의미합니다. 예외가 Java 프로그램 언어 메소드내에서 캐치 되었을 경우는, catch 절에 도달한 시점에서 이 이벤트가 생성됩니다. 예외가 네이티브 메소드내에서 캐치 되었을 경우는, Java 프로그램 언어 메소드에 제어가 돌아온 직후에 이 이벤트가 생성됩니다. 예외 캐치 이벤트는, Java 프로그램 언어 메소드내에서 throw가 검출된 예외에 대해서 생성됩니다. finally 절은, 캐치/재throw로서 구현되는 점에 주의해 주세요. 이 때문에, 이것들은 예외 캐치 이벤트를 생성합니다.

 

methodlocation 파라미터에 의해 현재의 위치를 일의에 식별할 수 있기 (위해)때문에, 이 정보가 있으면 원시 파일과 행 번호에의 매핑이 가능합니다. Java 프로그램 언어 메소드내에서 캐치 된 예외의 경우는,exception 객체가 예외 객체를 식별합니다. 네이티브 메소드내에서 캐치 된 예외는, 예외의 캐치가 리포트된 시점에서 입수 가능하다고는 할 수 없기 때문에,exception 필드는 NULL 로 설정됩니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
라이브 단계에서 밖에 송신되지 않는다 JVMTI_EVENT_EXCEPTION_CATCH 59 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_EXCEPTION_CATCH, NULL) 1.0

 

권한
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다.
권한 효과
can_generate_exception_events throw 된 예외예외 캐치 이벤트를 취득할 수 있다

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경
thread jthread 예외를 캐치 하는 thread
method jmethodID 예외를 캐치 하는 메소드
location jlocation 예외가 캐치 되는 위치
exception jobject 캐치 되는 예외

 


thread의 개시

 

void JNICALL
ThreadStart(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread)

thread 개시 이벤트는, 새로운 thread에 의해, thread의 초기 메소드가 실행되기 전에, 생성됩니다.

 

thread 개시 이벤트가 생성되기 전에,GetAllThreads 에 의해 반환되는 배열에, 그 thread가 포함되어 있을 가능성이 있습니다. 또, thread 개시 이벤트의 전에, 그 외의 이벤트가 thread상에 생성될 가능성이 있습니다.

 

이벤트는 새롭게 개시된 thread 에 송신됩니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
개시 단계와 라이브 단계에서 송신된다 JVMTI_EVENT_THREAD_START 52 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_THREAD_START, NULL) 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경
thread jthread 개시하는 thread

 


thread의 종료

 

void JNICALL
ThreadEnd(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread)

thread 종료 이벤트는, 정지하려고 하고 있는 thread에 의해, thread의 초기 메소드의 실행 완료 후에, 생성됩니다.

 

thread 종료 이벤트가 생성된 뒤,GetAllThreads 에 의해 반환되는 배열에, 그 thread가 포함되어 있을 가능성이 있습니다. thread 종료 이벤트의 뒤, thread상에 이벤트는 생성되지 않습니다.

 

이벤트는 종료하는 thread 에 송신됩니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
개시 단계와 라이브 단계에서 송신된다 JVMTI_EVENT_THREAD_END 53 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_THREAD_END, NULL) 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경
thread jthread 종료하는 thread

 


클래스의 로드

 

void JNICALL
ClassLoad(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jclass klass)

클래스 로드 이벤트는, 클래스가 최초로 로드 된 시점에서 생성됩니다. 특정의 thread에 의해 클래스 로드 이벤트가 생성되는 순서는, 그 thread내에서 클래스가 로드 되는 순서와 일치하는 것이 보증되고 있습니다. 배열 클래스의 작성에서는, 클래스 로드 이벤트는 생성되지 않습니다. 프리미티브(primitive) 클래스 (java.lang.Integer.TYPE 등)의 작성에서는, 클래스 로드 이벤트는 생성되지 않습니다.

 

이 이벤트는, 클래스의 로드의 빠른 단계에서 송신됩니다. 이 때문에, 클래스는 신중하게 사용할 필요가 있습니다. 예를 들어, 메소드나 필드가 아직 로드 되지 않고, 메소드, 필드, 서브 클래스가 조회되어 있지 않은 경우, 올바른 결과는 얻을 수 있지 않습니다. 「Java 언어 스펙」의 「Loading of Classes and Interfaces」를 참조해 주세요. 대부분의 경우,ClassPrepare 가 유효합니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
개시 단계와 라이브 단계에서 송신된다 JVMTI_EVENT_CLASS_LOAD 55 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_CLASS_LOAD, NULL) 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경
thread jthread 클래스를 로드하는 thread
klass jclass 로드 되는 클래스

 


클래스의 준비

 

void JNICALL
ClassPrepare(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread,
            jclass klass)

클래스 준비 이벤트는, 클래스의 준비가 완료한 시점에서 생성됩니다. 이 시점에서는, 클래스의 필드, 메소드, 및 구현된 인터페이스가 이용 가능합니다만, 클래스의 코드는 아직 아무것도 실행되고 있지 않습니다. 배열 클래스는, 필드나 메소드를 가지는 것이 없기 때문에, 배열 클래스에 도착해 클래스 준비 이벤트가 생성될 것은 없습니다. 프리미티브(primitive) 클래스 (예를 들어,java.lang.Integer.TYPE)에 대해서도, 클래스 준비 이벤트는 생성되지 않습니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
개시 단계와 라이브 단계에서 송신된다 JVMTI_EVENT_CLASS_PREPARE 56 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_CLASS_PREPARE, NULL) 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경
thread jthread 클래스 준비 이벤트를 생성하는 thread
klass jclass 준비되는 클래스

 


클래스 파일 로드 훅

 

void JNICALL
ClassFileLoadHook(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jclass class_being_redefined,
            jobject loader,
            const char* name,
            jobject protection_domain,
            jint class_data_len,
            const unsigned char* class_data,
            jint* new_class_data_len,
            unsigned char** new_class_data)

이 이벤트는, VM 가 클래스 파일 데이터를 취득했을 때, 그 클래스의 메모리 내부 표현을 구축하기 전의 시점에서 송신됩니다. 또, 이 이벤트는, 임의의 JVM TI 환경내로부터 불려 간 RetransformClasses 함수 또는 RedefineClasses 함수에 의해 클래스가 변경 되려고 하고 있을 때도 송신됩니다. 에이전트는, VM 에 의해 송신된 기존의 클래스 파일 데이터에, 프로 파일링/디버그 훅을 계측 할 수가 있습니다. 사용 방법에 대해서는,바이트코드Instrumentation의 설명을 참조해 주세요.

 

이 이벤트는, VM 의 초기화전 (초기단계)에 송신될 가능성이 있습니다. 이 시점에서는, VM 자원은 작성되지 않습니다. 함수 (예를 들어 ROMized classes)와의 호환성이 없는 클래스에 대해서는, 이 이벤트는 생성되지 않습니다.

 

에이전트는, 메모리 할당 함수 Allocate 를 사용해, 수정한 클래스 파일 데이터의 버퍼용의 영역을 할당할 필요가 있습니다. 새로운 클래스 파일 데이터의 버퍼를 해제하는 처리는, VM 에 의해,Deallocate 를 사용해 실행되기 때문입니다. Allocate 는 초기 단계안에 허가됩니다.

 

에이전트는, 클래스 파일을 변경하는 경우, 새롭게 구현된 클래스 파일 데이터 버퍼를 포인트 하도록(듯이) new_class_data 를 설정해, 이 호출로부터 돌아오기 전에,new_class_data_len 에 그 버퍼의 길이를 설정할 필요가 있습니다. 변경이 불필요한 경우, 에이전트는 new_class_data 를 설정하지 않습니다. 복수의 에이전트가 이 이벤트를 유효하게 하고 있는 경우, 결과는 체인이 됩니다. 즉,new_class_data 가 설정되어 있는 경우는, 이것이 다음의 에이전트의 class_data 가 됩니다.

 

이 이벤트가 각 환경에 송신되는 차례는, 다른 이벤트의 경우와는 다릅니다. 이 이벤트는 다음의 차례로 환경에 송신됩니다.

이 이벤트가 RetransformClasses 에 의해 기동되었을 경우,재변환 가능한 환경에만 이 이벤트가 송신됩니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
초기 단계, 개시 단계, 및 라이브 단계에서 송신된다 JVMTI_EVENT_CLASS_FILE_LOAD_HOOK 54 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_CLASS_FILE_LOAD_HOOK, NULL) 1.0

 

권한
필요한 기능
임의의 기능
권한 효과
can_generate_all_class_hook_events 로드 된 모든 클래스에 대해서, ClassFileLoadHook 이벤트를 생성할 수 있다.

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경 초기단계안에 송신되었을 경우는 NULL 가 된다.
class_being_redefined jclass 재정의 또는재변환되는 클래스. 클래스의 로드에 의해 송신되었을 경우는 NULL.
loader jobject 클래스를 로드하는 클래스 로더. bootstrap 클래스 로더의 경우는 NULL.
name const char* VM 내부 수식명으로서 로드 되는 클래스명 ("java/util/List" 등). 수정 UTF-8 캐릭터 라인으로서 encode 된다. 주:클래스가 이름 NULL 로 정의되었는지 이름을 지정하지 않고 정의되었을 경우,nameNULL 가 된다.
protection_domain jobject 클래스의 ProtectionDomain.
class_data_len jint 현재의 클래스 파일 데이터의 버퍼의 길이.
class_data const unsigned char* 현재의 클래스 파일 데이터의 버퍼의 포인터.
new_class_data_len jint * 새로운 클래스 파일 데이터의 버퍼의 길이의 포인터.
new_class_data unsigned char** 구현이 끝난 클래스 파일 데이터의 버퍼의 포인터에의 포인터.

 


VM 개시 이벤트

 

void JNICALL
VMStart(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env)

VM 초기화 이벤트는, VM 의 개시를 나타냅니다. 이 시점에서 JNI 는 라이브입니다만, VM 는 아직 완전하게 초기화되고 있지 않습니다. 이 이벤트가 생성된 뒤는, 에이전트는 임의의 JNI 함수를 자유롭게 호출할 수가 있습니다. 이 이벤트는, 개시 단계의 개시를 나타냅니다. 개시 단계에서 허가된 JVM TI 함수를 호출할 수가 있습니다.

 

VM 의 기동에 실패했을 경우, 이 이벤트는 송신되지 않습니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
개시 단계와 라이브 단계에서 송신된다 JVMTI_EVENT_VM_START 57 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_VM_START, NULL) 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경

 


VM 초기화 이벤트

 

void JNICALL
VMInit(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env,
            jthread thread)

VM 초기화 이벤트는, VM 의 초기화의 완료를 나타냅니다. 이 이벤트가 생성된 뒤는, 에이전트는 임의의 JNI 또는 JVM TI 함수를 자유롭게 호출할 수가 있습니다. VM 초기화 이벤트는, 그 전에 다른 이벤트가 생성되거나 다른 이벤트와 동시에 생성 되거나 하는 일이 있습니다. 그 중에서 VM 초기화 이벤트의 전의 생성되는 이벤트에 대해서는, VM 의 초기화가 아직 완료하고 있지 않았기 때문에, 특별히 주의해 처리할 필요가 있습니다. 메인 어플리케이션 thread의 thread 개시 이벤트는, VM 초기화 이벤트의 핸들러가 복귀할 때까지는 발생하지 않는 것이 보증되고 있습니다.

 

VM 의 기동에 실패했을 경우, 이 이벤트는 송신되지 않습니다.

 

단계 이벤트형 번호 유효화 도입된 버젼
라이브 단계에서 밖에 송신되지 않는다 JVMTI_EVENT_VM_INIT 50 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_VM_INIT, NULL) 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경
thread jthread 초기 thread

 


VM 종료 이벤트

 

void JNICALL
VMDeath(jvmtiEnv *jvmti_env,
            JNIEnv* jni_env)

VM 종료 이벤트는, VM 의 종료를 에이전트에 통지합니다. VMDeath 이벤트의 뒤는, 이벤트는 발생하지 않습니다.

 

VM 의 기동에 실패했을 경우, 이 이벤트는 송신되지 않습니다. 이러한 경우,Agent_OnUnload 는 불려 가는 점에 주의해 주세요.

 

단계 이벤트형 번호 유효화 도입된 버젼
라이브 단계에서 밖에 송신되지 않는다 JVMTI_EVENT_VM_DEATH 51 SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_VM_DEATH, NULL) 1.0

 

권한
필요한 기능

 

파라미터
이름 설명
jni_env JNIEnv * 이벤트의 현재의 thread의 JNI 환경

 


컴파일이 끝난 메소드의 로드

 

typedef struct {
    const void* start_address;
    jlocation location;
} jvmtiAddrLocationMap;
void JNICALL
CompiledMethodLoad(jvmtiEnv *jvmti_env,
            jmethodID method,
            jint code_size,
            const void* code_addr,
            jint map_length,
            const jvmtiAddrLocationMap* map,
            const void* compile_info)

메소드가 VM 에 의해 컴파일 되어 메모리내에 로드 되는 시점에서 송신됩니다. 언로드되었을 경우,