2011-02-12 20 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