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. NOIP2018普及初赛解析

    2018年第二十四届全国青少年信息学奥林匹克联赛初赛普及组真题解析 一.单项选择题 1. 以下哪一种设备属于输出设备:(D) A.扫描仪 _B.键盘C. 鼠标 _D. 打印机 解析:送分题,前三个都是 ...

  2. 02.Numpy

    01.array # -*- coding: utf-8 -*- """ Numpy 패키지 특징 - 선형대수(벡터, 행렬) 연산에 효과적인 함수 제공 - lis ...

  3. .net 本地日志的添加

    /// <summary> /// 写入日志到文本文件 /// </summary> /// <param name="userName">用户 ...

  4. rpm 安装、卸载软件命令 ——以nginx为例

    1.安装 命令:rpm    -ivh    nginx-1.14.0-1.el7_4.ngx.x86_64.rpm 2.查看安装结果 命令:rpm   -qa  | grep  nginx 3.升级 ...

  5. LBS(Location Based Service)(基于位置的服务)

    LBS(Location Based Service)(基于位置的服务) Android 中定位方式基本可以分为两种:GPS定位,网络定位. GPS定位的工作原理是基于手机内置的GPS硬件直接和卫星进 ...

  6. 影响CSS的margin合并的几个属性

    很多人知道,在CSS中存在Margin合并的现象,比如下代码: <style> div { margin:10px; height:100px; background:red; } < ...

  7. exit()

    exit()通常是用在子程序中用来终结程序用的,使用后程序自动结束,跳回操作系统. exit(0) 表示程序正常退出,exit⑴/exit(-1)表示程序异常退出. exit() 结束当前进程/当前程 ...

  8. 给出两个单词word1和word2,写一个函数计算出将word1 转换为word2的最少操作次数。

    问题: 给出两个单词word1和word2,写一个函数计算出将word1 转换为word2的最少操作次数. 你总共三种操作方法: 1.插入一个字符 2.删除一个字符 3.替换一个字符 格式: 输入行输 ...

  9. mysql学习1

    1.什么是数据库? 数据的仓库,如在ATM的示例中创建了一个db目录,称其为数据库 2.安装 下载 http://dev.mysql.com/downloads/mysql/ 安装 windows: ...

  10. mobile_轮播图_transform 版本_transform 读写二合一

    轮播图_transform 版本 关键点: 2D 变换 transform 不会改变 元素 在 文档流 中的位置 定位 position 会改变 元素 在 文档流 中的位置 语句解析太快,使用 set ...