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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top