Déterminez la taille de la classe Java de JNI JCLASS
-
12-11-2019 - |
Question
J'utilise JNI pour analyser un programme. Je me demande juste, après avoir obtenu la référence JClass, comment est-il possible de trouver la taille de la classe sous-jacente?
Par exemple: classe cls = env-> findClass ("Lee / Boehm / test");
De là, comment puis-je évaluer la taille de la classe lee.boehm.test à l'intérieur du tas de hotspot?
Merci Boehm
La solution
Voici
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;
}
et ./util/util.java
package util;
public class Util {
public static final native long getObjectSize(Object obj);
}
et 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 test
Autres conseils
hmmm .... si vous voulez dire la taille des octets de classe, alors oui ..... vous utiliseriez JVMTI pour retransformer la classe en question qui générerait un événement ClassloadHook que vous écoutez et cela pourrait vous donner les octets de classe et la taille ... mais ils seraient identiques au fichier .class sur disque ... mais si la classe est générée dynamiquement et c'est pourquoi vous ne pouvez pas simplement regarder la taille du fichier .class, cette technique serait Travail ..... Je peux écrire le code pour vous si vous le souhaitez.