JVMTI是用于开发和监视JVM的程序接口,可以探索JVM的内部状态并控制JVM应用程序的执行。可以实现的功能包括但不限于:
应当指出的是,并非所有JVM实施都支持JVMTI。Android是JVMTI实现,仅在8点之后添加。
中国文档
https://blog.caoxudong.info/blog/2017/12/07/jvmti_reference#1.1
英语文档
https://docs.racele.com/javase/8/docs/platform/jvmti.html#specificationintro
示意图可能是这样的,可以看作是中间代理
由于最近对Android性能监测的研究,我不小心与这种黑色技术接触。
JVMTI是开发人员的后门。您可以使用它实时检测JVM的操作,包括对象分配,垃圾回收,线程调度,实时调试等。
JVM是由C编写的,因此,如果要监视,则需要使用C/C ++编写动态连接库,然后在运行时编写ATTCH库。
在此输入功能中,自定义您需要监视事件。共有32个事件。您可以按需自定义它。回调事件越多,对JVM性能的影响就越大。例如,1秒内可能会达到1,000倍的高度,而方法调用的频率可能达到每秒10,000次。如果未正确使用它,程序员编写的代码只能写一些方法,但是框架回调通知达到了数万千斯特,甚至数十万次,这已经失去了监视的含义。
以下是我在演示中的Agent_onattach方法,如下所示。
我将完整的源代码到最后
应该注意的是,要获得回调通知,首先必须保证以下两个点:
如果绑定内存分配回调,大多数内存创建都会通知回调方法,其中大多数是系统对象的创建通知。您可以在此处拦截几乎所有Java层的内存分配(以前无法获得ATTCH的内存)))))))
这样,所有内存分配将通知到OnObjectAllocCallback函数
JVMTI_EVENT_GARBAGE_COLLECTION_START和JVMTI_EVENT_GARBAGE_COLLECTION_FINISH是一个回调事件,GC启动和GC的结束。这两个事件的组合仍然有助于记忆的内存泄漏,这两个事件的频率不高。我认为还有更多现实的用途。
注册这两个事件时,您可以在Ongcstallllllllllllllllllllllllback和ongcfinishcallk的两种方法中接收GC回调
在设置JVMtieventCalllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllll以后- 类似回调消息
您可以在OnMethodentry方法中获取方法执行的启动事件,并在OnMethodexit中获取方法执行方法的最终事件,以计算方法的执行时间,但是确实选择了此方法因为JVMTI站在应用层的中间,JVMALL JVM活动将通知回调方法,其中大多数是框架层的方法。简单和高效)。
因为线程的创建不是那么密集,所以以这种方式使用线程是相对合理的
您可以加强线程的创建和结束
在此演示执行中执行的程序员将不超过10种可靠的方法,因此该比率非常令人发指。此方法不多计算执行时间的方法。
这个简单的演示中心程序员的新对象不超过10个对象
当然,以上统计数据非常粗糙,不是标准知识,而是卷的数据...
1.1在回调方法中,您无法加载程序员自定义的类
无法加载程序员自定义的类,并且自然无法调用自定义Java层方法。我想在回调方法上通知Java层,但不幸的是它无法加载自定义类。这是JVMTI,有限制),因此,如果您想要更好的统计信息,则需要编写更多C代码
1.2我想在执行该方法时打印该方法的名称,但是我必须调用类的getName方法,但是该方法是Java层,因此会导致死亡。我想通过方法名称将其删除,但可惜可以看到执行效果,并且调试无法输入一个步骤
1.3调试通常不起作用(感觉有点鸡排)
1.4无法保存类和Javavm的全局变量(这可能是我的问题)
1.5只能在调试阶段使用(但是大个子的黑客也可以在发行阶段使用。老实说,发行阶段使用此内容,这不是明智的))))))
https://github.com/woshiwzy/myandroidjvmtidemo
JVMTI具有强大的功能。我只使用冰山一角。以下是我提到的大个子。
https://blog.csdn.net/duqi_2009/article/details/94518203
disture.pc_relevant.none任务-Blog-2%7Edefault%7 eTtrlis
distribute.pc_relevant.none任务 - 博客-2%7EDEFAULT%7eblogComatendFrombaIdu%7raate-6.pc_relevant_v3&utm_relelvant_index = 9