Determina le dimensioni della classe Java da JNI JClass
-
12-11-2019 - |
Domanda
Sto usando JNI per analizzare un po 'di programma.Mi chiedo solo, dopo aver ricevuto il riferimento JClass, come è possibile trovare le dimensioni della classe sottostante?
Ad esempio: class cls= env-> findclass ("Lee / boehm / test");
Da qui Come posso valutare le dimensioni della classe Lee.boehm.test all'interno dell'heap di hotspot?
Grazie Boehm
Soluzione
Qui vai
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;
}
.
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 lagagent.so agente.c
Java -Agentpath: ./ Libagent.so Test
Altri suggerimenti
hmmm .... Se intendi la dimensione dei byte di classe, quindi sì ..... useresti JVMTI per ritrasforma la classe in questione che genererebbe un evento di ClassloadHook che ascolti e questo potrebbe darti ilByte di classe e le dimensioni .... Ma sarebbero identici al file .Class sul disco .... Ma se la classe è generata dinamicamente e questo è il motivo per cui non puoi semplicemente guardare la dimensione del file .Class alloraQuesta tecnica funzionerebbe ..... Posso scrivere il codice per te se vuoi.