당신은
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 -l libagent.so ag ent.c
자바 -agentpath : ./ 테스트
안녕 폴 libagent.so, 답변 주셔서 감사하지만, 내가 가상 머신 내부 클래스의 메모리 표현을 의미한다. – boehm
아 ... 좋아, 개체 인스턴스 크기 .... –