determinar a classe Java tamanho da JNI, jclass
-
12-11-2019 - |
Pergunta
Eu estou usando JNI para analisar algum programa.Eu só me pergunto, depois de obter jclass de referência, como é possível encontrar o tamanho da classe base ?
por exemplo:classe cls = env->FindClass("Lee/Boehm/Teste");
a partir daqui como posso avaliar o tamanho da classe Lee.Boehm.Teste dentro hotspot pilha ?
Obrigado Boehm
Solução
Aqui você ir
agente.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;
}
e ./util/Util.java
package util;
public class Util {
public static final native long getObjectSize(Object obj);
}
e 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.então agente.c
java -agentpath:./libagent.para Testar
Outras dicas
hmmm .... se você quer dizer o tamanho dos bytes de classe, então sim ..... você usaria jvmti para retranformar a classe em questão que geraria um evento de classeLowhook que você escuta e isso poderia dar-lhe obytes de classe e o tamanho .... mas eles seriam idênticos ao arquivo .class no disco .... mas se a classe for gerada dinamicamente e é por isso que você não pode apenas olhar para o tamanho do arquivo .classEsta técnica funcionaria ..... Eu posso escrever o código para você, se você quiser.