Java Instrument (6) 동적 재 정의 Class
즉, agentmain 의 방법 은 입 구 를 호출 하 는 것 입 니까? 아니면 sun 자체 가 제공 하 는 Instrumentation 의 redfineClasses 방법 으로 classes 를 교체 해 야 합 니까?
public static void agentmain(String agentArgs, Instrumentation inst) {
ClassDefinition def1 = new ClassDefinition(Class, classByte);
inst.redefineClasses(new ClassDefinition[]{def1});
}
sun. intrument. InstrumentationImpl 에서 redefineClasses 는 native redefineClasses 0 을 호출 하 는 방법 입 니 다.private native void
redefineClasses0(long nativeAgent, ClassDefinition[] definitions)
throws ClassNotFoundException;
JNIEXPORT void JNICALL Java_sun_instrument_InstrumentationImpl_redefineClasses0
(JNIEnv * jnienv, jobject implThis, jlong agent, jobjectArray classDefinitions) {
redefineClasses(jnienv, (JPLISAgent*)(intptr_t)agent, classDefinitions);
}
다음은 redefineClasses 의 일부 코드 입 니 다.void redefineClasses(JNIEnv * jnienv, JPLISAgent * agent, jobjectArray classDefinitions) {
if (!errorOccurred) {
getDefinitionClassMethodID = (*jnienv)->GetMethodID( jnienv,
classDefClass,
"getDefinitionClass",
"()Ljava/lang/Class;");
......
}
if (!errorOccurred) {
getDefinitionClassFileMethodID = (*jnienv)->GetMethodID( jnienv,
classDefClass,
"getDefinitionClassFile",
"()[B");
.....
}
classDefs[i].klass = (*jnienv)->CallObjectMethod(jnienv, classDef, getDefinitionClassMethodID);
...
targetFiles[i] = (*jnienv)->CallObjectMethod(jnienv, classDef, getDefinitionClassFileMethodID);
....
classDefs[i].class_byte_count = (*jnienv)->GetArrayLength(jnienv, targetFiles[i]);
if (!errorOccurred) {
jvmtiError errorCode = JVMTI_ERROR_NONE;
errorCode = (*jvmtienv)->RedefineClasses(jvmtienv, numDefs, classDefs);
.....
}
}
전 달 된 ClassDefinition 의 class 대상 과 수정 해 야 할 바이트 코드 를 가 져 와 JVMTI 의 RedefineClasses 방법 을 호출 하 였 습 니 다.
JvmtiEnv::RedefineClasses(jint class_count, const jvmtiClassDefinition* class_definitions) {
//TODO: add locking
VM_RedefineClasses op(class_count, class_definitions, jvmti_class_load_kind_redefine);
VMThread::execute(&op);
return (op.check_error());
} /* end RedefineClasses */
그 다음 에 VM Thread 에 맡 겼 습 니 다. 왜 VM Thread 에 맡 겼 습 니까? Class 내용 을 수정 하려 면 Safepoint 에 들 어가 야 하 는 점 은 stop - World 의 작업 이 고 VM Thread 의 작업 은 모두 Safepoint 에 들 어 갑 니 다.
RedefineClasses 는 3 부분 으로 나 뉘 는데 jvmti RedefineClasses. cpp 를 참고 하면 첫 번 째 는 doit 입 니 다.prologue 이 자바 Thread 에서 호출 되 는 것 은 주로 해석 과 검증 으로 전 달 된 by tecode 생 성 scrash 입 니 다.class
세 번 째 는 doitepilogue()
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
IntelliJ IDEA 2019.2의 새로운 기능 프로파일 러를 사용해 보았습니다.이번의 새로운 기능은 초호화! 저는 퍼포먼스 개선을 자주 합니다만, IntelliJ IDEA에도 프로파일링 툴이 붙게 되었으므로, 사용해 보았습니다. 편리한 것 같았기 때문에, 앞으로의 메인 웨폰은 이것이 될 것 같...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.