1

我正在使用 JNI 来分析一些程序。我只是想知道,在获得 jclass 参考之后,如何找到底层类的大小?

例如:class cls = env->FindClass("Lee/Boehm/Test");

从这里我如何评估热点堆内 Lee.Boehm.Test 类的大小?

谢谢博姆

4

2 回答 2

1

干得好

代理.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 测试

于 2011-02-13T14:46:00.103 回答
0

嗯....如果您的意思是类字节的大小,那么是的.....您将使用jvmti重新转换有问题的类,这将生成您侦听的classloadhook事件,这可以为您提供类字节和大小......但它们与磁盘上的 .class 文件相同......但如果类是动态生成的,这就是为什么你不能只查看 .class 文件的大小,那么这种技术将工作.....如果你愿意,我可以为你写代码。

于 2011-02-12T14:57:24.750 回答