Определите размер класса Java от JNI JClass
-
12-11-2019 - |
Вопрос
Я использую JNI, чтобы проанализировать некоторую программу.Я просто задаюсь вопросом, после получения ссылки JClass, как можно найти размер базового класса?
Например: CLASS CLS= Env-> FindClass («Lee / Boehm / Test»);
отсюда, как я могу оценить размер класса Lee.boehm.test внутри кучи горячей точки?
Спасибо Boehm
Решение
Здесь вы идете
agent.c.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 / включить --shared -fpic -o libagent.so agent.c.c
java -agentpath: ./ libagent.so test
Другие советы
hmmm .... если вы имеете в виду размер байтов класса, то да ..... вы бы использовали JVMTI для ретрансляции класса, касающиеся события ClassLoadhook, которое вы слушаете, и это может дать вамБайты класса и размер .... Но они будут идентичны файлу .class на диске .... Но если класс динамически сгенерирован и вот почему вы не можете просто посмотреть размер файла .ClassЭта техника будет работать ..... Я могу написать код для вас, если хотите.