Determine el tamaño de la clase Java de JNI JCLASS
-
12-11-2019 - |
Pregunta
Estoy usando JNI para analizar algún programa.Me pregunto, después de obtener referencia a JCLASS, ¿cómo es posible encontrar el tamaño de la clase subyacente?
Por ejemplo: clase CLS= ENV-> FindClass ("Lee / Boehm / Test");
Desde aquí, ¿cómo puedo evaluar el tamaño de la clase Lee.boehm.test dentro del montón de Hotspot?
gracias Boehm
Solución
Aquí vayas
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;
}
y ./util/util.java
package util;
public class Util {
public static final native long getObjectSize(Object obj);
}
y 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 / incluyen -shared -fpic -o liagent.so agent.c
Java -AgentPath: ./ Liagent.So prueba
Otros consejos
hmmm ... Si te refieres al tamaño de las bytes de clase, entonces sí ... Usarías JVMTI para retransmitir la clase en cuestión que generaría un evento de Classloadhook que escuchas y esto podría darle elClase bytes y el tamaño .... Pero serían idénticos al archivo .class en el disco .... Pero si la clase se genera dinámicamente y es por eso que no puede simplemente mirar el tamaño del archivo .class, entoncesEsta técnica funcionaría ... Puedo escribir el código para usted si lo desea.