определить размер класса Java из JNI JClass - PullRequest
1 голос
/ 12 февраля 2011

Я использую JNI для анализа какой-то программы. Мне просто интересно, после получения ссылки jclass, как можно найти размер базового класса?

например: class cls = env-> FindClass ("Lee / Boehm / Test");

отсюда, как я могу оценить размер класса Lee.Boehm.Test в куче точек доступа?

Спасибо Бем

Ответы [ 2 ]

1 голос
/ 13 февраля 2011

Вот, пожалуйста,

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;
}

и ./util/Util.java

package util;

public class Util {
    public static final native long getObjectSize(Object obj);
}

и 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

0 голосов
/ 12 февраля 2011

хммм .... если вы имеете в виду размер байтов класса, то да ..... вы бы использовали jvmti для повторного преобразования рассматриваемого класса, который сгенерирует событие classloadhook, которое вы слушаете, и это может дать вамбайты класса и размер .... но они будут идентичны файлу .class на диске ... но если класс генерируется динамически, и поэтому вы не можете просто посмотреть на размер файла .classэта техника будет работать ..... Я могу написать код для вас, если вы хотите.

...