質問

JNIを使用してプログラムを分析しています。JClassの参照を取得した後、基礎となるクラスのサイズを見つけることが可能なのかどうかを疑問に思うだけですか?

次のように: クラスCLS= ENV-> FindClass( "Lee / Boehm / Test");

ここから、Hotspotのヒープ内のクラスlee.boehm.testのサイズを評価する方法は?

ありがとう Boehm

役に立ちましたか?

解決

ここに行きます

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 / outsing -shared -fpic -o libagent.so agent.c

java -agentpath:./ libagent.so test

他のヒント

hmmm ....クラスバイトのサイズを意味する場合は、Yes ..... JVMTIを使用してクラスを再送信してクラスロードフックイベントを生成し、これがあなたに与える可能性があります。クラスバイトとサイズ....これは、ディスク上の.CLASSファイルと同じです。ただし、クラスが動的に生成された場合、その場合は.Classファイルのサイズを見ることができない理由このテクニックは機能します.....あなたが望むならあなたのためのコードを書くことができます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top