2011-02-12 3 views
1

일부 프로그램을 분석하는 데 JNI를 사용하고 있습니다. jclass 레퍼런스를 얻은 후에, 기본 클래스의 크기를 찾는 것이 어떻게 가능할까요?JNI jclass에서 Java 클래스 크기를 결정하십시오.

예 : class cls = env-> FindClass ("Lee/Boehm/Test");

여기에서 어떻게 핫스팟의 힙 내부에서 Lee.Boehm.Test 클래스의 크기를 평가할 수 있습니까?

는 클래스 바이트의 크기를 의미하는 경우 다음 네 ..... 당신이 classloadhook 이벤트를 생성 할 문제의 클래스를 재 변환하는 JVMTI를 사용합니다 .... 당신에게 뵘

답변

1

당신은

agent.c

#include <stdlib.h> 
#include "jvmti.h" 

jvmtiEnv *globalJVMTIInterface; 

JNIEXPORT jlong JNICALL Java_util_Util_getObjectSize 
    (JNIEnv *jni_env , jclass class , jobject object) { 

    jlong objectSize; 

    (*globalJVMTIInterface)->GetObjectSize(globalJVMTIInterface, object, &objectSize); 

    return objectSize; 
} 

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

    jint returnCode = (*jvm)->GetEnv(jvm, (void **) &globalJVMTIInterface, 
     JVMTI_VERSION_1_0); 

    if (returnCode != JNI_OK) 
    { 
     fprintf(stderr, 
      "The version of JVMTI requested (1.0) is not supported by this JVM.\n"); 
     return JVMTI_ERROR_UNSUPPORTED_VERSION; 
    } 

    return JVMTI_ERROR_NONE; 
} 

및 ./util/Util.java

package util; 

public class Util { 
    public static final native long getObjectSize(Object obj); 
} 

및 Test.java

public class Test { 

    public static void main(String[] args) { 

     System.out.println(util.Util.getObjectSize(new String())); 

    } 

} 

GCC 이동 -I /opt/ibm-jdk-bin-1.6.0.9/include -shared -fPIC -l libagent.so ag ent.c

자바 -agentpath : ./ 테스트

0

흠 감사하는 당신이 듣고 이것은 당신에게 클래스 바이트와 크기를 줄 수 있습니다 ....하지만 디스크의 .class 파일과 동일합니다 ....하지만 클래스가 동적으로 생성되고 왜 그냥 볼 수 없는지 .class 파일의 크기라면이 기술은 작동 할 것입니다 ..... 원하는 경우 코드를 작성할 수 있습니다. 여기

+0

안녕 폴 libagent.so, 답변 주셔서 감사하지만, 내가 가상 머신 내부 클래스의 메모리 표현을 의미한다. – boehm

+0

아 ... 좋아, 개체 인스턴스 크기 .... –

관련 문제