【问题标题】:determine Java class size from JNI jclass从 JNI jclass 确定 Java 类大小
【发布时间】:2011-02-12 14:24:24
【问题描述】:

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

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

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

谢谢 伯姆

【问题讨论】:

    标签: java-native-interface jvmti


    【解决方案1】:

    给你

    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 测试

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 您好 Paul,感谢您的回答,但我的意思是虚拟机内部类的内存表示。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-26
      • 1970-01-01
      • 2011-10-07
      • 1970-01-01
      相关资源
      最近更新 更多