我正在使用JNI来分析某些程序。我只是想知道,在获得jclass引用之后,如何找到底层类的大小?
例如: class cls = env-> FindClass(“Lee / Boehm / Test”);
从这里我如何评估热点堆内Lee.Boehm.Test类的大小?
谢谢 波姆
答案 0 :(得分: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 agent.c
java -agentpath:./ libagent.so测试
答案 1 :(得分:0)
嗯....如果你的意思是类字节的大小然后是.....你将使用jvmti重新转换有问题的类,它会生成你监听的classloadhook事件,这可能会给你类字节和大小....但它们将与磁盘上的.class文件相同....但如果该类是动态生成的,那就是为什么你不能只看到.class文件的大小然后这种技术可行.....我可以为你编写代码。