APP下载
报价宝  ›  科技  › 

Java黑科技之源:JVMTI完全解读

报价宝 来源:baojiabao.com 发布时间:2019-07-01 07:46:00 09月11日更新
报价宝综合消息Java黑科技之源:JVMTI完全解读

专注于Java领域优质技术,欢迎关注来自:java漫游

Java生态中有一些非常规的技术,它们能达到一些特别的效果。这些技术的实现原理不去深究的话一般并不是广为人知。这种技术通常被称为黑科技。而这些黑科技中的绝大部分底层都是通过JVMTI实现的。

形象地说,JVMTI是Java虚拟机器提供的一整套后门。通过这套后门可以对虚拟机器方方面面进行监控,分析。甚至干预虚拟机器的执行。

下面先介绍下哪些黑科技是通过JVMTI实现的,再详细的介绍JVMTI。

JVMTI可以用来实现哪些黑科技

使用JVMTI对class档案加密

有时一些涉及到关键技术的class档案或者jar包我们不希望对外暴露,因而需要进行加密。使用一些常规的手段(例如使用混淆器或者自定义类载入器)来对class档案进行加密很容易被反编译。反编译后的程式码虽然增加了阅读的难度,但花费一些功夫也是可以读懂的。使用JVMTI我们可以将解密的程式码封装成.dll,或.so 档案。这些档案想要反编译就很麻烦了,另外还能加壳。解密程式码不能被破解,从而也就保护了我们想要加密的class档案。

使用JVMTI实现应用效能监控(APM)

在微服务大行其道的环境下,分散式系统的逻辑结构变得越来越复杂。这给系统性能分析和问题定位带来了非常大的挑战。基于JVMTI的APM能够解决分散式架构和微服务带来的监控和运维上的挑战。APM通过汇聚业务系统各处理环节的实时资料,分析业务系统各事务处理的交易路径和处理时间,实现对应用的全链路效能监测。开源的Pinpoint, ZipKin, Hawkular,商业的AppDynamics,OneAPM,Google Dapper等都是个中好手。

产品执行时错误监测及除错

想要看生产环境的异常,最原始的方式是登入到生产环境的机器检视日志。稍微高阶一点的方式是通过日志监控或者APM等工具将异常采集上来。但是这些手段都有许多明显的缺点。首先,不是所有的异常都会被打印到日志中,有些异常可能被程式码吃掉了;其次,打印异常的时候通常只有异常堆叠资讯,异常发生时上下文的变数值很难获取到(除非有经验的程序员将其打印出来了),而这些资讯对定位异常的原因至关重要。基于JVMTI可以开发出一款工具来时事监控生产环境的异常。这方面有一款成熟的商业软件OverOps,其有三个主要的功能:1. 采集到所有的异常,包括try catch之后没有打印出来的异常;2. 可以采集到异常发生时上下文所有变数的值;3. 可以将异常发生的堆叠对应的源代码采集展示出来,从而在一个系统上就可以看程式码定位问题,不需要开启ide除错源代码。

JAVA程式的除错(debug)。

一般JAVA的IDE都自带了除错工具。例如Eclipse的侦错程式相信大部分人都使用过。它的侦错程式org.eclipse.jdt.debug外挂底层就是呼叫的JVMTI来实现的。不仅如此,随着服务云化的发展,google甚至推出了云端除错工具cloud debugger。它时一个web应用,可以直接对生产环境进行远端除错,不需要重启或者中断服务。阿里也有类似的工具Zdebugger。

JAVA程式的诊断(profile)。

当出现cpu使用率过高、执行绪死锁等问题时,需要使用一些JAVA效能剖析或者诊断工具来分析具体的原因。例如Alibaba开源的Java诊断工具Arthas,深受开发者喜爱。Arthas的功能十分强大,它可以检视或者动态修改某个变数的值、统计某个方法呼叫链上的耗时、拦截方法前后,打印引数值和返回值,以及异常资讯等。

热载入

热载入指的是在不重启虚拟机器的情况下重新载入一些class。热载入可以使本地除错程式码非常节省时间,不用每次更新程式码都重启一边程式。同时,在一线不方便重启的线上环境也能派上用场。这方面的代表产品有商业产品JRebel等。JRebel能够对应用中的任何class起作用。

JVMTI是什么

JVMTI的定义及原理

在介绍JVMTI之前,需要先了解下Java平台除错体系JPDA(Java PlatformDebugger Architecture)。它是Java虚拟机器为除错和监控虚拟机器专门提供的一套界面。如下图所示,JPDA被抽象为三层实现。其中JVMTI就是JVM对外暴露的界面。JDI是实现了JDWP通讯协议的客户端,侦错程式通过它和JVM中被除错程式通讯。

JVMTI 本质上是在JVM内部的许多事件进行了埋点。通过这些埋点可以给外部提供当前上下文的一些资讯。甚至可以接受外部的命令来改变下一步的动作。外部程式一般利用C/C++实现一个JVMTIAgent,在Agent里面注册一些JVM事件的回拨。当事件发生时JVMTI呼叫这些回拨方法。Agent可以在回拨方法里面实现自己的逻辑。JVMTIAgent是以动态连结库的形式被虚拟机器载入的。

JVMTI的历史

JVMTI 的前身是JVMDI(Java Virtual Machine Profiler Interface) 和 JVMPI(Java Virtual Machine Debug Interface),它们原来分别被用于提供除错 Java 程式以及 Java 程式调节效能的功能。在 J2SE 5.0 之后 JDK 取代了JVMDI 和 JVMPI 这两套界面,JVMDI 在最新的 Java SE 6 中已经不提供支援,而 JVMPI 也计划在 Java SE 7 后被彻底取代。

JVMTI的功能

JVMTI处于整个JPDA 体系的最底层,所有除错功能本质上都需要通过 JVMTI 来提供。从大的方面来说,JVMTI 提供了可用于 debug 和profiler 的界面;同时,在 Java 5/6 中,虚拟机器界面也增加了监听(Monitoring),执行绪分析(Thread analysis)以及覆盖率分析(Coverage Analysis)等功能。从小的方面来说包含了虚拟机器中执行绪、内存、堆、栈、类、方法、变数,事件、定时器处理等等诸多功能。具体可以参考oracle 的文件:https://docs.oracle.com/javase/1.5.0/docs/guide/jvmti/jvmti.html。通过这些界面,开发人员不仅可以除错在该虚拟机器上执行的 Java 程式,还能检视它们执行的状态,设定回拨函式,控制某些环境变数,从而优化程式效能。

JVMTI的实现

JVMTI 并不一定在所有的 Java 虚拟机器上都有实现,不同的虚拟机器的实现也不尽相同。不过在一些主流的虚拟机器中,比如 Sun 和 IBM,以及一些开源的如Apache Harmony DRLVM 中,都提供了标准 JVMTI 实现。

参考:

https://docs.oracle.com/javase/1.5.0/docs/guide/jvmti/jvmti.htmlhttps://www.ibm.com/developerworks/cn/java/j-lo-jpda2/http://blog.caoxudong.info/blog/2017/12/07/jvmti_referencehttp://lovestblog.cn/blog/2015/09/14/javaagent/https://www.jianshu.com/p/e59c4eed44a2

文章标签: 报价宝 降噪耳机价格 耳机价格 红米手机价格 华为手机价格 小米手机价格 电视机价格 笔记本电脑价格 笔记本价格 汽车价格 报价宝 笔记本价格 电视机价格 小米手机价格 耳机价格