Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

提供JvmUtils #1698

Closed
wants to merge 18 commits into from
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
支持并发调用
  • Loading branch information
loongs-zhang committed Apr 23, 2021
commit 4418722b837c8f1b96a82047e7b833eee400a84b
9 changes: 4 additions & 5 deletions arthas-beans/src/main/java/com/vdian/vclub/JvmUtils.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@
import java.util.ArrayList;

/**
* @author 1936978077@qq.com
* @date 2021/02/12
* @author ZhangZiCheng 2021-02-12
* @since 3.5.1
*/
public class JvmUtils {
Expand All @@ -34,12 +33,12 @@ public class JvmUtils {
/**
* 获取某个class在jvm中当前所有存活实例
*/
public static synchronized native <T> ArrayList<T> getInstances(Class<T> klass);
public static native <T> ArrayList<T> getInstances(Class<T> klass);

/**
* 统计某个class在jvm中当前所有存活实例的总占用内存,单位:Byte
*/
public static synchronized native long sumInstanceSize(Class<?> klass);
public static native long sumInstanceSize(Class<?> klass);

/**
* 获取某个实例的占用内存,单位:Byte
Expand All @@ -49,7 +48,7 @@ public class JvmUtils {
/**
* 统计某个class在jvm中当前所有存活实例的总个数
*/
public static synchronized native long countInstances(Class<?> klass);
public static native long countInstances(Class<?> klass);

/**
* 获取所有已加载的类
Expand Down
29 changes: 19 additions & 10 deletions arthas-beans/src/main/native/src/jni-library.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,19 @@ jobject createJavaInstance(JNIEnv *env, jclass javaClass) {
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);
}

extern "C"
jvmtiIterationControl JNICALL
HeapObjectCallback(jlong class_tag, jlong size, jlong *tag_ptr, void *user_data) {
*tag_ptr = 1;
auto *data = static_cast<jlong *>(user_data);
*tag_ptr = *data;
return JVMTI_ITERATION_CONTINUE;
}

Expand All @@ -49,15 +58,15 @@ Java_com_vdian_vclub_JvmUtils_getInstances(JNIEnv *env, jclass thisClass, jclass
printf("ERROR: JVMTI AddCapabilities failed!%u\n", error);
return JNI_FALSE;
}
//todo 支持并发调用
//这里用hashCode作为标记
jlong tag = getClassHashCode(env, klass);
error = jvmti->IterateOverInstancesOfClass(klass, JVMTI_HEAP_OBJECT_EITHER,
HeapObjectCallback, NULL);
HeapObjectCallback, &tag);
if (error) {
printf("ERROR: JVMTI IterateOverInstancesOfClass failed!%u\n", error);
return JNI_FALSE;
}

jlong tag = 1;
jint count = 0;
jobject *instances;
error = jvmti->GetObjectsWithTags(1, &tag, &count, &instances, NULL);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jobject *instances; 可能存在内存泄漏问题

Expand Down Expand Up @@ -90,15 +99,15 @@ Java_com_vdian_vclub_JvmUtils_sumInstanceSize(JNIEnv *env, jclass thisClass, jcl
printf("ERROR: JVMTI AddCapabilities failed!%u\n", error);
return JNI_FALSE;
}
//todo 支持并发调用
//这里用hashCode作为标记
jlong tag = getClassHashCode(env, klass);
error = jvmti->IterateOverInstancesOfClass(klass, JVMTI_HEAP_OBJECT_EITHER,
HeapObjectCallback, NULL);
HeapObjectCallback, &tag);
if (error) {
printf("ERROR: JVMTI IterateOverInstancesOfClass failed!%u\n", error);
return JNI_FALSE;
}

jlong tag = 1;
jint count = 0;
jobject *instances;
error = jvmti->GetObjectsWithTags(1, &tag, &count, &instances, NULL);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

jobject *instances; 可能存在内存泄漏问题

Expand Down Expand Up @@ -144,15 +153,15 @@ Java_com_vdian_vclub_JvmUtils_countInstances(JNIEnv *env, jclass thisClass, jcla
printf("ERROR: JVMTI AddCapabilities failed!%u\n", error);
return JNI_FALSE;
}
//todo 支持并发调用
//这里用hashCode作为标记
jlong tag = getClassHashCode(env, klass);
error = jvmti->IterateOverInstancesOfClass(klass, JVMTI_HEAP_OBJECT_EITHER,
HeapObjectCallback, NULL);
HeapObjectCallback, &tag);
if (error) {
printf("ERROR: JVMTI IterateOverInstancesOfClass failed!%u\n", error);
return JNI_FALSE;
}

jlong tag = 1;
jint count = 0;
error = jvmti->GetObjectsWithTags(1, &tag, &count, NULL, NULL);
if (error) {
Expand Down