我正在使用JNI來分析一些程序。我只是想知道,在獲得jclass引用後,如何找到底層類的大小?從JNI中確定Java類的大小jclass
例如: class cls = env-> FindClass(「Lee/Boehm/Test」);
從這裏我如何評估熱點堆內的類Lee.Boehm.Test的大小?
謝謝 貝姆
我正在使用JNI來分析一些程序。我只是想知道,在獲得jclass引用後,如何找到底層類的大小?從JNI中確定Java類的大小jclass
例如: class cls = env-> FindClass(「Lee/Boehm/Test」);
從這裏我如何評估熱點堆內的類Lee.Boehm.Test的大小?
謝謝 貝姆
在這裏你去
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測試
嗯....如果你指的是類的字節大小,然後是.....你可以使用JVMTI來重新轉換有關的類,它會產生一個classloadhook事件你聽,這可能會給你類的字節和大小....但它們將與磁盤上的.class文件相同....但如果該類是動態生成的,那就是爲什麼你不能只看在.class文件的大小,然後這種技術將工作.....我可以爲你寫代碼,如果你想。
嗨保羅,感謝您的回答,但我的意思是在虛擬機內部的類的內存表示。 – boehm 2011-02-12 15:19:06