java api 获取jvm实例_JVMTI那些事——和Java相互调用

本文介绍了如何通过JVMTI接口和JNI技术,实现在Java代码中调用JVMTI提供的功能,以查询特定类的所有实例。首先,通过JNI定义Java API,包括一个native方法。接着,C++部分分为基于JVMTI的查询逻辑和基于JNI的实现。重点关注了JVMTI的`IterateOverInstancesOfClass`接口,但由于它不包含子类和实现了指定接口的类,所以对于某些需求可能不适用。此外,还讨论了ClassLoader隔离问题,以及如何通过JVMTI获取所有已加载的Class对象来解决这个问题。
摘要由CSDN通过智能技术生成

前面几篇文章介绍了JVMTI接口的一些基本概念,以及如何编写一个基于JVMTI的agent。

那些简单的例子只是JVMTI agent自己实现一些简单的功能,如果能够将JVMTI提供的接口经过包装之后提供给Java使用,

能够发挥更大的作用。

需求

本文源自一个实际的需求:业务代码需要在不依赖spring容器的情况下,或者spring的ApplicationContext对象实例,

进而能够获取到spring管理的所有bean。对这个需求再进行通用扩展,可以简化成:传入一个类(或者是类签名,这里有个ClassLoader的坑,后面会提到。),返回该类在堆中的所有实例。

实现

由于JVMTI只提供了C/C++接口,因此要让业务代码能够调用到,必须要通过JNI接口。因此实现需要分成两个部分:Java部分和C++部分。

其中Java部分比较简单,内部会定义一个native方法来最终调用JNI提供的函数。C++部分也可以拆成两部分,一部分基于JVMTI,

用于处理JVMTI规范定义的初始化和JVMTI API调用的实现;另一部分基于JNI,用于最终向Java部分提供实现。

Java API

需求章节事实上已经确认了Java端的API,提供的方法定义很简单,分别是:

class ObjectQueryUtils {

public static List queryObjects(String name) {

...

}

public stati

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值