diff --git a/arthas-vmtool/src/main/java/arthas/VmTool.java b/arthas-vmtool/src/main/java/arthas/VmTool.java index aaed0dc20..16ccd0d8f 100644 --- a/arthas-vmtool/src/main/java/arthas/VmTool.java +++ b/arthas-vmtool/src/main/java/arthas/VmTool.java @@ -41,12 +41,12 @@ public class VmTool implements VmToolMXBean { */ private static native String check0(); - private static native void forceGc0(); + private static synchronized native void forceGc0(); /** * 获取某个class在jvm中当前所有存活实例 */ - private static native T[] getInstances0(Class klass); + private static synchronized native T[] getInstances0(Class klass); /** * 统计某个class在jvm中当前所有存活实例的总占用内存,单位:Byte @@ -61,14 +61,14 @@ public class VmTool implements VmToolMXBean { /** * 统计某个class在jvm中当前所有存活实例的总个数 */ - private static native long countInstances0(Class klass); + private static synchronized native long countInstances0(Class klass); /** * 获取所有已加载的类 * @param klass 这个参数必须是 Class.class * @return */ - private static native Class[] getAllLoadedClasses0(Class klass); + private static synchronized native Class[] getAllLoadedClasses0(Class klass); @Override public String check() { diff --git a/arthas-vmtool/src/main/native/src/jni-library.cpp b/arthas-vmtool/src/main/native/src/jni-library.cpp index a953dce29..6f9002f2a 100644 --- a/arthas-vmtool/src/main/native/src/jni-library.cpp +++ b/arthas-vmtool/src/main/native/src/jni-library.cpp @@ -6,6 +6,7 @@ static jvmtiEnv *jvmti; +static jlong tagCounter = 0; extern "C" int init_agent(JavaVM *vm, void *reserved) { @@ -57,19 +58,8 @@ Java_arthas_VmTool_check0(JNIEnv *env, jclass thisClass) { } extern "C" -jobject createJavaInstance(JNIEnv *env, jclass javaClass) { - //找到java类的构造方法 - jmethodID construct = env->GetMethodID(javaClass, "", "()V"); - //生成java类实例 - return env->NewObject(javaClass, construct, ""); -} - -extern "C" -jlong getClassHashCode(JNIEnv *env, jclass javaClass) { - //找到java类的hashCode方法 - jmethodID hashCodeMethod = env->GetMethodID(javaClass, "hashCode", "()I"); - //生成java类实例 - return env->CallLongMethod(javaClass, hashCodeMethod); +jlong getTag() { + return ++tagCounter; } extern "C" @@ -83,8 +73,7 @@ HeapObjectCallback(jlong class_tag, jlong size, jlong *tag_ptr, void *user_data) extern "C" JNIEXPORT jobjectArray JNICALL Java_arthas_VmTool_getInstances0(JNIEnv *env, jclass thisClass, jclass klass) { - //这里用hashCode作为标记 - jlong tag = getClassHashCode(env, klass); + jlong tag = getTag(); jvmtiError error = jvmti->IterateOverInstancesOfClass(klass, JVMTI_HEAP_OBJECT_EITHER, HeapObjectCallback, &tag); if (error) { @@ -112,8 +101,7 @@ Java_arthas_VmTool_getInstances0(JNIEnv *env, jclass thisClass, jclass klass) { extern "C" JNIEXPORT jlong JNICALL Java_arthas_VmTool_sumInstanceSize0(JNIEnv *env, jclass thisClass, jclass klass) { - //这里用hashCode作为标记 - jlong tag = getClassHashCode(env, klass); + jlong tag = getTag(); jvmtiError error = jvmti->IterateOverInstancesOfClass(klass, JVMTI_HEAP_OBJECT_EITHER, HeapObjectCallback, &tag); if (error) { @@ -154,8 +142,7 @@ JNIEXPORT jlong JNICALL Java_arthas_VmTool_getInstanceSize0 extern "C" JNIEXPORT jlong JNICALL Java_arthas_VmTool_countInstances0(JNIEnv *env, jclass thisClass, jclass klass) { - //这里用hashCode作为标记 - jlong tag = getClassHashCode(env, klass); + jlong tag = getTag(); jvmtiError error = jvmti->IterateOverInstancesOfClass(klass, JVMTI_HEAP_OBJECT_EITHER, HeapObjectCallback, &tag); if (error) {