출처: https://www.hunskorea.com/docs/ko/platform/jvmti/jvmti.html
JavaTM Virtual Machine Tool InterfaceVersion 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_OnLoad
의 char *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 인수의 것 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
는 아직 로드되어 있지 않기 때문에, 무한 회귀가 발생해 버려, 스택 오버플로우가 됩니다. 이것을 변경해, 안전한 타이밍이 될 때까지 트랙킹 메소드의 호출을 늦춥니다. 예를 들어 trackAllocations
를 VMInit
이벤트의 핸들러로 설정할 수가 있습니다.
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 가 지원되어 있지 않은 경우, 호환 버젼을 얻을 수 없으면GetEnv
는 JNI_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 참조 (jobject
와 jclass
)와 그 파생 (jthread
와 jthreadGroup
)에 의해 객체를 식별합니다. JVM TI 의 함수에게 건네지는 참조는, 글로벌에서도 로컬에서도 괜찮습니다가, 강한 참조가 아니면 안됩니다. JVM TI 함수로부터 반환되는 모든 참조는, 로컬 참조입니다. 이러한 로컬 참조는, JVM TI 의 호출시에 작성됩니다. 로컬 참조는, 관리 대상으로 해야 할 자원입니다 (JNI 의 메뉴얼을 참조). thread가 native code로부터 반환되는 경우, 모든 로컬 참조는 해제됩니다. 전형적인 에이전트 thread를 포함한 일부의 thread는, 결코 native code로부터는 돌려주어지지 않습니다. 각 thread는, 명시적 관리없이 16 개의 로컬 참조를 작성할 수가 있습니다. native code로부터 돌려주어지기 전에, 한정된 수의 JVM TI 호출을 실행하는 thread (이벤트 처리 thread등)의 경우, 명시적 관리는 불필요하다라고 판단됩니다. 그러나, 장시간 실행되는 에이전트 thread는, 명시적 로컬 참조 관리를 필요로 합니다. 일반적으로, 이 관리에는, JNI 함수 PushLocalFrame
와 PopLocalFrame
를 사용합니다. 반대로 말하면, native code로부터 반환된 뒤도 참조를 보존하는 경우는, 글로벌 참조로 변환할 필요가 있습니다. 이러한 규칙은 jmethodID
와 jfieldID
에는 적용되지 않습니다. 이것들은 jobject
는 아니기 때문입니다.
함수 호출의 필요 조건
함수에, thread 또는 VM 를 특정 상태 (중단등)로 하는 것은 에이전트이라고 명시적으로 지정되어 있지 않은 한, 함수를 실행하기 위해서 VM 를 일정한 안전한 상태로 하는 것은, JVM TI 구현이 됩니다.
예외와 함수
JVM TI 함수는 예외를 throw 하지 않습니다. 에러 상태의 전달은,함수의 반환값을 개입시켜 행해집니다. JVM TI 함수가 불려 가도, 그 전후로 기존의 예외 상태는 모두 보관 유지됩니다. 예외의 처리 방법에 대해서는, JNI 스펙의 「Java Exceptions」섹션을 참조해 주세요.
함수의 색인
- 메모리 관리
- thread
- thread 그룹
- 스택 프레임
- 조기 복귀의 강제
- heap
- heap (1.0)
- 국소 변수
- breakpoint
- 감시되는 필드
- 클래스
- 객체
- 필드
- 메소드
- raw 모니터
- JNI 함수의 차단
- 이벤트 관리
- 확장 기능 기구
- 권한
- 타이머
- 클래스 로더 검색
- 시스템 프로퍼티
- 전반
메모리 관리
메모리 관리 함수:
이러한 함수는, 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 |
할당하는 바이트수.
원리의 설명: |
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_ptr 가 NULL . |
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 에 배열을 건네준다. 배열의 요소의 값은 무시된다. 돌아왔을 때, 요소가 설정되어 있다. mem 가 NULL 의 경우, 호출이 무시된다. |
에러 | |
이 함수는,범용 에러를 돌려준다 |
thread
thread 함수:
- thread 상태의 취득
- 현재의 thread의 취득
- 모든 thread의 취득
- thread의 중단
- threaded list의 중단
- thread의 재개
- threaded list의 재개
- thread의 정지
- thread의 인터럽트
- thread 정보의 취득
- 소유 모니터 정보의 취득
- 소유 모니터의 스택의 깊이 정보의 취득
- 현재 경합 하고 있는 모니터의 취득
- 에이전트 thread의 실행
- thread 로컬인 기억 영역의 설정
- thread 로컬인 기억 영역의 취득
thread의 함수형:
thread의 형태:
jvmtiThreadInfo
- thread 정보 구조체jvmtiMonitorStackDepthInfo
- 모니터 스택의 깊이 정보 구조체
thread의 플래그 및 정수:
thread 상태의 취득
jvmtiError GetThreadState(jvmtiEnv* env, jthread thread, jint* thread_state_ptr)
thread 상태를 가져옵니다. thread 상태는, 이하의 일련의 질문에 답하는 것으로 압니다.
- 활동 상태인가
- 활동 상태는 아니다
- 왠지
- 신규이기 (위해)때문에
- 종료했기 때문에 (
JVMTI_THREAD_STATE_TERMINATED
)
- 왠지
- 활동 상태 (
JVMTI_THREAD_STATE_ALIVE
)- 중단했는지
- 중단했다 (
JVMTI_THREAD_STATE_SUSPENDED
) - 중단하고 있지 않다
- 중단했다 (
- 인터럽트인가
- 인터럽트 (
JVMTI_THREAD_STATE_INTERRUPTED
) - 인터럽트가 아니다
- 인터럽트 (
- native code내인가
- native code내 (
JVMTI_THREAD_STATE_IN_NATIVE
) - Java 프로그램 언어 코드내
- native code내 (
- 어느 활동 상태인가
- 실행 가능 상태 (
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
)
- 미정도리 (
- 대기 이유는
- Object.wait (
JVMTI_THREAD_STATE_IN_OBJECT_WAIT
) - LockSupport.park (
JVMTI_THREAD_STATE_PARKED
) - sleeve중 (
JVMTI_THREAD_STATE_SLEEPING
)
- Object.wait (
- 대기 시간은
- 실행 가능 상태 (
- 중단했는지
- 활동 상태는 아니다
대답은다음의 비트 벡터로 나타내집니다.
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_ALIVE
및 JVMTI_THREAD_STATE_WAITING
가 설정됩니다. 이하의 어느쪽이든 1 개(살) 이상은 설정할 수 없습니다.
JVMTI_THREAD_STATE_IN_OBJECT_WAIT
JVMTI_THREAD_STATE_PARKED
JVMTI_THREAD_STATE_SLEEPING
어느쪽이든가 설정되어 있는 경우, 괄호에 둘러싸인 회답 JVMTI_THREAD_STATE_ALIVE
및 JVMTI_THREAD_STATE_WAITING
가 설정됩니다. 또 JVMTI_THREAD_STATE_SLEEPING
가 설정되어 있는 경우는,JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT
가 설정됩니다. 상태 A 가 상태 B 의 기구를 사용해 구현되고 있는 경우, 이 함수로 반환되는 것은 상태 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_TERMINATED
는 JVMTI_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. thread 가 NULL 의 경우, 현재의 thread가 사용된다. |
thread_state_ptr |
jint * |
돌아왔을 때,thread 상태 플래그의 정의에 따라 상태 플래그를 포인트 한다.
에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_INVALID_THREAD |
thread 는 thread 객체는 아니다. |
JVMTI_ERROR_NULL_POINTER |
thread_state_ptr 가 NULL . |
현재의 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_ptr 가 NULL . |
모든 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_ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
threads__ptr 가 NULL . |
thread의 중단
jvmtiError SuspendThread(jvmtiEnv* env, jthread thread)
지정된 thread를 중단합니다. 호출측 thread가 지정되고 있는 경우, 이 함수는, 다른 thread가 ResumeThread
를 호출할 때까지 돌아오지 않습니다. thread가 현재 중단되고 있는 경우, 이 함수는 아무것도 실시하지 않고, 에러를 돌려줍니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 5 | 1.0 |
권한 | |
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다. |
|
권한 | 효과 |
can_suspend |
thread를 중단해, 재개할 수 있다. |
파라미터 | ||
이름 | 형 | 설명 |
thread |
jthread |
중단하는 thread. thread 가 NULL 의 경우, 현재의 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의 리스트.
에이전트는 jthread 의 request_count 요소의 배열을 건네준다. |
results |
jvmtiError * |
에이전트에 의해 제공된 request_count 요소의 배열. 돌아왔을 때, 대응하는 thread의 중단의 에러 코드가 들어가 있다. thread가 이 호출에 의해 중단했을 경우, 에러 코드는 JVMTI_ERROR_NONE . 그 외의 에러 코드는,SuspendThread 로 지정된 에러 코드.
에이전트는, jvmtiError 의 request_count 요소를 충분히 보관 유지할 수 있는 크기의 배열을 건네준다. 배열의 요소의 값은 무시된다. 돌아왔을 때, 요소가 설정되어 있다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
환경은 권한 can_suspend 를 가지지 않는다. AddCapabilities 를 사용한다. |
JVMTI_ERROR_ILLEGAL_ARGUMENT |
request_count 가 0 보다 작다. |
JVMTI_ERROR_NULL_POINTER |
request_list 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
results 가 NULL . |
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.
에이전트는 jthread 의 request_count 요소의 배열을 건네준다. |
results |
jvmtiError * |
에이전트에 의해 제공된 request_count 요소의 배열. 돌아왔을 때, 대응하는 thread의 재개의 에러 코드가 들어가 있다. thread가 이 호출에 의해 중단했을 경우, 에러 코드는 JVMTI_ERROR_NONE . 그 외의 에러 코드는,ResumeThread 로 지정된 에러 코드.
에이전트는, jvmtiError 의 request_count 요소를 충분히 보관 유지할 수 있는 크기의 배열을 건네준다. 배열의 요소의 값은 무시된다. 돌아왔을 때, 요소가 설정되어 있다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
환경은 권한 can_suspend 를 가지지 않는다. AddCapabilities 를 사용한다. |
JVMTI_ERROR_ILLEGAL_ARGUMENT |
request_count 가 0 보다 작다. |
JVMTI_ERROR_NULL_POINTER |
request_list 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
results 가 NULL . |
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. thread 가 NULL 의 경우, 현재의 thread가 사용된다. |
info_ptr |
jvmtiThreadInfo * |
돌아왔을 때, 지정된 thread에 대한 정보가 들어가 있다.
문맥 클래스 로더를 인식하지 않는 JDK 1.1 의 구현의 경우, context_class_loader 필드는 NULL.
에이전트는 jvmtiThreadInfo 에 포인터를 건네준다. 돌아왔을 때,jvmtiThreadInfo 가 설정되어 있다. jvmtiThreadInfo 의 name 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiThreadInfo 의 thread_group 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다. jvmtiThreadInfo 의 context_class_loader 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_INVALID_THREAD |
thread 는 thread 객체는 아니다. |
JVMTI_ERROR_NULL_POINTER |
info_ptr 가 NULL . |
소유 모니터 정보의 취득
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. thread 가 NULL 의 경우, 현재의 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_ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
owned_monitor_ptr 가 NULL . |
소유 모니터의 스택의 깊이 정보의 취득
typedef struct { jobject monitor; jint stack_depth; } jvmtiMonitorStackDepthInfo;jvmtiError GetOwnedMonitorStackDepthInfo(jvmtiEnv* env, jthread thread, jint* monitor_info_count_ptr, jvmtiMonitorStackDepthInfo** monitor_info_ptr)
지정된 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. thread 가 NULL 의 경우, 현재의 thread가 사용된다. |
monitor_info_count_ptr |
jint * |
반환되는 모니터의 수.
에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다. |
monitor_info_ptr |
jvmtiMonitorStackDepthInfo ** |
소유되는 모니터의 깊이 정보의 배열.
에이전트는 jvmtiMonitorStackDepthInfo* 에 포인터를 건네준다. 돌아왔을 때,jvmtiMonitorStackDepthInfo* 는, 사이즈 *owned_monitor_depth_count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiThreadGroupInfo 의 monitor 필드에 반환되는 객체는, 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_ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
monitor_info_ptr 가 NULL . |
현재 경합 하고 있는 모니터의 취득
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. thread 가 NULL 의 경우, 현재의 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_ptr 가 NULL . |
에이전트 기동 함수
에이전트에 의해 제공되는 콜백 함수. 이 함수는,typedef void (JNICALL *jvmtiStartFunction) (jvmtiEnv* jvmti_env, JNIEnv* jni_env, void* arg); RunAgentThread 로 개시되는 에이전트 thread의 엔트리 포인트가 됩니다.
|
에이전트 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 프로그램 언어의 쿼리에서는 표시됩니다만,GetAllThreads
나 GetAllStackTraces
등, JVM TI 의 쿼리에는 포함됩니다.
proc
의 실행시에, 새로운 thread는 VM 에 접속됩니다. JNI 의 메뉴얼의「Attaching to the VM」를 참조해 주세요.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 12 | 1.0 |
권한 | |
필요한 기능 |
파라미터 | ||
이름 | 형 | 설명 |
thread |
jthread |
실행하는 thread. |
proc |
jvmtiStartFunction |
기동 함수
|
arg |
const void * |
기동 함수의 인수.
에이전트가 포인터를 건네준다. arg 가 NULL 의 경우, 기동 함수에 NULL 가 건네받는다. |
priority |
jint |
개시되는 thread의 우선 순위. java.lang.Thread.setPriority 로 허가되고 있는 thread 우선 순위를 사용할 수 있다 (jvmtiThreadPriority 의 우선 순위를 포함한다). |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_INVALID_PRIORITY |
priority 가 JVMTI_THREAD_MIN_PRIORITY 보다 낮은가 JVMTI_THREAD_MAX_PRIORITY 보다 높다. |
JVMTI_ERROR_INVALID_THREAD |
thread 는 thread 객체는 아니다. |
JVMTI_ERROR_NULL_POINTER |
proc 가 NULL . |
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를 포함한다. thread 가 NULL 의 경우, 현재의 thread가 사용된다. |
data |
const void * |
thread 로컬인 기억 영역에 입력하는 값.
에이전트가 포인터를 건네준다. data 가 NULL 의 경우, 값은 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로부터 취득한다. thread 가 NULL 의 경우, 현재의 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_ptr 가 NULL . |
thread 그룹
thread 그룹 함수:
thread 그룹의 형태:
jvmtiThreadGroupInfo
- 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_ptr 이 NULL . |
JVMTI_ERROR_NULL_POINTER |
groups_ptr 가 NULL . |
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 가 설정되어 있다. jvmtiThreadGroupInfo 의 parent 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다. jvmtiThreadGroupInfo 의 name 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_INVALID_THREAD_GROUP |
group 는 thread 그룹 객체는 아니다. |
JVMTI_ERROR_NULL_POINTER |
info_ptr 가 NULL . |
아이 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_ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
threads__ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
group_count_ptr 이 NULL . |
JVMTI_ERROR_NULL_POINTER |
groups_ptr 가 NULL . |
스택 프레임
스택 프레임 함수:
스택 프레임의 형태:
jvmtiFrameInfo
- 스택 프레임 정보 구조체jvmtiStackInfo
- 스택 정보 구조체
이러한 함수는, 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의 스택 트레이스를 페치 한다. thread 가 NULL 의 경우, 현재의 thread가 사용된다. |
start_depth |
jint |
이 깊이로 프레임의 취득을 개시한다. 부의 수가 아닌 경우, 현재의 프레임으로부터 카운트 한다. 깊이가 start_depth 의 프레임이 최초로 취득된다. 예를 들어, 0 의 경우, 현재의 프레임으로부터 개시한다. 1 의 경우, 현재의 프레임의 호출측으로부터 개시한다. 2 의 경우, 현재의 프레임의 호출측의 호출측으로부터 개시한다. 부의 수의 경우, 제일 낡은 프레임아래로부터 카운트 한다. 깊이가 stackDepth+ start_depth (stackDepth 는 스택상의 프레임의 카운트)의 프레임이 최초로 취득된다. 예를 들어,-1 의 경우, 제일 낡은 프레임만이 취득된다. -2 의 경우, 제일 낡은 프레임에 의해 불려 간 프레임으로부터 개시한다. |
max_frame_count |
jint |
취득하는 jvmtiFrameInfo 레코드의 최대수. |
frame_buffer |
jvmtiFrameInfo * |
돌아왔을 때, 이 에이전트에 의해 할당할 수 있었던 버퍼에, 스택 프레임 정보가 들어가 있다.
에이전트는, jvmtiFrameInfo 의 max_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_count 가 0 보다 작다. |
JVMTI_ERROR_NULL_POINTER |
frame_buffer 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
count_ptr 가 NULL . |
모든 스택 트레이스의 취득
jvmtiError GetAllStackTraces(jvmtiEnv* env, jint max_frame_count, jvmtiStackInfo** stack_info_ptr, jint* thread_count_ptr)
모든 라이브 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 를 사용해 해제할 필요가 있다. jvmtiStackInfo 의 thread 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다. |
thread_count_ptr |
jint * |
트레이스 된 thread의 수.
에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_ILLEGAL_ARGUMENT |
max_frame_count 가 0 보다 작다. |
JVMTI_ERROR_NULL_POINTER |
stack_info_ptr 이 NULL . |
JVMTI_ERROR_NULL_POINTER |
thread_count_ptr 가 NULL . |
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의 리스트.
에이전트는 jthread 의 thread_count 요소의 배열을 건네준다. |
max_frame_count |
jint |
thread 마다 취득하는 jvmtiFrameInfo 레코드의 최대수. |
stack_info_ptr |
jvmtiStackInfo ** |
돌아왔을 때에, 이 버퍼에 각 thread의 스택 정보가 들어가 있다. jvmtiStackInfo 의 레코드수는,thread_count 로 결정된다.
이 버퍼는, jvmtiStackInfo.frame_buffer 로 포인트 된 jvmtiFrameInfo 버퍼를 포함하도록(듯이) 할당할 수 있고 있다. 이러한 버퍼는, 따로 따로 해제해서는 안 된다.
에이전트는 jvmtiStackInfo* 에 포인터를 건네준다. 돌아왔을 때,vmtiStackInfo* 는, 사이즈 *threads_count 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiStackInfo 의 thread 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_INVALID_THREAD |
thread 객체가 아닌 요소가 thread_list 내에 존재한다. |
JVMTI_ERROR_ILLEGAL_ARGUMENT |
thread_count 가 0 보다 작다. |
JVMTI_ERROR_NULL_POINTER |
thread_list 가 NULL . |
JVMTI_ERROR_ILLEGAL_ARGUMENT |
max_frame_count 가 0 보다 작다. |
JVMTI_ERROR_NULL_POINTER |
stack_info_ptr 이 NULL . |
프레임 카운트의 취득
jvmtiError GetFrameCount(jvmtiEnv* env, jthread thread, jint* count_ptr)
지정된 thread의 호출 스택에 현재 들어가 있는 프레임의 수를 가져옵니다.
액티브하게 바이트 코드를 실행하고 있는 thread (현재의 thread는 아니고, 중단되어 있지 않은 thread등)를 위해서(때문에) 이 함수가 불려 갔을 경우, 일시적인 정보가 돌려주어집니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 16 | 1.0 |
권한 | |
필요한 기능 |
파라미터 | ||
이름 | 형 | 설명 |
thread |
jthread |
조회하는 thread. thread 가 NULL 의 경우, 현재의 thread가 사용된다. |
count_ptr |
jint * |
돌아왔을 때, 호출 스택내의 프레임의 수를 포인트 한다.
에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_INVALID_THREAD |
thread 는 thread 객체는 아니다. |
JVMTI_ERROR_THREAD_NOT_ALIVE |
thread 가 라이브 thread는 아니다 ( 아직 기동하고 있지 않는지, 벌써 종료하고 있다). |
JVMTI_ERROR_NULL_POINTER |
count_ptr 가 NULL . |
프레임의 팝
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. thread 가 NULL 의 경우, 현재의 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_ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
location_ptr 가 NULL . |
프레임의 팝의 통지
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. thread 가 NULL 의 경우, 현재의 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 에 스택 프레임이 존재하지 않는다. |
조기 복귀의 강제
조기 복귀의 강제의 함수:
- 조기 복귀의 강제 - 객체형
- 조기 복귀의 강제 - 정수형
- 조기 복귀의 강제 - 장 정수형
- 조기 복귀의 강제 - 부동 소수점수(실수)형
- 조기 복귀의 강제 - 배정밀도 부동 소수점수(실수)형
- 조기 복귀의 강제 - void 형
이러한 함수를 사용하면(자), 에이전트는, 실행중의 임의의 포인트에서의 복귀를 메소드에 강제할 수 있습니다. 조기 복귀하는 메소드를 「피호방편 메소드」라고 부릅니다. 피호방편 메소드는,「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. thread 가 NULL 의 경우, 현재의 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. thread 가 NULL 의 경우, 현재의 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. thread 가 NULL 의 경우, 현재의 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. thread 가 NULL 의 경우, 현재의 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. thread 가 NULL 의 경우, 현재의 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. thread 가 NULL 의 경우, 현재의 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 참조 콜백
- 프리미티브(primitive) 필드 콜백
- 배열 프리미티브(primitive)치 콜백
- 캐릭터 라인 프리미티브(primitive)치 콜백
- 장래 사용하기 위해서 예약된 콜백
heap의 형태:
jvmtiHeapReferenceKind
- heap 참조의 열거jvmtiPrimitiveType
- 원시형의 열거jvmtiHeapReferenceInfoField
- 필드 참조용의 참조 정보 구조체jvmtiHeapReferenceInfoArray
- 배열 참조용의 참조 정보 구조체jvmtiHeapReferenceInfoConstantPool
- 정수 풀 참조용의 참조 정보 구조체jvmtiHeapReferenceInfoStackLocal
- 국소 변수 참조용의 참조 정보 구조체jvmtiHeapReferenceInfoJniLocal
- JNI 로컬 참조용의 참조 정보 구조체jvmtiHeapReferenceInfoReserved
- 그 외의 참조용의 참조 정보 구조체jvmtiHeapReferenceInfo
- 참조 정보 구조체jvmtiHeapCallbacks
- 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_FIELD
및 JVMTI_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 는, 그 슈퍼 클래스가 직접 구현하는 모든 인터페이스와 그것들 인터페이스의 모든 슈퍼 인터페이스를 구현하고 있습니다.
이 계산에는, 필드 수식자 (static, public, private 등)의 종류에 관계없이, 모든 필드가 포함됩니다.
- I 내에서 직접 선언되고 있는 필드의 리스트가 작성됩니다.
- 이 리스트내의 필드가
GetClassFields
로부터 반환된 차례로 늘어놓을 수 있습니다.- 이 리스트내의 필드에, 인덱스 n,n+1,... 하지만 순서에 할당할 수 있습니다. n 는,I 의 모든 슈퍼 인터페이스에 포함되는 필드의 카운트수입니다.
예를 들어, 다음과 같은 클래스와 인터페이스가 지정되고 있다고 합니다.
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)입니다. 즉,I0
의p
와I1
의x
입니다.b 3 후속의 인덱스. C1
도 같은 필드 인덱스를 가집니다.클래스
C2
의 인스턴스의 필드 인덱스는, 다음과 같이 됩니다.클래스
a 3 C2
가 구현하는 인터페이스내의 필드의 카운트수는 3 (n=3)입니다. 즉,I0
의p
,I1
의x
, 및I2
의y
(C2
의 인터페이스)입니다.I0
의 필드p
는 한 번 밖에 포함되지 않습니다.b 4 「a」에 계속되는 인덱스. q 5 「b」에 계속되는 인덱스. r 6 「q」에 계속되는 인덱스. C2
도 같은 필드 인덱스를 가집니다. 상기의 필드 「a」와 같이, 같은 필드가, 참조측 객체 마다 다른 인덱스를 가질 가능성이 있습니다. 또, 콜백으로부터 모든 필드 인덱스가 가시가 되는 것은 아닙니다만, 여기에서는 설명을 위해서(때문에) 모든 인덱스를 나타내고 있습니다.인터페이스
I1
도 같은 필드 인덱스를 가집니다.
x 1 I1
의 슈퍼 인터페이스내의 필드의 카운트수는 1 (n=1)입니다. 즉,I0
의p
입니다.
배열 참조용의 참조 정보 구조체
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_FIELD
및JVMTI_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 반복 콜백
에이전트에 의해 제공되는 콜백 함수. heap내의 객체를 기술합니다만, 값은 건네주지 않습니다.typedef jint (JNICALL *jvmtiHeapIterationCallback) (jlong class_tag, jlong size, jlong* tag_ptr, jint length, void* user_data); 이 함수는, 필요한비짓트 제어 플래그의 비트 벡터를 돌려줍니다. 이것에 의해, 반복 처리의 전체를 중지해야할 것인가 제발이 정해집니다 ( JVMTI_VISIT_OBJECTS 플래그는 무시된다).
heap 콜백 함수의 제한을 참조해 주세요.
|
heap 참조 콜백
에이전트에 의해 제공되는 콜백 함수. 어느 객체 또는 VM (참조측)로부터 다른 객체 (참조처)에의 참조, 또는 있는 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); 이 함수는, 필요한비짓트 제어 플래그의 비트 벡터를 돌려줍니다. 이것에 의해, 참조처가 참조하고 있는 객체를 비짓트해야할 것인가 제발이나, 반복 처리의 전체를 중지해야할 것인가 제발이 정해집니다. heap 콜백 함수의 제한을 참조해 주세요.
|
프리미티브(primitive) 필드 콜백
어느 객체 ( 「객체」)의 프리미티브(primitive) 필드를 기술하는, 에이전트에 의해 제공되는 콜백 함수. 프리미티브(primitive) 필드란, 형태가 원시형인 필드입니다. 이 콜백은, 객체가 클래스의 경우는 static 필드를, 그 이외의 경우는 인스턴스 필드를 각각 기술합니다.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); 이 함수는, 필요한비짓트 제어 플래그의 비트 벡터를 돌려줍니다. 이것에 의해, 반복 처리의 전체를 중지해야할 것인가 제발이 정해집니다 ( JVMTI_VISIT_OBJECTS 플래그는 무시된다).
heap 콜백 함수의 제한을 참조해 주세요.
|
배열 프리미티브(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 콜백 함수의 제한을 참조해 주세요.
|
캐릭터 라인 프리미티브(primitive)치 콜백
에이전트에 의해 제공되는 콜백 함수. java.lang.String 의 값을 기술합니다.typedef jint (JNICALL *jvmtiStringPrimitiveValueCallback) (jlong class_tag, jlong size, jlong* tag_ptr, const jchar* value, jint value_length, void* user_data); 이 함수는, 필요한비짓트 제어 플래그의 비트 벡터를 돌려줍니다. 이것에 의해, 반복 처리의 전체를 중지해야할 것인가 제발이 정해집니다 ( JVMTI_VISIT_OBJECTS 플래그는 무시된다).
heap 콜백 함수의 제한을 참조해 주세요.
|
장래 사용하기 위해서 예약된 콜백
플레이스홀더- -- 장래의 사용을 위해서(때문에) 예약이 끝난 상태입니다.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) 되었을 경우, 또는 B 가 initial_object
로서 지정되었을 경우에,B 가 「비짓트」되었다고 합니다. A 로부터 B 에의 참조가 횡단(traverse) 되는 것은,A 의 비짓트 다음에. 참조의 보고 순서는, 참조의 횡단(traverse) 순서와 같게 됩니다. 객체 참조의 보고는, 에이전트로부터 제공되는 콜백 함수 jvmtiHeapReferenceCallback
를 호출하는 것으로 행해집니다. A 로부터 B 에의 참조로,A 는 「참조측」,B 는 「참조처」라고 불립니다. 콜백은, 참조 측에서의 참조마다 1 회만 불려 갑니다. 참조 사이클이나, 참조측인 패스가 복수 존재하는 경우도 같습니다. 참조측과 참조처와의 사이에 참조가 복수 존재할 가능성이 있습니다만, 그 경우는, 각각의 참조가 보고됩니다. 이러한 참조를 구별하려면 ,jvmtiHeapReferenceCallback
콜백의 reference_kind
및 reference_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) 콜백의 양쪽 모두에 들어맞는다.
klass 가 NULL 의 경우, 콜백은 특정의 클래스의 인스턴스에 제한되지 않는다. |
initial_object |
jobject |
추적하는 객체
initial_object 가 NULL 의 경우, heap 루트로부터 참조의 추적을 한다. |
callbacks |
const jvmtiHeapCallbacks * |
일련의 콜백 함수를 정의하는 구조체.
에이전트는 jvmtiHeapCallbacks 에 포인터를 건네준다. |
user_data |
const void * |
사용자가 입력해, 콜백에게 건네지는 데이터.
에이전트가 포인터를 건네준다. user_data 가 NULL 의 경우,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 |
callbacks 가 NULL . |
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) 콜백의 양쪽 모두에 들어맞는다.
klass 가 NULL 의 경우, 콜백은 특정의 클래스의 인스턴스에 제한되지 않는다. |
callbacks |
const jvmtiHeapCallbacks * |
일련의 콜백 함수를 정의하는 구조체.
에이전트는 jvmtiHeapCallbacks 에 포인터를 건네준다. |
user_data |
const void * |
사용자가 입력해, 콜백에게 건네지는 데이터.
에이전트가 포인터를 건네준다. user_data 가 NULL 의 경우,NULL 가 사용자 지정 데이터로서 건네받는다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
환경은 권한 can_tag_objects 를 가지지 않는다. AddCapabilities 를 사용한다. |
JVMTI_ERROR_INVALID_CLASS |
klass 는 유효한 클래스는 아니다. |
JVMTI_ERROR_NULL_POINTER |
callbacks 가 NULL . |
태그의 취득
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_ptr 가 NULL . |
태그의 설정
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 * |
이러한 태그를 붙일 수 있었던 객체를 주사 한다. 이 배열내에서는, 제로는 사용할 수 없다.
에이전트는 jlong 의 tag_count 요소의 배열을 건네준다. |
count_ptr |
jint * |
tags 내의 임의의 태그를 가지는 객체의 수를 돌려준다.
에이전트는 jint 에 포인터를 건네준다. 돌아왔을 때,jint 가 설정되어 있다. |
object_result_ptr |
jobject ** |
tags 내의 임의의 태그를 가지는 객체의 배열을 돌려준다.
에이전트는 jobject* 에 포인터를 건네준다. 돌아왔을 때,jobject* 는, 사이즈 *count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. object_result_ptr 가 NULL 의 경우, 이 정보는 돌려주어지지 않다. object_result_ptr 로부터 반환되는 객체는 JNI 로컬 참조이며,관리할 필요가 있다. |
tag_result_ptr |
jlong ** |
object_result_ptr 내의 각 객체에 대해서, 대응하는 인덱스의 태그를 돌려준다.
에이전트는 jlong* 에 포인터를 건네준다. 돌아왔을 때,jlong* 는, 사이즈 *count_ptr 의 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. tag_result_ptr 가 NULL 의 경우, 이 정보는 돌려주어지지 않다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
환경은 권한 can_tag_objects 를 가지지 않는다. AddCapabilities 를 사용한다. |
JVMTI_ERROR_ILLEGAL_ARGUMENT |
tags 내에 제로가 존재한다. |
JVMTI_ERROR_ILLEGAL_ARGUMENT |
tag_count 가 0 보다 작다. |
JVMTI_ERROR_NULL_POINTER |
tags 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
count_ptr 가 NULL . |
가베지 컬렉션의 강제
jvmtiError ForceGarbageCollection(jvmtiEnv* env)
VM 에 가베지 컬렉션의 실행을 강제합니다. 가베지 컬렉션은 가능한 한 완전하게 행해집니다. 이 함수는, 파이나라이자를 실행시키지 않습니다. 이 함수는, 가베지 컬렉션이 완료할 때까지 종료하지 않습니다.
가베지 컬렉션은 가능한 한 완전하게 실행됩니다만, 이 함수가 돌아오기까지 모든 ObjectFree
이벤트가 송신되고 있다고 하는 보증은 없습니다. 특히, finalize 기다리는 객체가 해제되지 않을 가능성이 있습니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 108 | 1.0 |
권한 | |
필요한 기능 |
파라미터 | ||
이름 | 형 | 설명 |
에러 | |
이 함수는,범용 에러를 돌려준다 |
heap (1.0)
heap (1.0)의 함수:
heap (1.0)의 함수형:
heap (1.0)의 형태:
jvmtiHeapObjectFilter
- heap 객체의 필터의 열거jvmtiHeapRootKind
- heap 루트의 종류의 열거jvmtiObjectReferenceKind
- 객체 참조의 열거jvmtiIterationControl
- 반복 제어의 열거
이러한 함수 및 데이터형은 원의 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 객체로부터, 그 객체의 몇개의 인스턴스 필드의 값에의 참조. 이런 종류의 참조의 경우,jvmtiObjectReferenceCallback 의 referrer_index
파라미터는 인스턴스 필드의 인덱스. 인덱스는, 모든 객체의 필드의 순서가 기본으로 된다. 클래스에서 직접 선언된 static 및 인스턴스 필드가 포함되는 것 외에 슈퍼 클래스 및 슈퍼 인터페이스로 선언된 모든 필드 (public 와 private 의 양쪽 모두)가 포함된다. 그 때문에 인덱스는, 직접 선언된 클래스에 있는 필드의 인덱스 (「GetClassFields」
참조)와 모든 슈퍼 클래스 및 슈퍼 인터페이스로 선언된 필드 (public 와 private 의 양쪽 모두)를 서로 더한 것으로 계산된다. 인덱스는 0 으로부터 시작된다.JVMTI_REFERENCE_ARRAY_ELEMENT
3 배열로부터, 이 배열의 몇개의 요소에의 참조. 이런 종류의 참조의 경우,jvmtiObjectReferenceCallback 의 referrer_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 필드의 값에의 참조. 이런 종류의 참조의 경우,jvmtiObjectReferenceCallback 의 referrer_index
파라미터는 static 필드의 인덱스. 인덱스는, 모든 객체의 필드의 순서가 기본으로 된다. 클래스에서 직접 선언된 static 및 인스턴스 필드가 포함되는 것 외에 슈퍼 클래스 및 슈퍼 인터페이스로 선언된 모든 필드 (public 와 private 의 양쪽 모두)가 포함된다. 그 때문에 인덱스는, 직접 선언된 클래스에 있는 필드의 인덱스 (「GetClassFields」
참조)와 모든 슈퍼 클래스 및 슈퍼 인터페이스로 선언된 필드 (public 와 private 의 양쪽 모두)를 서로 더한 것으로 계산된다. 인덱스는 0 으로부터 시작된다. 주:이 정의는, JVM TI 1.0 스펙에서의 정의와 다르다.원리의 설명:기존의 구현 속에서, 1.0 의 정의를 사용한 것은 없다.
JVMTI_REFERENCE_CONSTANT_POOL
9 클래스로부터 정수 풀내의 해결 지음 엔트리의 참조. 이런 종류의 참조의 경우,jvmtiObjectReferenceCallback 의 referrer_index
파라미터는, 클래스의 정수 풀 테이블의 인덱스로, 1 으로부터 시작된다. 「Java 가상 머신 스펙」의「Constant Pool」섹션을 참조.
반복 제어의 열거 ( jvmtiIterationControl
)정수 치 설명 JVMTI_ITERATION_CONTINUE
1 반복 처리를 계속. 참조의 반복 처리의 경우, 이 객체의 참조에 따른다. JVMTI_ITERATION_IGNORE
2 반복 처리를 계속. 참조의 반복 처리의 경우, 이 객체의 참조를 무시한다. JVMTI_ITERATION_ABORT
0 반복 처리를 중지.
heap 객체의 콜백
에이전트에 의해 제공되는 콜백 함수. heap내의 객체를 기술합니다만, 값은 건네주지 않습니다.typedef jvmtiIterationControl (JNICALL *jvmtiHeapObjectCallback) (jlong class_tag, jlong size, jlong* tag_ptr, void* user_data); 반복 처리를 계속하는 경우, 반환값은 JVMTI_ITERATION_CONTINUE 입니다. 반복 처리를 정지하는 경우, 반환값은 JVMTI_ITERATION_ABORT 입니다.
heap 콜백 함수의 제한을 참조해 주세요.
|
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 콜백 함수의 제한을 참조해 주세요.
|
스택 참조 객체의 콜백
에이전트에 의해 제공되는 콜백 함수. 가베지 컬렉션의 목적으로, 스택상의 루트 객체에 대해 설명합니다만, 값은 건네주지 않습니다.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 콜백 함수의 제한을 참조해 주세요.
|
객체 참조의 콜백
에이전트에 의해 제공되는 콜백 함수. 어느 객체 (참조측)로부터 다른 객체 (참조처)의 참조에 대해 설명합니다.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 콜백 함수의 제한을 참조해 주세요.
|
객체로부터 도달 가능한 객체의 반복
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_data 가 NULL 의 경우,NULL 가 사용자 지정 데이터로서 건네받는다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
환경은 권한 can_tag_objects 를 가지지 않는다. AddCapabilities 를 사용한다. |
JVMTI_ERROR_INVALID_OBJECT |
object 가 객체는 아니다. |
JVMTI_ERROR_NULL_POINTER |
object_reference_callback 가 NULL . |
도달 가능한 객체의 반복
jvmtiError IterateOverReachableObjects(jvmtiEnv* env, jvmtiHeapRootCallback heap_root_callback, jvmtiStackReferenceCallback stack_ref_callback, jvmtiObjectReferenceCallback object_ref_callback, const void* user_data)
이 함수는, 루트 객체와 루트 객체로부터 직접 또는 간접적으로 도달 가능한 모든 객체에 대해서 반복 처리를 실시합니다. 루트 객체는, 시스템 클래스, JNI 글로벌, thread 스택으로부터의 참조, 가베지 컬렉션의 목적으로 루트로서 사용되는 그 외의 객체세트로 구성됩니다.
각 루트에,heap_root_callback
또는stack_root_callback
가 불려 갑니다. 객체는, 1 개(살) 이상의 이유로써 루트 객체가 될 수가 있습니다. 이 경우, 개개의 이유에 대해서 적절한 콜백이 불려 갑니다.
각 객체 참조에,object_ref_callback
함수가 불려 가 객체 참조에 대해 설명합니다. 콜백은, 참조 측에서의 참조마다 1 회만 불려 갑니다. 참조 사이클이나, 참조측인 패스가 복수 존재하는 경우도 같습니다. 참조측과 참조되는 측의 사이에, 복수의 참조가 존재하는 경우가 있습니다. 이러한 식별에는,jvmtiObjectReference.reference_ (종류)
와 jvmtiObjectReference.referrer_ (인덱스)
를 사용합니다. 객체의 콜백은, 항상 참조측의 콜백의 나중에 행해지겠습니다.
보고되는 객체 참조에 대해서는,FollowReferences
를 참조해 주세요.
루트는, 항상, 객체 참조가 보고되기 전에, 프로 filer에 보고됩니다. 즉,object_ref_callback
는, 모든 루트에 대해서 적절한 콜백이 불려 갈 때까지, 불려 가지 않습니다. object_ref_callback
가 NULL
와 지정되고 있는 경우, 이 함수는, 프로 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_callback 가 NULL 의 경우, heap 루트의 보고는 실시하지 않는다. |
stack_ref_callback |
jvmtiStackReferenceCallback |
JVMTI_HEAP_ROOT_STACK_LOCAL 또는 JVMTI_HEAP_ROOT_JNI_LOCAL 의 각 heap 루트를 위해서(때문에) 불려 가는 콜백 함수.
stack_ref_callback 가 NULL 의 경우, 스택 참조의 보고는 실시하지 않는다. |
object_ref_callback |
jvmtiObjectReferenceCallback |
각 객체 참조를 위해서(때문에) 불려 가는 콜백.
object_ref_callback 가 NULL 의 경우, 루트 객체로부터의 참조에는 따르지 않는다. |
user_data |
const void * |
사용자가 입력해, 콜백에게 건네지는 데이터.
에이전트가 포인터를 건네준다. user_data 가 NULL 의 경우,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_data 가 NULL 의 경우,NULL 가 사용자 지정 데이터로서 건네받는다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
환경은 권한 can_tag_objects 를 가지지 않는다. AddCapabilities 를 사용한다. |
JVMTI_ERROR_ILLEGAL_ARGUMENT |
object_filter 가 jvmtiHeapObjectFilter 이 아니다. |
JVMTI_ERROR_NULL_POINTER |
heap_object_callback 가 NULL . |
클래스의 인스턴스의 반복
jvmtiError IterateOverInstancesOfClass(jvmtiEnv* env, jclass klass, jvmtiHeapObjectFilter object_filter, jvmtiHeapObjectCallback heap_object_callback, const void* user_data)
지정된 클라이언트의 인스턴스가 되어 있는, 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_data 가 NULL 의 경우,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_callback 가 NULL . |
국소 변수
국소 변수 함수:
- 국소 변수의 취득 - 객체형
- 국소 변수의 취득 - 정수형
- 국소 변수의 취득 - 장 정수형
- 국소 변수의 취득 - 부동 소수점수(실수)형
- 국소 변수의 취득 - 배정밀도 부동 소수점수(실수)형
- 국소 변수의 설정 - 객체형
- 국소 변수의 설정 - 정수형
- 국소 변수의 설정 - 장 정수형
- 국소 변수의 설정 - 부동 소수점수(실수)형
- 국소 변수의 설정 - 배정밀도 부동 소수점수(실수)형
이러한 함수는, 국소 변수의 값을 취득 또는 설정하기 위해서 사용합니다. 변수는, 변수의 값을 포함하고 있는 프레임의 깊이와 그 프레임내의 변수의 슬롯 번호에 의해 식별됩니다. 변수로부터 슬롯 번호에의 매핑은, 함수 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. thread 가 NULL 의 경우, 현재의 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__ptr 가 NULL . |
국소 변수의 취득 - 정수형
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. thread 가 NULL 의 경우, 현재의 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__ptr 가 NULL . |
국소 변수의 취득 - 장 정수형
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. thread 가 NULL 의 경우, 현재의 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__ptr 가 NULL . |
국소 변수의 취득 - 부동 소수점수(실수)형
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. thread 가 NULL 의 경우, 현재의 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__ptr 가 NULL . |
국소 변수의 취득 - 배정밀도 부동 소수점수(실수)형
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. thread 가 NULL 의 경우, 현재의 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__ptr 가 NULL . |
국소 변수의 설정 - 객체형
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. thread 가 NULL 의 경우, 현재의 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. thread 가 NULL 의 경우, 현재의 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. thread 가 NULL 의 경우, 현재의 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. thread 가 NULL 의 경우, 현재의 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. thread 가 NULL 의 경우, 현재의 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)
method
및 location
로 지정된 명령에 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)
method
및 location
로 지정된 바이트 코드로 설정되어 있는 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)
klass
및 field
로 지정된 필드가 액세스 되려고 한 시점에서,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
를 사용해 이전으로 설정한,klass
및 field
로 지정되는 필드에 대한 필드 액세스의 감시를 취소합니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 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)
klass
및 field
로 지정된 필드가 변경되려고 한 시점에서,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)
klass
및 field
로 지정되는 필드에 대해서,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 는 아니다. |
클래스
클래스 함수:
- 로드가 끝난 클래스의 취득
- 클래스 로더 클래스의 취득
- 클래스의 시그니챠의 취득
- 클래스의 상태의 취득
- 원시 파일명의 취득
- 클래스의 수식자의 취득
- 클래스의 메소드의 취득
- 클래스의 필드의 취득
- 구현된 인터페이스의 취득
- 클래스 버젼 번호의 취득
- 정수 풀의 취득
- 인터페이스인가 어떤가의 검사
- 배열 클래스인가 어떤가의 검사
- 변경 가능 클래스인가 어떤가의 검사
- 클래스 로더의 취득
- 소스 디버그 확장 기능의 취득
- 클래스의 재변환
- 클래스의 재정의
클래스의 형태:
jvmtiClassDefinition
- 클래스의 재정의의 설명
클래스의 플래그 및 정수:
로드가 끝난 클래스의 취득
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_ptr 이 NULL . |
JVMTI_ERROR_NULL_POINTER |
classes_ptr 가 NULL . |
클래스 로더 클래스의 취득
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_loader 가 NULL 의 경우, 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_ptr 이 NULL . |
JVMTI_ERROR_NULL_POINTER |
classes_ptr 가 NULL . |
클래스의 시그니챠의 취득
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_ptr 가 NULL 의 경우, 시그니챠는 돌려주어지지 않다. |
generic_ptr |
char ** |
돌아왔을 때, 클래스의 총칭 시그니챠 (수정 UTF-8 캐릭터 라인으로서 encode 된다)를 포인트 한다. 클래스의 총칭 시그니챠 속성이 존재하지 않는 경우는, 돌아왔을 때 NULL 를 포인트 한다.
에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. generic_ptr 가 NULL 의 경우, 총칭 시그니챠는 돌려주어지지 않다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
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_ptr 가 NULL . |
원시 파일명의 취득
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_ptr 이 NULL . |
클래스의 수식자의 취득
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_ptr 가 NULL . |
클래스의 메소드의 취득
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_ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
methods_ptr 가 NULL . |
클래스의 필드의 취득
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_ptr 이 NULL . |
JVMTI_ERROR_NULL_POINTER |
fields_ptr 가 NULL . |
구현된 인터페이스의 취득
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_ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
interface_ptr 가 NULL . |
클래스 버젼 번호의 취득
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_ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
major_version_ptr 가 NULL . |
정수 풀의 취득
jvmtiError GetConstantPool(jvmtiEnv* env, jclass klass, jint* constant_pool_count_ptr, jint* constant_pool_byte_count_ptr, unsigned char** constant_pool_bytes_ptr)
klass
로 나타난 클래스에 대해서는,「Java 가상 머신 스펙」의「Class File Format」에 기재된 constant_pool
항목의 형식에서 정수 풀의 raw 바이트를 돌려줍니다. 정수 풀의 형식은, 클래스 파일 형식의 버젼에 따라서 다를 가능성이 있으므로,클래스의 메이저 버젼 번호 및 마이너 버젼 번호에 호환성이 있는 것을 확인하도록 해 주세요.
반환되는 정수 풀의 레이아웃이나 내용이, 정의원의 클래스 파일내의 정수 풀과 같지 않은 것도 있습니다. GetConstantPool()로부터 반환되는 정수 풀의 엔트리수는, 정의원의 정수 풀의 엔트리수와 다른 경우가 있습니다. 엔트리의 순서가 다른 경우도 있습니다. GetConstantPool()로부터 반환되는 정수 풀은,GetBytecodes() 가 사용하는 정수 풀에 일치합니다. 즉, GetBytecodes()로부터 반환되는 바이트 코드에 포함되는 정수 풀 인덱스는, GetConstantPool()로부터 반환되는 정수 풀의 엔트리를 참조합니다. RetransformClasses
및 RedefineClasses
는 정수 풀을 변경할 수 있기 (위해)때문에, 이 함수로부터 반환되는 정수 풀은, 거기에 응해 변경될 가능성이 있습니다. 따라서, 도중에 클래스의 재변환 또는 재정의를 했을 경우는, 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_ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
constant_pool_byte_count_ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
constant_pool_bytes_ptr 가 NULL . |
인터페이스인가 어떤가의 검사
jvmtiError IsInterface(jvmtiEnv* env, jclass klass, jboolean* is_interface_ptr)
클래스 객체 참조가 인터페이스를 나타내고 있는지 어떤지를 판정합니다. 클래스가 실제로 인터페이스인 경우,jboolean
는 JNI_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_ptr 가 NULL . |
배열 클래스인가 어떤가의 검사
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_ptr 가 NULL . |
변경 가능 클래스인가 어떤가의 검사
jvmtiError IsModifiableClass(jvmtiEnv* env, jclass klass, jboolean* is_modifiable_class_ptr)
클래스가 변경 가능한가 어떤가를 판정합니다. 클래스가 변경 가능한 경우 (is_modifiable_class_ptr
가 JNI_TRUE
를 돌려주었을 경우), 그 클래스는,RedefineClasses
를 사용해 재정의하거나 (에이전트가 can_redefine_classes
권한을 소유하고 있으면(자) 가정),RetransformClasses
를 사용해 재변환하거나 (에이전트가 can_retransform_classes
권한을 소유하고 있으면(자) 가정) 할 수 있습니다. 어느 클래스가 변경 불가능한 경우 (is_modifiable_class_ptr
가 JNI_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_ptr 가 NULL . |
클래스 로더의 취득
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_ptr 이 NULL . |
소스 디버그 확장 기능의 취득
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_ptr 가 NULL . |
클래스의 재변환
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 * |
재변환되는 클래스의 배열.
에이전트는 jclass 의 class_count 요소의 배열을 건네준다. |
클래스의 재정의
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 * |
새로운 클래스 정의의 배열수
에이전트는 jvmtiClassDefinition 의 class_count 요소의 배열을 건네준다. |
객체
객체 함수:
객체의 형태:
jvmtiMonitorUsage
- 객체 모니터의 사용 정보
객체 사이즈의 취득
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_ptr 가 NULL . |
객체의 해시 코드의 취득
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_ptr 가 NULL . |
객체의 모니터의 이용 정보를 취득
typedef struct { jthread owner; jint entry_count; jint waiter_count; jthread* waiters; jint notify_waiter_count; jthread* notify_waiters; } jvmtiMonitorUsage;jvmtiError GetObjectMonitorUsage(jvmtiEnv* env, jobject object, jvmtiMonitorUsage* info_ptr)
객체의 모니터에 관한 정보를 가져옵니다. jvmtiMonitorUsage
구조체의 필드에, 모니터의 사용에 관한 정보가 들어갑니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 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 가 설정되어 있다. jvmtiMonitorUsage 의 owner 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다. jvmtiMonitorUsage 의 waiters 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiMonitorUsage 의 waiters 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다. jvmtiMonitorUsage 의 notify_waiters 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiMonitorUsage 의 notify_waiters 필드에 반환되는 객체는, JNI 로컬 참조이며,관리할 필요가 있다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
환경은 권한 can_get_monitor_info 를 가지지 않는다. AddCapabilities 를 사용한다. |
JVMTI_ERROR_INVALID_OBJECT |
object 가 객체는 아니다. |
JVMTI_ERROR_NULL_POINTER |
info_ptr 가 NULL . |
필드
필드 함수:
필드의 이름과 시그니챠의 취득
jvmtiError GetFieldName(jvmtiEnv* env, jclass klass, jfieldID field, char** name_ptr, char** signature_ptr, char** generic_ptr)
klass
와 field
로 지정된 필드에 도착해, 이름을 name_ptr
로 돌려주어, 시그니챠를 signature_ptr
로 돌려줍니다.
필드의 시그니챠는 JNI 스펙으로 정의되고 있어「Java 가상 머신 스펙」에서는필드 기술자로 불리고 있습니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
개시 또는 라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 60 | 1.0 |
권한 | |
필요한 기능 |
파라미터 | ||
이름 | 형 | 설명 |
klass |
jclass |
조회하는 필드의 클래스. |
field |
jfieldID |
조회하는 필드. |
name_ptr |
char ** |
돌아왔을 때, 필드명 (수정 UTF-8 캐릭터 라인으로서 encode 된다)을 포인트 한다.
에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. name_ptr 가 NULL 의 경우, 이름은 돌려주어지지 않다. |
signature_ptr |
char ** |
돌아왔을 때, 필드의 시그니챠 (수정 UTF-8 캐릭터 라인으로서 encode 된다)를 포인트 한다.
에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. signature_ptr 가 NULL 의 경우, 시그니챠는 돌려주어지지 않다. |
generic_ptr |
char ** |
돌아왔을 때, 필드의 총칭 시그니챠 (수정 UTF-8 캐릭터 라인으로서 encode 된다)를 포인트 한다. 필드의 총칭 시그니챠 속성이 존재하지 않는 경우는, 돌아왔을 때 NULL 를 포인트 한다.
에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. generic_ptr 가 NULL 의 경우, 총칭 시그니챠는 돌려주어지지 않다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_INVALID_CLASS |
klass 가 클래스 객체가 아닌지, 클래스가 언로드되고 있다. |
JVMTI_ERROR_INVALID_FIELDID |
field 가 jfieldID 는 아니다. |
필드의 선언 클래스의 취득
jvmtiError GetFieldDeclaringClass(jvmtiEnv* env, jclass klass, jfieldID field, jclass* declaring_class_ptr)
klass
와 field
로 지정된 필드에 도착해, 그 필드를 정의하고 있는 클래스를 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_ptr 가 NULL . |
필드의 수식자의 취득
jvmtiError GetFieldModifiers(jvmtiEnv* env, jclass klass, jfieldID field, jint* modifiers_ptr)
klass
와 field
로 지정된 필드의 액세스 플래그를,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_ptr 가 NULL . |
합성 필드인가 어떤가의 검사
jvmtiError IsFieldSynthetic(jvmtiEnv* env, jclass klass, jfieldID field, jboolean* is_synthetic_ptr)
klass
및 field
로 지정된 필드에 대해,is_synthetic_ptr
를 개입시켜 그 필드가 합성일지 어떨지를 나타내는 값을 돌려줍니다. 합성 필드는 컴파일러에 의해 생성됩니다만, 원의 원시 코드내에는 존재하지 않습니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
개시 또는 라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 63 | 1.0 |
권한 | |
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다. |
|
권한 | 효과 |
can_get_synthetic_attribute |
합성 필드 또는 합성 메소드일지 어떨지를 테스트할 수 있는 - IsFieldSynthetic 와 IsMethodSynthetic |
파라미터 | ||
이름 | 형 | 설명 |
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_ptr 가 NULL . |
메소드
메소드 함수:
- 메소드의 이름과 시그니챠의 취득
- 메소드의 선언 클래스의 취득
- 메소드의 수식자의 취득
- 국소 변수의 취득
- 인수의 사이즈의 취득
- 행 번호 테이블의 취득
- 메소드의 배치 위치의 취득
- 국소 변수 테이블의 취득
- 바이트 코드의 취득
- 네이티브 메소드인가 어떤가의 검사
- 합성 메소드인가 어떤가의 검사
- 폐기된 메소드인가 어떤가의 검사
- 네이티브 메소드 접두사의 설정
- 복수의 네이티브 메소드 접두사의 설정
메소드의 형태:
jvmtiLineNumberEntry
- 행 번호 테이블의 엔트리jvmtiLocalVariableEntry
- 국소 변수 테이블의 엔트리
이러한 함수는, 어느 메소드 (jmethodID
로서 표현)에 관한 정보를 제공하거나 메소드의 처리 방법을 설정하거나 합니다.
폐지 메소드
함수 RetransformClasses
및 RedefineClasses
를 호출하면(자), 새로운 버젼의 메소드가 인스톨 됩니다. 원의 메소드와 재정의한 메소드가 동등으로 간주해지는 것은, 다음과 같은 경우입니다.
- 쌍방의 메소드의 바이트 코드가 같다 (정수 풀의 인덱스를 제외하다)
- 참조 정수가 동일하다
새로운 메소드 버젼과 등가가 아닌 원의 메소드 버젼은 「폐지」라고 불려 새로운 메소드 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_ptr 가 NULL 의 경우, 이름은 돌려주어지지 않다. |
signature_ptr |
char ** |
돌아왔을 때, 메소드시그니챠 (수정 UTF-8 캐릭터 라인으로서 encode 된다)를 포인트 한다.
에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. signature_ptr 가 NULL 의 경우, 시그니챠는 돌려주어지지 않다. |
generic_ptr |
char ** |
돌아왔을 때, 메소드의 총칭 시그니챠 (수정 UTF-8 캐릭터 라인으로서 encode 된다)를 포인트 한다. 메소드의 총칭 시그니챠 속성이 존재하지 않는 경우는, 돌아왔을 때 NULL 를 포인트 한다.
에이전트는 char* 에 포인터를 건네준다. char* 는, 새롭게 할당할 수 있었던 배열을 포인트 한다. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. generic_ptr 가 NULL 의 경우, 총칭 시그니챠는 돌려주어지지 않다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
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_ptr 가 NULL . |
메소드의 수식자의 취득
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_ptr 가 NULL . |
국소 변수의 취득
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_ptr 가 NULL . |
인수의 사이즈의 취득
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_ptr 가 NULL . |
행 번호 테이블의 취득
typedef struct { jlocation start_location; jint line_number; } jvmtiLineNumberEntry;jvmtiError GetLineNumberTable(jvmtiEnv* env, jmethodID method, jint* entry_count_ptr, jvmtiLineNumberEntry** table_ptr)
method
로 지정된 메소드에 대해, 소스행 번호의 엔트리로부터 완성되는 테이블을 돌려줍니다. 테이블의 사이즈는 entry_count_ptr
, 테이블 자체는 table_ptr
를 개입시켜 돌려주어집니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
개시 또는 라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 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_ptr 이 NULL . |
JVMTI_ERROR_NULL_POINTER |
table__ptr 가 NULL . |
메소드의 배치 위치의 취득
jvmtiError GetMethodLocation(jvmtiEnv* env, jmethodID method, jlocation* start_location_ptr, jlocation* end_location_ptr)
method
로 지정된 메소드에 대해, 그 개시 주소와 종료 주소를 start_location_ptr
와 end_location_ptr
를 개입시켜 돌려줍니다. 종래의 바이트 코드 인덱스 schema에서는,start_location_ptr
는 항상 제로를,end_location_ptr
는 항상 바이트 코드로부터 1 을 뺀 값을 포인트 합니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
개시 또는 라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 71 | 1.0 |
권한 | |
필요한 기능 |
파라미터 | ||
이름 | 형 | 설명 |
method |
jmethodID |
조회하는 메소드. |
start_location_ptr |
jlocation * |
돌아왔을 때, 최초의 위치를 포인트 한다. 위치 정보를 얻을 수 없는 경우는 -1 을 포인트 한다. 정보의 사용이 가능해,GetJLocationFormat 가 JVMTI_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_ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
end_location_ptr 가 NULL . |
국소 변수 테이블의 취득
typedef struct { jlocation start_location; jint length; char* name; char* signature; char* generic_signature; jint slot; } jvmtiLocalVariableEntry;jvmtiError GetLocalVariableTable(jvmtiEnv* env, jmethodID method, jint* entry_count_ptr, jvmtiLocalVariableEntry** table_ptr)
국소 변수의 정보를 돌려줍니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 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 를 사용해 해제할 필요가 있다. jvmtiLocalVariableEntry 의 name 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiLocalVariableEntry 의 signature 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiLocalVariableEntry 의 generic_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_ptr 이 NULL . |
JVMTI_ERROR_NULL_POINTER |
table__ptr 가 NULL . |
바이트 코드의 취득
jvmtiError GetBytecodes(jvmtiEnv* env, jmethodID method, jint* bytecode_count_ptr, unsigned char** bytecodes_ptr)
method
로 지정된 메소드를 구현하는 바이트 코드를 돌려줍니다. 바이트 코드의 수는,bytecode_count_ptr
를 개입시켜 돌려주어집니다. 바이트 코드 자체는,bytecodes_ptr
를 개입시켜 돌려주어집니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
개시 또는 라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 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_ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
bytecode_ptr 가 NULL . |
네이티브 메소드인가 어떤가의 검사
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_ptr 가 NULL . |
합성 메소드인가 어떤가의 검사
jvmtiError IsMethodSynthetic(jvmtiEnv* env, jmethodID method, jboolean* is_synthetic_ptr)
method
로 지정된 메소드가 합성 메소드인가 어떤가를 나타내는 값을,is_synthetic_ptr
를 개입시켜 돌려줍니다. 합성 메소드는, 컴파일러에 의해 생성됩니다만, 원의 원시 코드내에는 존재하지 않습니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
개시 또는 라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 77 | 1.0 |
권한 | |
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다. |
|
권한 | 효과 |
can_get_synthetic_attribute |
합성 필드 또는 합성 메소드일지 어떨지를 테스트할 수 있는 - IsFieldSynthetic 와 IsMethodSynthetic |
파라미터 | ||
이름 | 형 | 설명 |
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_ptr 가 NULL . |
폐기된 메소드인가 어떤가의 검사
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_ptr 이 NULL . |
네이티브 메소드 접두사의 설정
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 |
네이티브 메소드를 해결할 수 없는 경우에 적용해야 할 접두사를 설정할 수 있는 - SetNativeMethodPrefix 및 SetNativeMethodPrefixes |
파라미터 | ||
이름 | 형 | 설명 |
prefix |
const char * |
적용하는 접두사. 수정 UTF-8 캐릭터 라인으로서 encode 된다.
에이전트는, char 의 배열을 건네준다. prefix 가 NULL 의 경우, 이 환경의 기존의 접두사가 삭제된다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
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_count
에 0
을 지정해 이 함수를 호출하면(자), 이 환경의 접두사 기능이 무효가 됩니다.
SetNativeMethodPrefix
곳의 함수가, 접두사를 설정하기 위한 2 개의 방법입니다. 1 개의 접두사를 지정해 SetNativeMethodPrefix
를 호출하는 것은,prefix_count
에 1
을 지정해 이 함수를 호출하는 것과 같습니다. NULL
를 지정해 SetNativeMethodPrefix
를 호출하는 것은,prefix_count
에 0
을 지정해 이 함수를 호출하는 것과 같습니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
어느 단계에서도 호출할 수 있다 | 아니오 | 74 | 1.1 |
권한 | |
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 함수를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다. |
|
권한 | 효과 |
can_set_native_method_prefix |
네이티브 메소드를 해결할 수 없는 경우에 적용해야 할 접두사를 설정할 수 있는 - SetNativeMethodPrefix 및 SetNativeMethodPrefixes |
파라미터 | ||
이름 | 형 | 설명 |
prefix_count |
jint |
적용하는 접두사의 수. |
prefixes |
char** |
이 환경에서 적용하는 접두사. 각각 수정 UTF-8 캐릭터 라인으로서 encode 된다.
|
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_MUST_POSSESS_CAPABILITY |
환경은 권한 can_set_native_method_prefix 을 가지지 않는다. AddCapabilities 를 사용한다. |
JVMTI_ERROR_ILLEGAL_ARGUMENT |
prefix_count 가 0 보다 작다. |
JVMTI_ERROR_NULL_POINTER |
prefixes 가 NULL . |
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 |
name 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
monitor_ptr 가 NULL . |
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_table 이 NULL . |
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_table 이 NULL . |
이벤트 관리
이벤트 관리 함수:
이벤트 관리의 형태:
jvmtiEventMode
- 이벤트의 유효화와 무효화
이벤트 콜백의 설정
jvmtiError SetEventCallbacks(jvmtiEnv* env, const jvmtiEventCallbacks* callbacks, jint size_of_callbacks)
이벤트 마다 불려 가는 함수를 설정합니다. 대체 함수 테이블을 제공하는 것으로써, 콜백이 지정됩니다. 함수 테이블의 카피가 작성됩니다. 테이블의 로컬 카피로 변경을 더해도, 원의 테이블에 영향은 없습니다. 이것은 불가분인 처리입니다. 모든 콜백이 동시에 설정됩니다. 이 함수가 불려 갈 때까지, 이벤트는 송신되지 않습니다. 엔트리가 NULL
의 경우, 또는 이벤트가 size_of_callbacks
의 사이즈를 넘었을 경우, 이벤트의 송신은 행해지지 않습니다. 이벤트의 자세한 것은, 이 문서로후술 합니다. 이벤트는, 유효해, 송신된 순서에 콜백을 가지고 있을 필요가 있습니다. 이 함수로 SetEventNotificationMode
가 불려 간 차례는, 결과에 영향을 미치지 않습니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 122 | 1.0 |
권한 | |
필요한 기능 |
파라미터 | ||
이름 | 형 | 설명 |
callbacks |
const jvmtiEventCallbacks * |
새로운 이벤트 콜백.
에이전트는 jvmtiEventCallbacks 에 포인터를 건네준다. callbacks 가 NULL 의 경우, 기존의 호출은 삭제된다. |
size_of_callbacks |
jint |
sizeof(jvmtiEventCallbacks) -- 버젼간의 호환성을 실현. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_ILLEGAL_ARGUMENT |
size_of_callbacks 가 0 보다 작다. |
이벤트 통지 모드의 설정
typedef enum { JVMTI_ENABLE = 1, JVMTI_DISABLE = 0 } jvmtiEventMode;jvmtiError SetEventNotificationMode(jvmtiEnv* env, jvmtiEventMode mode, jvmtiEvent event_type, jthread event_thread, ...)
이벤트의 생성을 제어합니다.
이벤트의 유효화와 무효화 ( jvmtiEventMode
)정수 치 설명 JVMTI_ENABLE
1 mode
가JVMTI_ENABLE
의 경우, 이벤트event_type
가 유효화 된다JVMTI_DISABLE
0 mode
가JVMTI_DISABLE
의 경우, 이벤트event_type
가 무효화된다
thread
가 NULL
의 경우는, 이 이벤트는 글로벌하게 유효 또는 무효로 됩니다. 그렇지 않은 경우는, 특정의 thread에 대해 유효 또는 무효로 됩니다. 특정의 thread에 대해 이벤트가 생성되는 것은, 이벤트가 thread 레벨 또는 글로벌 레벨의 어느 쪽인지로 유효하게 되고 있는 경우입니다.
개개의 이벤트에 대한 정보는,후술 하는 설명을 참조해 주세요.
다음의 이벤트는, 이 함수를 사용해 thread 레벨에서는 제어할 수 없습니다.
VMInit
VMStart
VMDeath
ThreadStart
CompiledMethodLoad
CompiledMethodUnload
DynamicCodeGenerated
DataDumpRequest
처음은, thread 레벨로 유효하게 되고 있는 이벤트도, 글로벌 레벨로 유효하게 되고 있는 이벤트도 없습니다.
이 함수를 호출하기 전에, 필요한 권한 (후술의 「이벤트를 유효화하는 권한」을 참조)을 소유하고 있을 필요가 있습니다.
이벤트의 상세한 것에 대하여는,후술 합니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 2 | 1.0 |
파라미터 | ||
이름 | 형 | 설명 |
mode |
jvmtiEventMode |
JVMTI_ENABLE 또는 JVMTI_DISABLE |
event_type |
jvmtiEvent |
제어하는 이벤트 |
event_thread |
jthread |
제어하는 thread
event_thread 가 NULL 의 경우, 이벤트는 글로벌 레벨로 제어된다. |
... |
... |
장래의 확장용 |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_INVALID_THREAD |
event_thread 가 NULL 이외로, 유효한 thread가 아니다. |
JVMTI_ERROR_THREAD_NOT_ALIVE |
event_thread 가 NULL 이외로, 라이브 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_type
가 JVMTI_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_type 가 JVMTI_EVENT_COMPILED_METHOD_LOAD 로,can_generate_compiled_method_load_events 가 false . |
JVMTI_ERROR_ILLEGAL_ARGUMENT |
event_type 가 JVMTI_EVENT_COMPILED_METHOD_LOAD 도 JVMTI_EVENT_DYNAMIC_CODE_GENERATED 도 아니다. |
JVMTI_ERROR_INVALID_EVENT_TYPE |
event_type 가 jvmtiEvent 는 아니다. |
확장 기능 기구
확장 기능 기구 함수:
확장 기능 기구의 함수형:
확장 기능 기구의 형태:
jvmtiParamTypes
- 확장 함수/이벤트 파라미터의 형태jvmtiParamKind
- 확장 함수/이벤트 파라미터의 종류jvmtiParamInfo
- 확장 함수/이벤트 파라미터 정보jvmtiExtensionFunctionInfo
- 확장 함수 정보jvmtiExtensionEventInfo
- 확장 이벤트 정보
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, ...);
|
확장 함수의 취득
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 를 사용해 해제할 필요가 있다. jvmtiExtensionFunctionInfo 의 id 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiExtensionFunctionInfo 의 short_description 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiExtensionFunctionInfo 의 params 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiParamInfo 의 name 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiExtensionFunctionInfo 의 errors 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_NULL_POINTER |
extension_count_ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
extensions 가 NULL . |
확장 이벤트의 취득
typedef struct { jint extension_event_index; char* id; char* short_description; jint param_count; jvmtiParamInfo* params; } jvmtiExtensionEventInfo;jvmtiError GetExtensionEvents(jvmtiEnv* env, jint* extension_count_ptr, jvmtiExtensionEventInfo** extensions)
확장 이벤트세트를 돌려줍니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 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 를 사용해 해제할 필요가 있다. jvmtiExtensionEventInfo 의 id 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiExtensionEventInfo 의 short_description 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiExtensionEventInfo 의 params 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. jvmtiParamInfo 의 name 필드에 반환되는 포인터는, 새롭게 할당할 수 있었던 배열. 이 배열은,Deallocate 를 사용해 해제할 필요가 있다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_NULL_POINTER |
extension_count_ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
extensions 가 NULL . |
확장 이벤트
구현 고유의 이벤트입니다. 이벤트 핸들러의 설정에는,typedef void (JNICALL *jvmtiExtensionEvent) (jvmtiEnv* jvmti_env, ...); SetExtensionEventCallback 를 사용합니다.
확장 이벤트의 이벤트 핸들러는, 이 정의에 일치하는 것 같은 선언형의 가변 인수가 아니면 안됩니다. 선언형의 가변 인수가 아닌 경우, 일부의 플랫폼에서, 일치하지 않는 규약의 호출이나 미정도리의 동작이 발생할 가능성이 있습니다. 예를 들어, GetExtensionEvents 로부터 반환된 jvmtiParamInfo 에,jint 파라미터의 존재가 나타나고 있는 경우, 이벤트 핸들러를 다음과 같이 선언할 필요가 있습니다.
void JNICALL myHandler(jvmtiEnv* jvmti_env, jint myInt, ...) ... 」(은)는 가변 인수를 나타냅니다.
|
확장 이벤트 콜백의 설정
jvmtiError SetExtensionEventCallback(jvmtiEnv* env, jint extension_event_index, jvmtiExtensionEvent callback)
확장 이벤트에 콜백 함수를 설정해, 이벤트를 유효하게 합니다. 콜백이 NULL
의 경우, 이벤트를 무효로 합니다. 표준 이벤트와는 달라, 콜백을 설정해 이벤트를 유효하게 하는 처리는 단일의 조작입니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
OnLoad 또는 라이브 단계에서 밖에 호출할 수 없다 | 아니오 | 126 | 1.0 |
권한 | |
필요한 기능 |
파라미터 | ||
이름 | 형 | 설명 |
extension_event_index |
jint |
설정하는 콜백을 식별한다. 이 인덱스는,jvmtiExtensionEventInfo 의 extension_event_index 필드. |
callback |
jvmtiExtensionEvent |
callback 가 NULL 이외의 경우,callback 를 이벤트 콜백 함수로 설정해, 이벤트를 유효하게 한다.
callback 가 NULL 의 경우, 이벤트를 무효로 한다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_ILLEGAL_ARGUMENT |
extension_event_index 가 GetExtensionEvents 로부터 반환된 extension_event_index 이 아니다. |
권한
권한 함수:
권한의 형태:
jvmtiCapabilities
- 권한의 구조체
권한 함수에서는, 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
합성 필드 또는 합성 메소드일지 어떨지를 테스트할 수 있는 - IsFieldSynthetic
와IsMethodSynthetic
1.0 can_get_owned_monitor_info
모니터의 소유에 관한 정보를 취득할 수 있는 - GetOwnedMonitorInfo
1.0 can_get_current_contended_monitor
GetCurrentContendedMonitor
를 실행할 수 있다.1.0 can_get_monitor_info
GetObjectMonitorUsage
를 실행할 수 있다.1.0 can_pop_frame
스택으로부터 프레임을 팝 할 수 있는 - PopFrame
1.0 can_redefine_classes
RedefineClasses
로 클래스를 재정의할 수 있다.1.0 can_signal_thread
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
네이티브 메소드를 해결할 수 없는 경우에 적용해야 할 접두사를 설정할 수 있는 - SetNativeMethodPrefix
및SetNativeMethodPrefixes
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_ptr 가 NULL . |
권한의 추가
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_ptr 가 NULL . |
권한의 방폐
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_ptr 가 NULL . |
기능의 취득
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_ptr 가 NULL . |
타이머
타이머 함수:
- 현재의 thread의 CPU 타이머 정보를 취득
- 현재의 thread의 CPU 시간을 취득
- thread의 CPU 타이머 정보를 취득
- thread의 CPU 시간을 취득
- 타이머 정보의 취득
- 시간의 취득
- 사용 가능한 프로세서의 취득
타이머의 형태:
jvmtiTimerInfo
- 타이머 정보jvmtiTimerKind
- 타이머의 종류
이러한 함수는, 타이밍 정보를 제공합니다. 시간이 갱신되는 정밀도는 지정되고 있지 않습니다. 나노초단위의 정밀도가 제공됩니다만, 반드시 나노초단위의 정밀도를 얻을 수 있다고는 할 수 없습니다. 최대치 등, 타이머의 상세 정보에는, 타이머 정보 함수를 사용해 액세스 할 수 있습니다.
타이머 정보
각 타이머의 정보 함수는, 이 데이터 구조체를 돌려줍니다.
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 의 호출중에 변화할 것은 없습니다.
GetCurrentThreadCpuTime
과 GetThreadCpuTime
의 구현이 다른 경우,GetCurrentThreadCpuTimerInfo
와 GetThreadCpuTimerInfo
에 의해 반환되는 값은 다른 일이 있습니다. 상세한 것에 대하여는,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_ptr 가 NULL . |
현재의 thread의 CPU 시간을 취득
jvmtiError GetCurrentThreadCpuTime(jvmtiEnv* env, jlong* nanos_ptr)
현재의 thread에 의해 사용되고 있는 CPU 시간을 돌려줍니다.
GetThreadCpuTime
함수는, 현재의 thread를 포함한 모든 thread의 CPU 시간을 제공합니다. GetCurrentThreadCpuTime
은, 현재의 thread 또는 현재의 thread보다 정밀한 정보를 가지는 thread 이외의 thread의 CPU 시간을 제공할 수 없는 플랫폼을 지원합니다 (GetCurrentThreadCpuTimerInfo
와 GetThreadCpuTimerInfo
를 참조). 많은 플랫폼에서는, 이 호출은 다음의 코드와 동등합니다.
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_ptr 가 NULL . |
thread의 CPU 타이머 정보를 취득
jvmtiError GetThreadCpuTimerInfo(jvmtiEnv* env, jvmtiTimerInfo* info_ptr)
GetThreadCpuTime
타이머의 정보를 가져옵니다. jvmtiTimerInfo
구조체의 필드에, 타이머의 상세가 들어갑니다. 이 정보는, 플랫폼과 GetThreadCpuTime
의 구현에 고유해서, thread 마다 변화하거나 VM 의 호출중에 변화할 것은 없습니다.
GetCurrentThreadCpuTime
과 GetThreadCpuTime
의 구현이 다른 경우,GetCurrentThreadCpuTimerInfo
와 GetThreadCpuTimerInfo
에 의해 반환되는 값은 다른 일이 있습니다. 상세한 것에 대하여는,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_ptr 가 NULL . |
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. thread 가 NULL 의 경우, 현재의 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_ptr 가 NULL . |
타이머 정보의 취득
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_ptr 가 NULL . |
시간의 취득
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_ptr 가 NULL . |
사용 가능한 프로세서의 취득
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_ptr 가 NULL . |
클래스 로더 검색
클래스 로더 검색의 함수:
이러한 함수를 사용하면, 에이전트는, 클래스 로더가 클래스를 검색할 때의 장소를 추가할 수 있습니다. 이것은, 올바른 클래스 로더로 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 |
segment 가 NULL . |
시스템 클래스 로더 검색의 추가
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 |
segment 가 NULL . |
시스템 프로퍼티
시스템 프로퍼티 함수:
이러한 함수는, 시스템 프로퍼티을 취득 및 설정합니다.
시스템 프로퍼티의 취득
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_ptr 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
property_ptr 가 NULL . |
시스템 프로퍼티의 취득
jvmtiError GetSystemProperty(jvmtiEnv* env, const char* property, char** value_ptr)
프로퍼티 키에 의해 지정된 VM 시스템 프로퍼티을 돌려줍니다.
함수 GetSystemProperties
는, 사용 가능한 프로퍼티 키세트를 돌려줍니다. 취득 가능한 프로퍼티은, 실행중에 증가하는 일이 있습니다.
이것은 시스템 프로퍼티의 VM 뷰이므로, 프로퍼티의 값은,java.lang.System.getProperty(String)
에 의해 반환되는 프로퍼티의 값과는 다릅니다. 일반적으로의 VM 는, 클래스의 초기화중에, VM 시스템 프로퍼티의 값을 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 |
property 가 NULL . |
JVMTI_ERROR_NULL_POINTER |
value__ptr 가 NULL . |
시스템 프로퍼티의 설정
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 의 배열을 건네준다. value 가 NULL 의 경우는 값이 설정되지 않지만, 프로퍼티이 기입해 가능하지 않은 경우는 JVMTI_ERROR_NOT_AVAILABLE 가 반환된다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_NOT_AVAILABLE |
이 프로퍼티을 사용할 수 없는, 또는 이 프로퍼티은 기입해 가능하지 않다. |
JVMTI_ERROR_NULL_POINTER |
property 가 NULL . |
전반
전반 함수:
전반의 형태:
jvmtiPhase
- 실행의 단계jvmtiVerboseFlag
- 장황 플래그의 열거jvmtiJlocationFormat
- JLocation 의 형식의 열거
전반의 플래그 및 정수:
단계의 취득
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
단계에서도 라이브 단계에서도 동작합니다.
- CreateRawMonitor
- DestroyRawMonitor
- SetEventCallbacks
- SetEventNotificationMode
- GetExtensionFunctions
- GetExtensionEvents
- SetExtensionEventCallback
- GetPotentialCapabilities
- AddCapabilities
- RelinquishCapabilities
- AddToBootstrapClassLoaderSearch
- AddToSystemClassLoaderSearch
- GetSystemProperties
- GetSystemProperty
다음의 함수는,OnLoad
단계에서만 동작합니다.
다음의 함수는, 개시 단계에서도 라이브 단계에서도 동작합니다.
- GetCurrentThread
- SetThreadLocalStorage
- GetThreadLocalStorage
- GetTag
- SetTag
- GetClassSignature
- GetClassStatus
- GetSourceFileName
- GetClassModifiers
- GetClassMethods
- GetClassFields
- GetImplementedInterfaces
- GetClassVersionNumbers
- GetConstantPool
- IsInterface
- IsArrayClass
- IsModifiableClass
- GetClassLoader
- GetSourceDebugExtension
- GetObjectSize
- GetObjectHashCode
- GetFieldName
- GetFieldDeclaringClass
- GetFieldModifiers
- IsFieldSynthetic
- GetMethodName
- GetMethodDeclaringClass
- GetMethodModifiers
- GetMaxLocals
- GetArgumentsSize
- GetLineNumberTable
- GetMethodLocation
- GetBytecodes
- IsMethodNative
- IsMethodSynthetic
- IsMethodObsolete
- SetJNIFunctionTable
- GetJNIFunctionTable
- GetCurrentThreadCpuTimerInfo
- GetCurrentThreadCpuTime
다음의 함수는, 어느 단계에서도 동작합니다.
- Allocate
- Deallocate
- SetNativeMethodPrefix
- SetNativeMethodPrefixes
- RawMonitorEnter
- RawMonitorExit
- RawMonitorWait
- RawMonitorNotify
- RawMonitorNotifyAll
- GetCapabilities
- GetTimerInfo
- GetTime
- GetAvailableProcessors
- GetPhase
- DisposeEnvironment
- SetEnvironmentLocalStorage
- GetEnvironmentLocalStorage
- GetVersionNumber
- GetErrorName
- SetVerboseFlag
- GetJLocationFormat
JNI 함수 (호출 API 를 제외한다)는, 개시 단계 또는 라이브 단계에서 사용할 필요가 있습니다.
대부분의 JVM TI 이벤트는, 라이브 단계에서 밖에 송신되지 않습니다. 다음의 이벤트는, 그 외의 단계에서 다루어집니다.
단계 | 콜백 안전 | 위치 | 도입된 버젼 |
어느 단계에서도 호출할 수 있다 | 아니오 | 133 | 1.0 |
권한 | |
필요한 기능 |
파라미터 | ||
이름 | 형 | 설명 |
phase_ptr |
jvmtiPhase * |
돌아왔을 때, 단계를 포인트 한다.
에이전트는 jvmtiPhase 에 포인터를 건네준다. 돌아왔을 때,jvmtiPhase 가 설정되어 있다. |
에러 | |
이 함수는,범용 에러, 또는 다음의 에러의 어느쪽이든을 돌려준다 | |
에러 | 설명 |
JVMTI_ERROR_NULL_POINTER |
phase__ptr 가 NULL . |
환경의 파기
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 * |
환경 로컬인 기억 영역에 입력하는 값.
에이전트가 포인터를 건네준다. data 가 NULL 의 경우, 값은 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_ptr 가 NULL . |
버젼 번호의 취득
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_ptr 가 NULL . |
에러명의 취득
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_ptr 가 NULL . |
장황 플래그의 설정
typedef enum { JVMTI_VERBOSE_OTHER = 0, JVMTI_VERBOSE_GC = 1, JVMTI_VERBOSE_CLASS = 2, JVMTI_VERBOSE_JNI = 4 } jvmtiVerboseFlag;jvmtiError SetVerboseFlag(jvmtiEnv* env, jvmtiVerboseFlag flag, jboolean value)
장황 플래그의 열거 ( jvmtiVerboseFlag
)정수 치 설명 JVMTI_VERBOSE_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_ptr 가 NULL . |
에러
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 기저형 | |
형 | 설명 |
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 의 이벤트의 처리중에 트리거되었다고 합시다. 전술의 설명에 있는 순서에 의하면 x 는 y 보다 전에 리포트된다고 하는 경우는, 같은 위치에서 발생한 이벤트 y 가, 현재의 thread 및 위치에 도착해 리포트됩니다. 반대로,x 가 y 보다 전에 리포트되지 않는다고 하는 경우는, 이벤트 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;
이벤트의 색인
- breakpoint
- 클래스 파일 로드 훅
- 클래스의 로드
- 클래스의 준비
- 컴파일이 끝난 메소드의 로드
- 컴파일이 끝난 메소드의 언로드
- 데이터 덤프 요구
- 동적 코드 생성
- 예외
- 예외 캐치
- 필드 액세스
- 필드의 변경
- 프레임의 팝
- 가베지 컬렉션의 완료
- 가베지 컬렉션의 개시
- 메소드 엔트리
- 메소드 종료
- 경합 하는 모니터 개시
- 경합 하는 모니터 개시가 끝난 상태
- 모니터 대기
- 모니터 대기 종료
- 네이티브 메소드의 바인드
- 객체의 해제
- 자원 부족
- 스텝 실행
- thread의 종료
- thread의 개시
- VM 종료 이벤트
- VM 초기화 이벤트
- VM 객체 할당
- VM 개시 이벤트
스텝 실행
void JNICALL SingleStep(jvmtiEnv *jvmti_env, JNIEnv* jni_env, jthread thread, jmethodID method, jlocation location)
스텝 실행 이벤트를 이용하면(자), 에이전트는, VM 로 가능한 최소의 단위로 thread의 실행을 추적할 수 있습니다. 스텝 실행 이벤트는, thread가 새로운 위치에 이를 때마다 생성됩니다. 일반적으로, 스텝 실행 이벤트는,「Java 가상 머신 스펙」에 정의되고 있도록(듯이),1 개의 VM 명령이 완료한 것을 나타냅니다. 다만, 위치의 정의가 다른 구현도 있습니다. 어쨌든,method
및 location
파라미터에 의해 현재의 위치를 일의에 식별할 수 있기 (위해)때문에, 이 정보가 있으면 원시 파일과 행 번호에의 매핑이 가능합니다.
네이티브 메소드내로부터는, 스텝 실행 이벤트는 생성되지 않습니다.
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | 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가 달한 시점에서 생성됩니다. method
및 location
파라미터에 의해 현재의 위치를 일의에 식별할 수 있기 (위해)때문에, 이 정보가 있으면 원시 파일과 행 번호에의 매핑이 가능합니다.
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | 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가 액세스 한 시점에서 생성됩니다. method
및 location
파라미터에 의해 현재의 위치를 일의에 식별할 수 있기 (위해)때문에, 이 정보가 있으면 원시 파일과 행 번호에의 매핑이 가능합니다.
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | 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가 변경한 시점에서 생성됩니다. method
및 location
파라미터에 의해 현재의 위치를 일의에 식별할 수 있기 (위해)때문에, 이 정보가 있으면 원시 파일과 행 번호에의 매핑이 가능합니다.
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | 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 프로그램 언어 코드로부터는 인식되지 않는 경우)는, 예외 이벤트는 생성되지 않습니다.
method
및 location
파라미터에 의해 현재의 위치 (예외가 검출된 위치)를 일의에 식별할 수 있기 (위해)때문에, 이 정보가 있으면 원시 파일과 행 번호에의 매핑이 가능합니다. exception
필드는, throw 된 예외 객체를 인식합니다. catch_method
및 catch_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로서 구현되는 점에 주의해 주세요. 이 때문에, 이것들은 예외 캐치 이벤트를 생성합니다.
method
및 location
파라미터에 의해 현재의 위치를 일의에 식별할 수 있기 (위해)때문에, 이 정보가 있으면 원시 파일과 행 번호에의 매핑이 가능합니다. 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 로 정의되었는지 이름을 지정하지 않고 정의되었을 경우,name 는 NULL 가 된다. |
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 에 의해 컴파일 되어 메모리내에 로드 되는 시점에서 송신됩니다. 언로드되었을 경우,CompiledMethodUnload
이벤트가 송신됩니다. 이동했을 경우, 새로운 CompiledMethodLoad
이벤트에 이어,CompiledMethodUnload
이벤트가 송신됩니다. 단일의 메소드가 복수의 형식에서 컴파일 되어 이 이벤트가 그 형식 마다 송신되는 점에 주의해 주세요. 또, 복수의 메소드가 단일의 주소 범위에 인 라인 되어 이 이벤트가 각 메소드 마다 송신되는 점에도 주의해 주세요.
이러한 이벤트는, 최초의 발생뒤,GenerateEvents
에 의해 송신할 수가 있습니다.
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | JVMTI_EVENT_COMPILED_METHOD_LOAD |
68 | SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_COMPILED_METHOD_LOAD, NULL) |
1.0 |
jvmtiAddrLocationMap - 위치 엔트리의 네이티브 주소 |
||
필드 | 형 | 설명 |
start_address |
const void* |
위치에 대응하는 코드의 개시 네이티브 주소 |
location |
jlocation |
대응하는 위치. 위치의 의미에 대해서는,GetJLocationFormat 를 참조. |
권한 | |
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다. |
|
권한 | 효과 |
can_generate_compiled_method_load_events |
메소드의 컴파일시 또는 언로드시에 이벤트를 생성할 수 있다 |
파라미터 | ||
이름 | 형 | 설명 |
method |
jmethodID |
컴파일 및 로드 되고 있는 메소드 |
code_size |
jint |
컴파일 된 코드의 사이즈 |
code_addr |
const void* |
컴파일 된 메소드 코드가 로드 되는 주소 |
map_length |
jint |
주소 맵내의 jvmtiAddrLocationMap 엔트리의 수. 매핑 정보가 제공되지 않는 경우는 제로. |
map |
const jvmtiAddrLocationMap * |
네이티브 주소와 위치의 매핑. 각 엔트리의 네이티브 주소 범위는,start_address 로부터 다음의 엔트리의 start_address-1 까지. 매핑 정보가 제공되지 않는 경우는 NULL . |
compile_info |
const void* |
VM 고유의 컴파일 정보. 참조되는 컴파일 정보는, VM 에 의해 관리되어 수집을 위해서(때문에) 에이전트에 의존하고 있어서는 안 된다. 이 정보의 내용과 수명은, VM 구현에 의해 정의된다. |
컴파일이 끝난 메소드의 언로드
void JNICALL CompiledMethodUnload(jvmtiEnv *jvmti_env, jmethodID method, const void* code_addr)
컴파일 된 메소드가 메모리로부터 언로드되는 시점에서 송신됩니다. 이 이벤트는, 언로드를 실행한 thread상에 송신되지 않는 것이 있습니다. 이 이벤트는, 언로드의 발생 후에 송신되는 경우가 있습니다. 그러나, 새롭게 생성된 컴파일이 끝난 메소드에 의해 메모리가 재사용되기 전에 송신됩니다. 이 이벤트는, 클래스의 언로드 후에 송신될 가능성이 있습니다.
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | JVMTI_EVENT_COMPILED_METHOD_UNLOAD |
69 | SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_COMPILED_METHOD_UNLOAD, NULL) |
1.0 |
권한 | |
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다. |
|
권한 | 효과 |
can_generate_compiled_method_load_events |
메소드의 컴파일시 또는 언로드시에 이벤트를 생성할 수 있다 |
파라미터 | ||
이름 | 형 | 설명 |
method |
jmethodID |
언로드되는, 컴파일 된 메소드. 언로드되는, 컴파일 된 메소드 컴파일 된 메소드를 식별하는 목적 밖에 가지지 않는다. 클래스는 언로드되기 (위해)때문에, 메소드를 이후의 JNI 또는 JVM TI 함수의 인수로서 사용할 수 없다. |
code_addr |
const void* |
컴파일 된 메소드 코드가 로드 된 주소. 컴파일 된 메소드를 식별하는 목적 밖에 가지지 않는다. 공간은 재생되고 있을 가능성이 있다. |
동적 코드 생성
void JNICALL DynamicCodeGenerated(jvmtiEnv *jvmti_env, const char* name, const void* address, jint length)
가상 머신의 컴퍼넌트가 동적으로 생성될 때 송신됩니다. 이것은, 컴파일 되는 Java 프로그램 언어 코드에는 대응하지 않습니다 (CompiledMethodLoad
를 참조). 이것은 native code전용이 아닙니다. 예를 들어, 생성되는 interpreter는, 커멘드행 옵션에 따라서 다릅니다.
이 이벤트에는, 제어 기능은 없습니다. VM 는, 이러한 이벤트를 생성할 수 없는 경우, 아무것도 송신하지 않습니다.
이러한 이벤트는, 최초의 발생뒤,GenerateEvents
에 의해 송신할 수가 있습니다.
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
초기 단계, 개시 단계, 및 라이브 단계에서 송신된다 | JVMTI_EVENT_DYNAMIC_CODE_GENERATED |
70 | SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_DYNAMIC_CODE_GENERATED, NULL) |
1.0 |
권한 | |
필요한 기능 |
파라미터 | ||
이름 | 형 | 설명 |
name |
const char* |
코드의 이름. 수정 UTF-8 캐릭터 라인으로서 encode 된다. 최종 사용자에의 표시용. 이름은 일의가 아니어도 좋다. |
address |
const void* |
코드의 네이티브 주소 |
length |
jint |
코드의 길이 (바이트 단위) |
데이터 덤프 요구
void JNICALL DataDumpRequest(jvmtiEnv *jvmti_env)
VM 에 의해 송신되어 에이전트에 데이터를 덤프 하도록(듯이) 요구합니다. 이것은 단지 시사하고 있는 것만으로 있어, 에이전트는 이 이벤트에 반드시 반응할 필요는 없습니다. 이것은, 사용자로부터의 커멘드행 시그널을 처리하는 경우에 편리합니다. 예를 들어, JDK 의 경우, Win32 상에서는 Ctrl+Break 키, Solaris 상에서는 Ctrl+\ 키로, 이 이벤트는 VM 로부터 에이전트에 송신됩니다.
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | JVMTI_EVENT_DATA_DUMP_REQUEST |
71 | SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_DATA_DUMP_REQUEST, NULL) |
1.0 |
권한 | |
필요한 기능 |
파라미터 | ||
이름 | 형 | 설명 |
경합 하는 모니터 개시
void JNICALL MonitorContendedEnter(jvmtiEnv *jvmti_env, JNIEnv* jni_env, jthread thread, jobject object)
thread가 Java 프로그램 언어 모니터에 들어가려고 했을 때, 그 모니터가 벌써 다른 thread에 의해 획득되고 있는 경우에 송신됩니다.
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | JVMTI_EVENT_MONITOR_CONTENDED_ENTER |
75 | SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_MONITOR_CONTENDED_ENTER, NULL) |
1.0 |
권한 | |
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다. |
|
권한 | 효과 |
can_generate_monitor_events |
모니터의 사용율에 관한 이벤트를 생성할 수 있다 |
파라미터 | ||
이름 | 형 | 설명 |
jni_env |
JNIEnv * |
이벤트의 현재의 thread의 JNI 환경 |
thread |
jthread |
모니터에 들어가려고 하는 thread의 JNI 로컬 참조 |
object |
jobject |
모니터의 JNI 로컬 참조 |
경합 하는 모니터 개시가 끝난 상태
void JNICALL MonitorContendedEntered(jvmtiEnv *jvmti_env, JNIEnv* jni_env, jthread thread, jobject object)
다른 thread가 Java 프로그램 언어 모니터를 해제하는 것을 기다린 후에, thread가 그 Java 모니터에 들어갈 때 송신됩니다.
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | JVMTI_EVENT_MONITOR_CONTENDED_ENTERED |
76 | SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_MONITOR_CONTENDED_ENTERED, NULL) |
1.0 |
권한 | |
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다. |
|
권한 | 효과 |
can_generate_monitor_events |
모니터의 사용율에 관한 이벤트를 생성할 수 있다 |
파라미터 | ||
이름 | 형 | 설명 |
jni_env |
JNIEnv * |
이벤트의 현재의 thread의 JNI 환경 |
thread |
jthread |
모니터에 들어가는 thread의 JNI 로컬 참조 |
object |
jobject |
모니터의 JNI 로컬 참조 |
모니터 대기
void JNICALL MonitorWait(jvmtiEnv *jvmti_env, JNIEnv* jni_env, jthread thread, jobject object, jlong timeout)
thread가 객체를 대기하려고 하고 있을 때 송신됩니다.
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | JVMTI_EVENT_MONITOR_WAIT |
73 | SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_MONITOR_WAIT, NULL) |
1.0 |
권한 | |
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다. |
|
권한 | 효과 |
can_generate_monitor_events |
모니터의 사용율에 관한 이벤트를 생성할 수 있다 |
파라미터 | ||
이름 | 형 | 설명 |
jni_env |
JNIEnv * |
이벤트의 현재의 thread의 JNI 환경 |
thread |
jthread |
대기하려고 하는 thread의 JNI 로컬 참조 |
object |
jobject |
모니터의 JNI 로컬 참조 |
timeout |
jlong |
thread가 대기하는 시간 (단위는 밀리 세컨드). |
모니터 대기 종료
void JNICALL MonitorWaited(jvmtiEnv *jvmti_env, JNIEnv* jni_env, jthread thread, jobject object, jboolean timed_out)
thread가 객체의 대기를 종료할 경우에 송신됩니다.
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | JVMTI_EVENT_MONITOR_WAITED |
74 | SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_MONITOR_WAITED, NULL) |
1.0 |
권한 | |
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다. |
|
권한 | 효과 |
can_generate_monitor_events |
모니터의 사용율에 관한 이벤트를 생성할 수 있다 |
파라미터 | ||
이름 | 형 | 설명 |
jni_env |
JNIEnv * |
이벤트의 현재의 thread의 JNI 환경 |
thread |
jthread |
대기를 종료한 thread의 JNI 로컬 참조 |
object |
jobject |
모니터의 JNI 로컬 참조 |
timed_out |
jboolean |
모니터가 타임 아웃이 되었을 경우 true |
자원 부족
void JNICALL ResourceExhausted(jvmtiEnv *jvmti_env, JNIEnv* jni_env, jint flags, const void* reserved, const char* description)
실행중의 어플리케이션이 필요로 하는 VM 자원이 다 써 버려졌을 때에 송신됩니다. 임의의 권한에 의해 필요하게 되는 것을 제외하면, 부족을 보고하는 자원 세트는 구현에 의존합니다.
다음의 비트 플래그는, 자원 부족의 프로퍼티을 정의합니다.
자원 부족 플래그 정수 치 설명 JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR
0x0001 이 이벤트가 반환된 뒤, VM 는 java.lang.OutOfMemoryError
를 throw 한다.JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP
0x0002 VM 가, JavaTM 플랫폼의 「heap」로부터 메모리를 할당할 수가 없었다. 「heap」란, 모든 클래스 인스턴스 및 배열의 메모리의 할당원이 되는 실행시 데이터 영역이다. JVMTI_RESOURCE_EXHAUSTED_THREADS
0x0004 VM 가 thread를 작성할 수 없었다.
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | JVMTI_EVENT_RESOURCE_EXHAUSTED |
80 | SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_RESOURCE_EXHAUSTED, NULL) |
1.1 |
권한 | |
필요한 기능 | |
임의의 기능 | |
권한 | 효과 |
can_generate_resource_exhaustion_heap_events |
VM 가heap로부터 메모리의 할당을 실시할 수 없는 경우에, 이벤트를 생성할 수 있다. |
can_generate_resource_exhaustion_threads_events |
VM 가thread를 작성할 수 없는 경우에 이벤트를 생성할 수 있다. |
파라미터 | ||
이름 | 형 | 설명 |
jni_env |
JNIEnv * |
이벤트의 현재의 thread의 JNI 환경 |
flags |
jint |
자원 부족 플래그로 지정되는, 자원 부족의 프로퍼티을 정의하는 플래그. |
reserved |
const void* |
예약이 끝난 상태. |
description |
const char* |
자원 부족의 설명. 수정 UTF-8 캐릭터 라인으로서 encode 된다. |
VM 객체 할당
void JNICALL VMObjectAlloc(jvmtiEnv *jvmti_env, JNIEnv* jni_env, jthread thread, jobject object, jclass object_klass, jlong size)
메소드에 의해, 가상 머신이 Java 프로그램 언어 코드에 대해서 가시의 객체를 할당해 그 외의 구현 기구가 이 할당을 검출할 수 없는 경우에 송신됩니다. 일반적으로, 객체 할당은, 할당하는 메소드의 바이트 코드를 구현하는 것에 의해 검출됩니다. JNI 함수 호출에 의해, native code로 생성된 객체 할당은,JNI 함수의 차단에 의해 검출됩니다. 바이트 코드에 관련지을 수 있지 않고, 네이티브가 아닌 메소드는, VM 에 의해 직접 실행됩니다. 이 이벤트는, 이러한 메소드에 의해 송신됩니다. 가상 머신이, 이러한 메소드의 일부 또는 모두에 대해서 바이트 코드를 구현할 수 없는 경우, 이 이벤트가 송신되는 일이 있습니다.
다음에, 이 이벤트가 송신되는 전형적인 사례를 나타냅니다.
- 리플렉션 -- 예를 들어,
java.lang.Class.newInstance()
- 바이트 코드로 나타내지지 않은 메소드 -- 예를 들어, VM 인트린시크스와 J2ME 프리로드크라스
다음의 경우, 이 이벤트는 생성되지 않습니다.
- 바이트 코드에 의한 할당 -- 예를 들어,
new
및newarray
VM 명령 - JNI 함수 호출에 의한 할당 -- 예를 들어,
AllocObject
- VM 초기화중의 할당
- VM 내부 객체
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | JVMTI_EVENT_VM_OBJECT_ALLOC |
84 | SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_VM_OBJECT_ALLOC, NULL) |
1.0 |
권한 | |
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다. |
|
권한 | 효과 |
can_generate_vm_object_alloc_events |
객체의 VM 할당해에 관한 이벤트를 생성할 수 있다 |
파라미터 | ||
이름 | 형 | 설명 |
jni_env |
JNIEnv * |
이벤트의 현재의 thread의 JNI 환경 |
thread |
jthread |
객체를 할당하는 thread |
object |
jobject |
할당할 수 있었던 객체의 JNI 로컬 참조 |
object_klass |
jclass |
객체의 클래스의 JNI 로컬 참조 |
size |
jlong |
객체의 사이즈 (바이트 단위). GetObjectSize 를 참조 |
객체의 해제
void JNICALL ObjectFree(jvmtiEnv *jvmti_env, jlong tag)
객체의 해제 이벤트는, 가비지 컬렉터가 객체를 해제한 시점에서 송신됩니다. 이벤트는, 태그 첨부 객체의 경우에게만 송신됩니다 (「heap 함수」를 참조).
이벤트 핸들러는, 특별히 사용이 허가되고 있는 JVM TI 함수 이외의 함수 및 JNI 함수를 사용할 수 없습니다 (raw 모니터 함수, 메모리 관리 함수, 환경 로컬 기억 영역 함수를 참조).
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | JVMTI_EVENT_OBJECT_FREE |
83 | SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_OBJECT_FREE, NULL) |
1.0 |
권한 | |
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다. |
|
권한 | 효과 |
can_generate_object_free_events |
가비지 컬렉터가 객체를 해제할 경우에 이벤트를 생성할 수 있다. |
파라미터 | ||
이름 | 형 | 설명 |
tag |
jlong |
해제되는 객체의 태그 |
가베지 컬렉션의 개시
void JNICALL GarbageCollectionStart(jvmtiEnv *jvmti_env)
가베지 컬렉션의 개시 이벤트는, 가베지 컬렉션의 전사이클이 개시되었을 때 송신됩니다. 처리를 정지하는 (stop-the-world) 컬렉션, 즉 모든 thread가 Java 가상 머신의 상태의 변경을 종료하고 있는 동안에 수집되는 컬렉션만이 리포트됩니다. 이 때문에, 수집가에 따라서는, 이러한 이벤트를 생성하지 않습니다. 이 이벤트는, VM 가 아직 정지하고 있는 동안에 송신되므로, 이벤트 핸들러는, 특별히 사용이 허가되고 있는 JVM TI 함수 이외의 함수 및 JNI 함수를 사용할 수 없습니다 (raw 모니터 함수, 메모리 관리 함수, 환경 로컬 기억 영역 함수를 참조).
이 이벤트는, 항상 GarbageCollectionFinish
와 일치하는 페어 (어느 쪽의 이벤트도 유효로 간주해진다)로서 송신되어 이러한 사이에, 가베지 컬렉션 이벤트는 발생하지 않습니다.
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | JVMTI_EVENT_GARBAGE_COLLECTION_START |
81 | SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_START, NULL) |
1.0 |
권한 | |
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다. |
|
권한 | 효과 |
can_generate_garbage_collection_events |
가베지 컬렉션의 개시 또는 종료시에 이벤트를 생성할 수 있다 |
파라미터 | ||
이름 | 형 | 설명 |
가베지 컬렉션의 완료
void JNICALL GarbageCollectionFinish(jvmtiEnv *jvmti_env)
가베지 컬렉션의 종료 이벤트는, 가베지 컬렉션의 전사이클이 종료했을 때 송신됩니다. 이 이벤트는, VM 가 아직 정지하고 있는 동안에 송신되므로, 이벤트 핸들러는, 특별히 사용이 허가되고 있는 JVM TI 함수 이외의 함수 및 JNI 함수를 사용할 수 없습니다 (raw 모니터 함수, 메모리 관리 함수, 환경 로컬 기억 영역 함수를 참조).
일부의 에이전트는, 허가되어 있지 않은 JVM TI 또는 JNI 함수를 사용할 필요가 있는, 가베지 컬렉션 후의 조작을 실시할 필요가 있습니다. 그러한 경우, raw 모니터로 대기하는 에이전트 thread를 작성할 수 있어 가베지 컬렉션의 종료 이벤트에서는, 단지 raw 모니터에 통지합니다.
이 이벤트는, 항상 GarbageCollectionStart
와 일치하는 페어 (어느 쪽의 이벤트도 유효로 간주해진다)로서 송신됩니다.
단계 | 이벤트형 | 번호 | 유효화 | 도입된 버젼 |
라이브 단계에서 밖에 송신되지 않는다 | JVMTI_EVENT_GARBAGE_COLLECTION_FINISH |
82 | SetEventNotificationMode (JVMTI_ENABLE, JVMTI_EVENT_GARBAGE_COLLECTION_FINISH, NULL) |
1.0 |
권한 | |
임의의 기능: 모든 가상 머신에 구현해서는 안 된다. 이 이벤트를 사용하기 위해서는, 다음의 권한 (GetCapabilities 로부터 반환된다)이 true 가 아니면 안된다. |
|
권한 | 효과 |
can_generate_garbage_collection_events |
가베지 컬렉션의 개시 또는 종료시에 이벤트를 생성할 수 있다 |
파라미터 | ||
이름 | 형 | 설명 |
정수의 색인
JVMTI_CLASS_STATUS_ARRAY
JVMTI_CLASS_STATUS_ERROR
JVMTI_CLASS_STATUS_INITIALIZED
JVMTI_CLASS_STATUS_PREPARED
JVMTI_CLASS_STATUS_PRIMITIVE
JVMTI_CLASS_STATUS_VERIFIED
JVMTI_DISABLE
JVMTI_ENABLE
JVMTI_HEAP_FILTER_CLASS_TAGGED
JVMTI_HEAP_FILTER_CLASS_UNTAGGED
JVMTI_HEAP_FILTER_TAGGED
JVMTI_HEAP_FILTER_UNTAGGED
JVMTI_HEAP_OBJECT_EITHER
JVMTI_HEAP_OBJECT_TAGGED
JVMTI_HEAP_OBJECT_UNTAGGED
JVMTI_HEAP_REFERENCE_ARRAY_ELEMENT
JVMTI_HEAP_REFERENCE_CLASS
JVMTI_HEAP_REFERENCE_CLASS_LOADER
JVMTI_HEAP_REFERENCE_CONSTANT_POOL
JVMTI_HEAP_REFERENCE_FIELD
JVMTI_HEAP_REFERENCE_INTERFACE
JVMTI_HEAP_REFERENCE_JNI_GLOBAL
JVMTI_HEAP_REFERENCE_JNI_LOCAL
JVMTI_HEAP_REFERENCE_MONITOR
JVMTI_HEAP_REFERENCE_OTHER
JVMTI_HEAP_REFERENCE_PROTECTION_DOMAIN
JVMTI_HEAP_REFERENCE_SIGNERS
JVMTI_HEAP_REFERENCE_STACK_LOCAL
JVMTI_HEAP_REFERENCE_STATIC_FIELD
JVMTI_HEAP_REFERENCE_SUPERCLASS
JVMTI_HEAP_REFERENCE_SYSTEM_CLASS
JVMTI_HEAP_REFERENCE_THREAD
JVMTI_HEAP_ROOT_JNI_GLOBAL
JVMTI_HEAP_ROOT_JNI_LOCAL
JVMTI_HEAP_ROOT_MONITOR
JVMTI_HEAP_ROOT_OTHER
JVMTI_HEAP_ROOT_STACK_LOCAL
JVMTI_HEAP_ROOT_SYSTEM_CLASS
JVMTI_HEAP_ROOT_THREAD
JVMTI_ITERATION_ABORT
JVMTI_ITERATION_CONTINUE
JVMTI_ITERATION_IGNORE
JVMTI_JAVA_LANG_THREAD_STATE_BLOCKED
JVMTI_JAVA_LANG_THREAD_STATE_MASK
JVMTI_JAVA_LANG_THREAD_STATE_NEW
JVMTI_JAVA_LANG_THREAD_STATE_RUNNABLE
JVMTI_JAVA_LANG_THREAD_STATE_TERMINATED
JVMTI_JAVA_LANG_THREAD_STATE_TIMED_WAITING
JVMTI_JAVA_LANG_THREAD_STATE_WAITING
JVMTI_JLOCATION_JVMBCI
JVMTI_JLOCATION_MACHINEPC
JVMTI_JLOCATION_OTHER
JVMTI_KIND_ALLOC_ALLOC_BUF
JVMTI_KIND_ALLOC_BUF
JVMTI_KIND_IN
JVMTI_KIND_IN_BUF
JVMTI_KIND_IN_PTR
JVMTI_KIND_OUT
JVMTI_KIND_OUT_BUF
JVMTI_PHASE_DEAD
JVMTI_PHASE_LIVE
JVMTI_PHASE_ONLOAD
JVMTI_PHASE_PRIMORDIAL
JVMTI_PHASE_START
JVMTI_PRIMITIVE_TYPE_BOOLEAN
JVMTI_PRIMITIVE_TYPE_BYTE
JVMTI_PRIMITIVE_TYPE_CHAR
JVMTI_PRIMITIVE_TYPE_DOUBLE
JVMTI_PRIMITIVE_TYPE_FLOAT
JVMTI_PRIMITIVE_TYPE_INT
JVMTI_PRIMITIVE_TYPE_LONG
JVMTI_PRIMITIVE_TYPE_SHORT
JVMTI_REFERENCE_ARRAY_ELEMENT
JVMTI_REFERENCE_CLASS
JVMTI_REFERENCE_CLASS_LOADER
JVMTI_REFERENCE_CONSTANT_POOL
JVMTI_REFERENCE_FIELD
JVMTI_REFERENCE_INTERFACE
JVMTI_REFERENCE_PROTECTION_DOMAIN
JVMTI_REFERENCE_SIGNERS
JVMTI_REFERENCE_STATIC_FIELD
JVMTI_RESOURCE_EXHAUSTED_JAVA_HEAP
JVMTI_RESOURCE_EXHAUSTED_OOM_ERROR
JVMTI_RESOURCE_EXHAUSTED_THREADS
JVMTI_THREAD_MAX_PRIORITY
JVMTI_THREAD_MIN_PRIORITY
JVMTI_THREAD_NORM_PRIORITY
JVMTI_THREAD_STATE_ALIVE
JVMTI_THREAD_STATE_BLOCKED_ON_MONITOR_ENTER
JVMTI_THREAD_STATE_IN_NATIVE
JVMTI_THREAD_STATE_IN_OBJECT_WAIT
JVMTI_THREAD_STATE_INTERRUPTED
JVMTI_THREAD_STATE_PARKED
JVMTI_THREAD_STATE_RUNNABLE
JVMTI_THREAD_STATE_SLEEPING
JVMTI_THREAD_STATE_SUSPENDED
JVMTI_THREAD_STATE_TERMINATED
JVMTI_THREAD_STATE_VENDOR_1
JVMTI_THREAD_STATE_VENDOR_2
JVMTI_THREAD_STATE_VENDOR_3
JVMTI_THREAD_STATE_WAITING
JVMTI_THREAD_STATE_WAITING_INDEFINITELY
JVMTI_THREAD_STATE_WAITING_WITH_TIMEOUT
JVMTI_TIMER_ELAPSED
JVMTI_TIMER_TOTAL_CPU
JVMTI_TIMER_USER_CPU
JVMTI_TYPE_CCHAR
JVMTI_TYPE_CVOID
JVMTI_TYPE_JBOOLEAN
JVMTI_TYPE_JBYTE
JVMTI_TYPE_JCHAR
JVMTI_TYPE_JCLASS
JVMTI_TYPE_JDOUBLE
JVMTI_TYPE_JFIELDID
JVMTI_TYPE_JFLOAT
JVMTI_TYPE_JINT
JVMTI_TYPE_JLONG
JVMTI_TYPE_JMETHODID
JVMTI_TYPE_JNIENV
JVMTI_TYPE_JOBJECT
JVMTI_TYPE_JSHORT
JVMTI_TYPE_JTHREAD
JVMTI_TYPE_JVALUE
JVMTI_VERBOSE_CLASS
JVMTI_VERBOSE_GC
JVMTI_VERBOSE_JNI
JVMTI_VERBOSE_OTHER
JVMTI_VERSION_INTERFACE_JNI
JVMTI_VERSION_INTERFACE_JVMTI
JVMTI_VERSION_MASK_INTERFACE_TYPE
JVMTI_VERSION_MASK_MAJOR
JVMTI_VERSION_MASK_MICRO
JVMTI_VERSION_MASK_MINOR
JVMTI_VERSION_SHIFT_MAJOR
JVMTI_VERSION_SHIFT_MICRO
JVMTI_VERSION_SHIFT_MINOR
JVMTI_VISIT_ABORT
JVMTI_VISIT_OBJECTS
변경 이력
최종 갱신일:06/08/06 22:33:32
파일의 버젼:@(#) jvmti.xml 1.202
버젼: 1.1. 102
JVM TI 스펙은 발전중의 문서이며, 메이저, 마이너, 마이크로의 각 버젼 번호를 가집니다. 자원판의 스펙은, 메이저 버젼과 마이너 버젼에 의해 일의에 식별됩니다. 이 스펙에 포함되는 함수, 이벤트, 및 권한에는, 「도입된 버젼」치가 나타나고 있습니다. 이것은, 그러한 기능이 도입된 메이저 버젼과 마이너 버젼입니다. VM 가 구현하고 있는 스펙의 버젼을 실행시에 가져오려면 ,GetVersionNumber
함수를 사용합니다.