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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top