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程序员 ...
随机推荐
- sonar-代码扫描
代码测试sonar 1.下载地址: https://www.sonarqube.org/downloads/ 2.配置jdk环境(版本要求1.8+) [root@localhost#>> ...
- Knockout案例: 全选
- oracle导入.dmp文件
在日常开发中,经常需要往一个数据库里导入.dmp文件,下面简单介绍下如何通过命令导入 1.创建一个awsbpm用户create user 用户名 identified by 密码; 如:create ...
- MIPS(极路由1s[mt7620a])平台OpenWrt路由器系统内的Go应用程序开发
起因,由于coolpy5核心转换到go语言开发,所以目前超人正在进行相关的技术攻关,在程序编写方面一切都相对顺利.由于coolpy5是一个真正的商业级性能的系统也考滤到coolpy之前的版本已经确定的 ...
- spark MLlib collaborativeFilltering学习
package ML.collaborativeFilltering; import org.apache.spark.SparkConf; import org.apache.spark.api.j ...
- Mysql的学习笔记03
---恢复内容开始--- Mysql 的视图 1 view 在查询中,我们经常把查询结果当成临时表来看, view 是什么? View 可以看成一张虚拟的表,是表通过某种运算得到的有一个投影. 2 ...
- Java 实现视频下载功能
public static boolean httpDownload(String httpUrl, String saveFile) { // 1.下载网络文件 int byteRead; URL ...
- mysql 使用教程 入门
转载 http://www.cnblogs.com/mr-wid/archive/2013/05/09/3068229.html MySQL有三大类数据类型, 分别为数字.日期\时间.字符串, 这三大 ...
- Mybatis与JDBC批量插入MySQL数据库性能测试及解决方案
转自http://www.cnblogs.com/fnz0/p/5713102.html 不知道自己什么时候才有这种钻研精神- -. 1 背景 系统中需要批量生成单据数据到数据库表,所以采用 ...
- 11 安装已集成HA的树莓派镜像Hassbian
2017-09-04 10:40:47 下载Hassbian镜像文件,浏览https://github.com/home-assistant/pi-gen/releases/tag/v1.23,查看最 ...