2011-02-12 22 views
1

我正在使用JNI來分析一些程序。我只是想知道,在獲得jclass引用後,如何找到底層類的大小?從JNI中確定Java類的大小jclass

例如: class cls = env-> FindClass(「Lee/Boehm/Test」);

從這裏我如何評估熱點堆內的類Lee.Boehm.Test的大小?

謝謝 貝姆

回答

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 -o libagent.so ag ent.c

的Java -agentpath:./ libagent.so測試

0

嗯....如果你指的是類的字節大小,然後是.....你可以使用JVMTI來重新轉換有關的類,它會產生一個classloadhook事件你聽,這可能會給你類的字節和大小....但它們將與磁盤上的.class文件相同....但如果該類是動態生成的,那就是爲什麼你不能只看在.class文件的大小,然後這種技術將工作.....我可以爲你寫代碼,如果你想。

+0

嗨保羅,感謝您的回答,但我的意思是在虛擬機內部的類的內存表示。 – boehm 2011-02-12 15:19:06