From 4f91d181e26c051bb6cc213d18d9471cf0328cd8 Mon Sep 17 00:00:00 2001 From: hengyunabc Date: Mon, 26 Apr 2021 21:00:41 +0800 Subject: [PATCH] rename JvmUtils to Vmtool. #1781 --- arthas-vmtool/pom.xml | 4 -- .../JvmUtils.java => arthas/Vmtool.java} | 37 +++++++---- .../src/main/native/include/arthas_Vmtool.h | 61 +++++++++++++++++++ .../native/include/com_vdian_vclub_JvmUtils.h | 61 ------------------- .../src/main/native/src/jni-library.cpp | 14 ++--- .../src/test/java/arthas/VmtoolTest.java | 57 +++++++++++++++++ .../java/com/vdian/vclub/JvmUtilsTest.java | 48 --------------- 7 files changed, 150 insertions(+), 132 deletions(-) rename arthas-vmtool/src/main/java/{com/vdian/vclub/JvmUtils.java => arthas/Vmtool.java} (65%) create mode 100644 arthas-vmtool/src/main/native/include/arthas_Vmtool.h delete mode 100644 arthas-vmtool/src/main/native/include/com_vdian_vclub_JvmUtils.h create mode 100644 arthas-vmtool/src/test/java/arthas/VmtoolTest.java delete mode 100644 arthas-vmtool/src/test/java/com/vdian/vclub/JvmUtilsTest.java diff --git a/arthas-vmtool/pom.xml b/arthas-vmtool/pom.xml index e6162a87e..c13775d75 100644 --- a/arthas-vmtool/pom.xml +++ b/arthas-vmtool/pom.xml @@ -198,10 +198,6 @@ arthas-common ${project.version} - - org.scijava - native-lib-loader - junit junit diff --git a/arthas-vmtool/src/main/java/com/vdian/vclub/JvmUtils.java b/arthas-vmtool/src/main/java/arthas/Vmtool.java similarity index 65% rename from arthas-vmtool/src/main/java/com/vdian/vclub/JvmUtils.java rename to arthas-vmtool/src/main/java/arthas/Vmtool.java index 0f707984a..3430ae95b 100644 --- a/arthas-vmtool/src/main/java/com/vdian/vclub/JvmUtils.java +++ b/arthas-vmtool/src/main/java/arthas/Vmtool.java @@ -1,28 +1,41 @@ -package com.vdian.vclub; - -import com.taobao.arthas.common.AnsiLog; -import org.scijava.nativelib.NativeLoader; +package arthas; import java.util.ArrayList; /** * @author ZhangZiCheng 2021-02-12 + * @author hengyunabc 2021-04-26 * @since 3.5.1 */ -public class JvmUtils { +public class Vmtool { /** * 不要修改jni-lib的名称 */ - private final static String JNI_LIBRARY_NAME = "ArthasJniLibrary"; + public final static String JNI_LIBRARY_NAME = "ArthasJniLibrary"; - static { - try { - NativeLoader.loadLibrary(JNI_LIBRARY_NAME); - AnsiLog.warn("checkResult->" + check() + ", jni-lib available !"); - } catch (Throwable t) { - AnsiLog.error("load jni-lib failed:" + t.getMessage(), t); + private static Vmtool instance; + + private Vmtool() { + } + + public static Vmtool getInstance() { + return getInstance(null); + } + + public static synchronized Vmtool getInstance(String libPath) { + if (instance != null) { + return instance; } + + if (libPath == null) { + System.loadLibrary(JNI_LIBRARY_NAME); + } else { + System.load(libPath); + } + + instance = new Vmtool(); + return instance; } /** diff --git a/arthas-vmtool/src/main/native/include/arthas_Vmtool.h b/arthas-vmtool/src/main/native/include/arthas_Vmtool.h new file mode 100644 index 000000000..903c47405 --- /dev/null +++ b/arthas-vmtool/src/main/native/include/arthas_Vmtool.h @@ -0,0 +1,61 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include +/* Header for class arthas_Vmtool */ + +#ifndef _Included_arthas_Vmtool +#define _Included_arthas_Vmtool +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: arthas_Vmtool + * Method: check + * Signature: ()Ljava/lang/String; + */ +JNIEXPORT jstring JNICALL Java_arthas_Vmtool_check + (JNIEnv *, jclass); + +/* + * Class: arthas_Vmtool + * Method: getInstances + * Signature: (Ljava/lang/Class;)Ljava/util/ArrayList; + */ +JNIEXPORT jobject JNICALL Java_arthas_Vmtool_getInstances + (JNIEnv *, jclass, jclass); + +/* + * Class: arthas_Vmtool + * Method: sumInstanceSize + * Signature: (Ljava/lang/Class;)J + */ +JNIEXPORT jlong JNICALL Java_arthas_Vmtool_sumInstanceSize + (JNIEnv *, jclass, jclass); + +/* + * Class: arthas_Vmtool + * Method: getInstanceSize + * Signature: (Ljava/lang/Object;)J + */ +JNIEXPORT jlong JNICALL Java_arthas_Vmtool_getInstanceSize + (JNIEnv *, jclass, jobject); + +/* + * Class: arthas_Vmtool + * Method: countInstances + * Signature: (Ljava/lang/Class;)J + */ +JNIEXPORT jlong JNICALL Java_arthas_Vmtool_countInstances + (JNIEnv *, jclass, jclass); + +/* + * Class: arthas_Vmtool + * Method: getAllLoadedClasses + * Signature: ()Ljava/util/ArrayList; + */ +JNIEXPORT jobject JNICALL Java_arthas_Vmtool_getAllLoadedClasses + (JNIEnv *, jclass); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/arthas-vmtool/src/main/native/include/com_vdian_vclub_JvmUtils.h b/arthas-vmtool/src/main/native/include/com_vdian_vclub_JvmUtils.h deleted file mode 100644 index f6557e4fa..000000000 --- a/arthas-vmtool/src/main/native/include/com_vdian_vclub_JvmUtils.h +++ /dev/null @@ -1,61 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include -/* Header for class com_vdian_vclub_JvmUtils */ - -#ifndef _Included_com_vdian_vclub_JvmUtils -#define _Included_com_vdian_vclub_JvmUtils -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: com_vdian_vclub_JvmUtils - * Method: check - * Signature: ()Ljava/lang/String; - */ -JNIEXPORT jstring JNICALL Java_com_vdian_vclub_JvmUtils_check - (JNIEnv *, jclass); - -/* - * Class: com_vdian_vclub_JvmUtils - * Method: getInstances - * Signature: (Ljava/lang/Class;)Ljava/util/ArrayList; - */ -JNIEXPORT jobject JNICALL Java_com_vdian_vclub_JvmUtils_getInstances - (JNIEnv *, jclass, jclass); - -/* - * Class: com_vdian_vclub_JvmUtils - * Method: sumInstanceSize - * Signature: (Ljava/lang/Class;)J - */ -JNIEXPORT jlong JNICALL Java_com_vdian_vclub_JvmUtils_sumInstanceSize - (JNIEnv *, jclass, jclass); - -/* - * Class: com_vdian_vclub_JvmUtils - * Method: getInstanceSize - * Signature: (Ljava/lang/Object;)J - */ -JNIEXPORT jlong JNICALL Java_com_vdian_vclub_JvmUtils_getInstanceSize - (JNIEnv *, jclass, jobject); - -/* - * Class: com_vdian_vclub_JvmUtils - * Method: countInstances - * Signature: (Ljava/lang/Class;)J - */ -JNIEXPORT jlong JNICALL Java_com_vdian_vclub_JvmUtils_countInstances - (JNIEnv *, jclass, jclass); - -/* - * Class: com_vdian_vclub_JvmUtils - * Method: getAllLoadedClasses - * Signature: ()Ljava/util/ArrayList; - */ -JNIEXPORT jobject JNICALL Java_com_vdian_vclub_JvmUtils_getAllLoadedClasses - (JNIEnv *, jclass); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/arthas-vmtool/src/main/native/src/jni-library.cpp b/arthas-vmtool/src/main/native/src/jni-library.cpp index bffd95f80..2e81b183c 100644 --- a/arthas-vmtool/src/main/native/src/jni-library.cpp +++ b/arthas-vmtool/src/main/native/src/jni-library.cpp @@ -2,11 +2,11 @@ #include #include #include -#include "com_vdian_vclub_JvmUtils.h" +#include "arthas_Vmtool.h" extern "C" JNIEXPORT jstring JNICALL -Java_com_vdian_vclub_JvmUtils_check(JNIEnv *env, jclass thisClass) { +Java_arthas_Vmtool_check(JNIEnv *env, jclass thisClass) { return env->NewStringUTF("OK"); } @@ -47,7 +47,7 @@ HeapObjectCallback(jlong class_tag, jlong size, jlong *tag_ptr, void *user_data) extern "C" JNIEXPORT jobject JNICALL -Java_com_vdian_vclub_JvmUtils_getInstances(JNIEnv *env, jclass thisClass, jclass klass) { +Java_arthas_Vmtool_getInstances(JNIEnv *env, jclass thisClass, jclass klass) { jvmtiEnv *jvmti = getJvmtiEnv(env); @@ -88,7 +88,7 @@ Java_com_vdian_vclub_JvmUtils_getInstances(JNIEnv *env, jclass thisClass, jclass extern "C" JNIEXPORT jlong JNICALL -Java_com_vdian_vclub_JvmUtils_sumInstanceSize(JNIEnv *env, jclass thisClass, jclass klass) { +Java_arthas_Vmtool_sumInstanceSize(JNIEnv *env, jclass thisClass, jclass klass) { jvmtiEnv *jvmti = getJvmtiEnv(env); @@ -126,7 +126,7 @@ Java_com_vdian_vclub_JvmUtils_sumInstanceSize(JNIEnv *env, jclass thisClass, jcl } extern "C" -JNIEXPORT jlong JNICALL Java_com_vdian_vclub_JvmUtils_getInstanceSize +JNIEXPORT jlong JNICALL Java_arthas_Vmtool_getInstanceSize (JNIEnv *env, jclass thisClass, jobject instance) { jvmtiEnv *jvmti = getJvmtiEnv(env); @@ -142,7 +142,7 @@ JNIEXPORT jlong JNICALL Java_com_vdian_vclub_JvmUtils_getInstanceSize extern "C" JNIEXPORT jlong JNICALL -Java_com_vdian_vclub_JvmUtils_countInstances(JNIEnv *env, jclass thisClass, jclass klass) { +Java_arthas_Vmtool_countInstances(JNIEnv *env, jclass thisClass, jclass klass) { jvmtiEnv *jvmti = getJvmtiEnv(env); @@ -172,7 +172,7 @@ Java_com_vdian_vclub_JvmUtils_countInstances(JNIEnv *env, jclass thisClass, jcla } extern "C" -JNIEXPORT jobject JNICALL Java_com_vdian_vclub_JvmUtils_getAllLoadedClasses +JNIEXPORT jobject JNICALL Java_arthas_Vmtool_getAllLoadedClasses (JNIEnv *env, jclass thisClass) { jvmtiEnv *jvmti = getJvmtiEnv(env); diff --git a/arthas-vmtool/src/test/java/arthas/VmtoolTest.java b/arthas-vmtool/src/test/java/arthas/VmtoolTest.java new file mode 100644 index 000000000..915e0d54b --- /dev/null +++ b/arthas-vmtool/src/test/java/arthas/VmtoolTest.java @@ -0,0 +1,57 @@ +package arthas; + +import org.junit.Test; + +import arthas.Vmtool; + +import java.io.File; +import java.lang.ref.WeakReference; +import java.util.ArrayList; + +public class VmtoolTest { + + /** + * 在我的macbook上运行结果如下 + * allLoadedClasses->1050 + * arthas.JvmUtils@5bb21b69 arthas.JvmUtils@6b9651f3 + * before instances->[arthas.JvmUtils@5bb21b69, arthas.JvmUtils@6b9651f3] + * size->16 + * count->2 + * sum size->32 + * null null + * after instances->[] + */ + @Test + public void test01() { + try { + String path = Vmtool.class.getProtectionDomain().getCodeSource().getLocation().getPath(); + System.err.println(path); + + String libPath = new File(path, System.mapLibraryName(Vmtool.JNI_LIBRARY_NAME)).getAbsolutePath(); + Vmtool.getInstance(libPath); + + //调用native方法,获取已加载的类,不包括小类型(如int) + ArrayList> allLoadedClasses = Vmtool.getAllLoadedClasses(); + System.out.println("allLoadedClasses->" + allLoadedClasses.size()); + + //通过下面的例子,可以看到getInstances(Class klass)拿到的是当前存活的所有对象 + WeakReference weakReference1 = new WeakReference(new VmtoolTest()); + WeakReference weakReference2 = new WeakReference(new VmtoolTest()); + System.out.println(weakReference1.get() + " " + weakReference2.get()); + ArrayList beforeInstances = Vmtool.getInstances(Vmtool.class); + System.out.println("before instances->" + beforeInstances); + System.out.println("size->" + Vmtool.getInstanceSize(weakReference1.get())); + System.out.println("count->" + Vmtool.countInstances(Vmtool.class)); + System.out.println("sum size->" + Vmtool.sumInstanceSize(Vmtool.class)); + beforeInstances = null; + + System.gc(); + Thread.sleep(100); + System.out.println(weakReference1.get() + " " + weakReference2.get()); + ArrayList afterInstances = Vmtool.getInstances(Vmtool.class); + System.out.println("after instances->" + afterInstances); + } catch (Exception e) { + e.printStackTrace(); + } + } +} diff --git a/arthas-vmtool/src/test/java/com/vdian/vclub/JvmUtilsTest.java b/arthas-vmtool/src/test/java/com/vdian/vclub/JvmUtilsTest.java deleted file mode 100644 index 442995b91..000000000 --- a/arthas-vmtool/src/test/java/com/vdian/vclub/JvmUtilsTest.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.vdian.vclub; - -import org.junit.Test; - -import java.lang.ref.WeakReference; -import java.util.ArrayList; - -public class JvmUtilsTest { - - /** - * 在我的macbook上运行结果如下 - * allLoadedClasses->1050 - * com.vdian.vclub.JvmUtils@5bb21b69 com.vdian.vclub.JvmUtils@6b9651f3 - * before instances->[com.vdian.vclub.JvmUtils@5bb21b69, com.vdian.vclub.JvmUtils@6b9651f3] - * size->16 - * count->2 - * sum size->32 - * null null - * after instances->[] - */ - @Test - public void test01() { - try { - //调用native方法,获取已加载的类,不包括小类型(如int) - ArrayList> allLoadedClasses = JvmUtils.getAllLoadedClasses(); - System.out.println("allLoadedClasses->" + allLoadedClasses.size()); - - //通过下面的例子,可以看到getInstances(Class klass)拿到的是当前存活的所有对象 - WeakReference weakReference1 = new WeakReference(new JvmUtils()); - WeakReference weakReference2 = new WeakReference(new JvmUtils()); - System.out.println(weakReference1.get() + " " + weakReference2.get()); - ArrayList beforeInstances = JvmUtils.getInstances(JvmUtils.class); - System.out.println("before instances->" + beforeInstances); - System.out.println("size->" + JvmUtils.getInstanceSize(weakReference1.get())); - System.out.println("count->" + JvmUtils.countInstances(JvmUtils.class)); - System.out.println("sum size->" + JvmUtils.sumInstanceSize(JvmUtils.class)); - beforeInstances = null; - - System.gc(); - Thread.sleep(100); - System.out.println(weakReference1.get() + " " + weakReference2.get()); - ArrayList afterInstances = JvmUtils.getInstances(JvmUtils.class); - System.out.println("after instances->" + afterInstances); - } catch (Exception e) { - e.printStackTrace(); - } - } -}