JVM TI
JVM TI
JVM TI全名Java Virtual Machine Tool Interface,是开发虚拟机监控工具使用的编程接口,它可以监控JVM内部时间的执行,也可以控制JVM的某些行为,可以实现调试、监控、线程分析、覆盖率分析工具等
JVM TI属于Java Platform Debugger Architecyure中的一员,在Debugger Architecture上JVM TI可以算是一个back-end,通过JDWP和front-end JDI去做交互,需要注意的是Android内的JDWP并不是基于JVM TI开发的
JVM TI支持的功能
线程相关事件->监控线程创建堆栈、锁信息ThreadStart:线程在执行方法前产生线程启动事件
ThreadEnd:线程结束事件
MonitorWait:wait方法调用后
MonitorWauted:wai方法完成等待
MonitorContendedEnter:当线程试图获取一个已经被其他线程持有的对象锁时
MonitorContendedEntered:当线程获取到对象锁继续执行时
类加载准备事件->监控类加载
ClassFileLoadHook:在类加载之前触发
ClassLoad:某个类首次被加载
ClassPrepare:某个类的准备阶段完成
异常事件->监控异常信息
Exception:有异常抛出的时候
ExceptionCatch:当捕获到一个异常的时候
调试相关
SingleStep:步进事件,可以实现相当细粒度的字节码执行顺序,这个功能可以探查多线程下的字节码执行序列
Breakpoint:当线程执行到一个带断点的位置,断点可以通过JVMTI setBreakpoint的方法来设置
方法执行
FramePop:当方法执行到return指令或者出现异常时候产生,手动调用NofityFramePop JVM TI函数也可产生该事件
MethodEntry:当开始执行一个java方法的时候
MethodExit:当方法执行完成后,产生异常退出时
FieldAccess:当访问了设置了观察点的属性时产生事件,观察点使用SetFieldAccessWatch函数设置
FieldModification:当设置了观察点的属性值被修改后,观察点使用SetDieldModificationWatch设置
GC->GC事件与时间
GarbageCollectionStart:GC启动时
GarbageCollectionFinish:GC结束后
对象事件->监控内存分配
ObjectFree:GC释放一个对象时
VMObjectAlloc:虚拟机分配一个对象的时候
其他
NativeMethodBind:在首次调用本地方法时或者调用JNI RegisterNatives的时候产生该事件,通过该回调可以将一个JNI调用切换到指定的方法上
JVM TI实现原理
JVM TI Agent的启动需要虚拟机的支持,我们的Agent和虚拟机运行在同一个进程中,虚拟机通过dlopen打开我们的Agent动态链接库,然后通过Agent_OnAttach方法来调用我们定义的初始化逻辑
JVM TI的原理其实很简单,以VmObjectAlloc事件为例,当我们通过SetEventNotificationMode函数设置JVMTI_EVENT_VM_OBJECT_ALLOC回调的时候,最终会调用到art:Runtime:Current()->GetHeap()->SetAllocationListener(listener)
在这个方法中,listener是JVM TI实现的一个虚拟机提供的art::gc::AllocationListener回调,当虚拟机分配对象内存的时候会调用该回调,同时在该回调函数里也会调用我们之前设置的callback方法,这样事件和相关的数据就会透传到我们的Agent里,来实现完成事件的监听
类似atrace和StrictMode,JVM TI的每个事件都需要在源码中埋点支持
JVM TI的更多相关文章
- JVM配置参数理解,Cannot load this JVM TI agent twice
基本参数 -Xms128m JVM初始分配的堆内存 -Xmx512m JVM最大允许分配的堆内存,按需分配 -XX:PermSize=64M JVM初始分配的非堆内存 -XX:MaxPermSize= ...
- JVM Management API
JVM本身提供了一组管理的API,通过该API,我们可以获取得到JVM内部主要运行信息,包括内存各代的数据.JVM当前所有线程及其栈相关信 息等等.各种JDK自带的剖析工具,包括jps.jstack. ...
- JVM远程DEBUG(JPDA )
原理 1. JPDA简介 JPDA(Java Platform Debugger Architecture)为Java平台上的调试器定义了一个标准的体系结构.该体系结构包括3个主要组成部分:JVM T ...
- JVM源码分析之javaagent原理完全解读
概述 本文重点讲述javaagent的具体实现,因为它面向的是我们Java程序员,而且agent都是用Java编写的,不需要太多的C/C++编程基础,不过这篇文章里也会讲到JVMTIAgent(C实现 ...
- java-JProfiler(二)-进行本地JVM的性能监控-tomcat
监视本地的Tomcat, 看似是本地,其实JProfiler GUI在一个单独的JVM里启动,他与被监视的目标jvm之间通过socket通讯,目的为了不干扰目标JVM.所以监视本地Tomcat与监视远 ...
- JVM参数简述
java虚拟机启动时会带有很多的启动参数,Java命令本身就是一个多参数的启动命令.那么具体JVM启动包含哪些参数呢?这篇文章针对java8的情况做一篇汇总解读,包含大多数常见和不常见的命令参数,过于 ...
- JVM性能调优监控工具专题一:JVM自带性能调优工具(jps,jstack,jmap,jhat,jstat,hprof)
性能分析工具jstatjmapjhatjstack 前提概要: JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jsta ...
- JVM插庄之二:Java agent基础原理
javaagent 简介 Javaagent 只要作用在class被加载之前对其加载,插入我们需要添加的字节码. Javaagent面向的是我们java程序员,而且agent都是用java编写的,不需 ...
- JVM源码分析之javaagent原理完全解读--转
原文地址:http://www.infoq.com/cn/articles/javaagent-illustrated 概述 本文重点讲述javaagent的具体实现,因为它面向的是我们Java程序员 ...
随机推荐
- 【Linux】-- 在linux上安装mysql及基本操作
1.MySQL的安装 1.删除mariadb数据库 yum remove mariadb-libs.x86_64 CentOS7默认安装mariadb数据库,所以要先删除 2.下载mysql源 进入m ...
- ISP PIPLINE (六) AWB
What is WB(white balance)? 人的视觉和神经系统在看到白色物体的时候,基本不受环境的变化而出现严重的错觉.比如阴天,晴天,室内,室外,日光灯,白炽灯等的环境下,人依然会将白纸视 ...
- port bridge enable命令导致的环路
1.故障描述 前几天机房一台连接数据中心与核心交换的交换机宕机(硬件故障),机房有备用的设备,随即更换(配置也是早就配置好了的),但是下午就出现数据中心网络丢包问题,表现为存在mac漂移 2.拓扑 核 ...
- java @Override 报错解决
有时候Java的Eclipse工程换一台电脑后编译总是@override报错,把@override去掉就好了,但不能从根本上解决问题,因为有时候有@override的地方超级多. 这是jdk的问题,@ ...
- 转UI么?不想
最近一直在弄UI 对于UI实在是不想弄了 很痛苦...我一开始都比较热衷后台开发 但是前端UI 我只是有点兴趣而已,但是还一直要做...太累了 或许要学的东西还是有很多的!一直不知道 ...
- AngularJS_简介、特性及基本使用_及其工作原理
转自:angularJS 的工作原理 转自:通过<script>标签引入到 HTML 中,那么此时 Angular 就做为一个普通的 DOM 节点等待浏览器解析 当浏览器解析到这个节点时, ...
- 1、react-native中expo的真机测试字体不加载的坑
native-base的字体问题Roboto_medium 把native-base中的Fonts文件夹放到项目的根目录. import {Font,AppLoading} from 'expo'; ...
- Git飞行规则
原文链接 Git飞行规则(Flight Rules)
- eclipse创建spring boot项目,tomcat启动成功,但http://localhost:8080无法访问报错404解决方案
spring boot的启动程序启动后,在访问http://localhost:8080地址的时候出现了错误,为什么出错网上我找了好久也没有得出具体的解决办法 当我指定到具体的action的时候,却可 ...
- sql server里中自增长的ID重新开始排
dbcc checkident('tablename',reseed,0); 执行:dbcc checkident('TableA',reseed,0); 执行结束:中途报了几次插入重复键. 结论:用 ...