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的更多相关文章

  1. JVM配置参数理解,Cannot load this JVM TI agent twice

    基本参数 -Xms128m JVM初始分配的堆内存 -Xmx512m JVM最大允许分配的堆内存,按需分配 -XX:PermSize=64M JVM初始分配的非堆内存 -XX:MaxPermSize= ...

  2. JVM Management API

    JVM本身提供了一组管理的API,通过该API,我们可以获取得到JVM内部主要运行信息,包括内存各代的数据.JVM当前所有线程及其栈相关信 息等等.各种JDK自带的剖析工具,包括jps.jstack. ...

  3. JVM远程DEBUG(JPDA )

    原理 1. JPDA简介 JPDA(Java Platform Debugger Architecture)为Java平台上的调试器定义了一个标准的体系结构.该体系结构包括3个主要组成部分:JVM T ...

  4. JVM源码分析之javaagent原理完全解读

    概述 本文重点讲述javaagent的具体实现,因为它面向的是我们Java程序员,而且agent都是用Java编写的,不需要太多的C/C++编程基础,不过这篇文章里也会讲到JVMTIAgent(C实现 ...

  5. java-JProfiler(二)-进行本地JVM的性能监控-tomcat

    监视本地的Tomcat, 看似是本地,其实JProfiler GUI在一个单独的JVM里启动,他与被监视的目标jvm之间通过socket通讯,目的为了不干扰目标JVM.所以监视本地Tomcat与监视远 ...

  6. JVM参数简述

    java虚拟机启动时会带有很多的启动参数,Java命令本身就是一个多参数的启动命令.那么具体JVM启动包含哪些参数呢?这篇文章针对java8的情况做一篇汇总解读,包含大多数常见和不常见的命令参数,过于 ...

  7. JVM性能调优监控工具专题一:JVM自带性能调优工具(jps,jstack,jmap,jhat,jstat,hprof)

    性能分析工具jstatjmapjhatjstack 前提概要:         JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jsta ...

  8. JVM插庄之二:Java agent基础原理

    javaagent 简介 Javaagent 只要作用在class被加载之前对其加载,插入我们需要添加的字节码. Javaagent面向的是我们java程序员,而且agent都是用java编写的,不需 ...

  9. JVM源码分析之javaagent原理完全解读--转

    原文地址:http://www.infoq.com/cn/articles/javaagent-illustrated 概述 本文重点讲述javaagent的具体实现,因为它面向的是我们Java程序员 ...

随机推荐

  1. django第一天

    今天是双十一跑了个1000很累. django 终于学到了,学了这么多天,乱七八糟的东西. 今天只是学了初级的配置文件和响应请求. 配置CSS和JS 文件目录 配置html文件目录 响应请求 配置路径 ...

  2. Vue前端利用qrcode生成二维码

    <div id="qrcode" style="width: 560px;height: 560px;background-color: white;"& ...

  3. js 在echarts多条折线图数字*100 诡异出现小数

    formatter:function(params){ //数据单位格式化 ].name; //x轴名称 , l = params.length; i < l; i++) { if(params ...

  4. centos没有可用软件包 libgtk2

    在编写一个C程序,使用基于文本的终端图形编程库(curses)或图形界面(QT/GTK),分窗口显示三个并发进程的运行,因为centos并未安装gtk,所以运行命令行安装gtksudo yum -y ...

  5. 20172328 2018-2019《Java软件结构与数据结构》第三周学习总结

    20172328 2018-2019<Java软件结构与数据结构>第三周学习总结 概述 Generalization 本周学习了第五章:队列.主要内容包含队列的处理过程.如何用对例如求解问 ...

  6. Mocha+should+Karma自动化测试教程

    Mocha+should+Karma自动化测试教程 一.了解TDD与BDD 首先,为什么我们了解TDD与BDD的是什么意思? 在实际项目中,大部分都是采用BDD的形式进行开发,也就是行为驱动开发. T ...

  7. LeetCode 709.To Lower Case

    Description Implement function ToLowerCase() that has a string parameter str, and returns the same s ...

  8. 第六篇 flask中session

    Flask中的Session非常的奇怪,他会将你的SessionID存放在客户端的Cookie中,使用起来也非常的奇怪 Flask 中 session 的使用 1. Flask 中 session 是 ...

  9. Centos7安装InfluxDB1.7

    Centos7安装InfluxDB1.7 本操作参照InfluxDB官网:InfuxDB 使用的Red Hat和CentOS用户可以安装InfluxDB最新的稳定版本 yum包管理器: cat < ...

  10. Arrange the Bulls [POJ2441] [状压DP]

    题意 n头牛,m个房间,每头牛有自己喜欢的房间,问每头牛都住进自己喜欢的房间有多少种分配方法? Input In the first line of input contains two intege ...