improve vmtool getAllLoadedClasses0

This commit is contained in:
hengyunabc
2021-05-07 11:52:23 +08:00
parent 00430ca422
commit 46273d2685
2 changed files with 6 additions and 26 deletions
@@ -65,15 +65,10 @@ public class VmTool implements VmToolMXBean {
/**
* 获取所有已加载的类
* @param klass 这个参数必须是 Class.class
* @return
*/
private static native Class<?>[] getAllLoadedClasses0();
/**
* 包括小类型(如int)
*/
public static Class<?>[] getAllClasses() {
return getInstances0(Class.class);
}
private static native Class<?>[] getAllLoadedClasses0(Class<?> klass);
@Override
public String check() {
@@ -107,7 +102,7 @@ public class VmTool implements VmToolMXBean {
@Override
public Class<?>[] getAllLoadedClasses() {
return getAllLoadedClasses0();
return getAllLoadedClasses0(Class.class);
}
}
@@ -4,21 +4,6 @@
#include <jvmti.h>
#include "arthas_VmTool.h" // under target/native/javah/
//缓存
static jclass cachedClass = NULL;
extern "C"
JNIEXPORT jclass JNICALL getClass(JNIEnv *env) {
if (cachedClass == NULL) {
//通过其签名找到Class的Class
jclass theClass = env->FindClass("java/lang/Class");
//放入缓存
cachedClass = static_cast<jclass>(env->NewGlobalRef(theClass));
env->DeleteLocalRef(theClass);
}
return cachedClass;
}
extern "C"
jvmtiEnv *getJvmtiEnv(JNIEnv *env) {
@@ -194,7 +179,7 @@ Java_arthas_VmTool_countInstances0(JNIEnv *env, jclass thisClass, jclass klass)
extern "C"
JNIEXPORT jobjectArray JNICALL Java_arthas_VmTool_getAllLoadedClasses0
(JNIEnv *env, jclass thisClass) {
(JNIEnv *env, jclass thisClass, jclass kclass) {
jvmtiEnv *jvmti = getJvmtiEnv(env);
@@ -207,7 +192,7 @@ JNIEXPORT jobjectArray JNICALL Java_arthas_VmTool_getAllLoadedClasses0
return JNI_FALSE;
}
jobjectArray array = env->NewObjectArray(count, getClass(env), NULL);
jobjectArray array = env->NewObjectArray(count, kclass, NULL);
//添加元素到数组
for (int i = 0; i < count; i++) {
env->SetObjectArrayElement(array, i, classes[i]);