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

本文涉及的产品
应用实时监控服务-用户体验监控,每月100OCU免费额度
密钥管理服务KMS,1000个密钥,100个凭据,1个月
应用实时监控服务-应用监控,每月50GB免费额度
简介: Java黑科技之源:JVMTI完全解读

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中被调试程序通信。


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

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 的文档

JVMTI的实现

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

相关实践学习
通过云拨测对指定服务器进行Ping/DNS监测
本实验将通过云拨测对指定服务器进行Ping/DNS监测,评估网站服务质量和用户体验。
相关文章
|
5月前
|
存储 Java 程序员
揭秘!Java数据类型背后的“黑科技”
【6月更文挑战第13天】Java编程中的数据类型是构建程序的基础,分为基本数据类型(如整型、浮点型、字符型、布尔型)和引用数据类型(类、接口、数组)。内存管理通过垃圾回收自动化,减少错误风险。数据类型间支持自动和强制转换,但需注意精度和溢出。封装类(如Integer、Double)提供额外功能,使使用更灵活。示例代码展示了类型转换和封装类的运用。Java的数据类型设计确保了灵活性和效率,为编写高质量程序奠定基础。
35 6
|
5月前
|
缓存 安全 Java
【技术前沿】JAVA网络编程黑科技:URL与URLConnection的创新应用,带你飞越极限!
【6月更文挑战第22天】Java的URL和URLConnection在现代网络编程中扮演关键角色,不仅用于基本HTTP请求,还在微服务(弹性自动化调用)、智能缓存策略、异步处理和安全增强方面展现创新应用。例如,它们支持动态服务发现、HTTP缓存控制、非阻塞I/O和HTTPS加密,助力开发者构建高效、安全的网络解决方案。通过掌握这些技术,可以提升项目性能,应对云计算和大数据时代的挑战。
65 4
|
5月前
|
存储 Java 数据处理
Java Set:那些年被你忽视的“不重复”黑科技
【6月更文挑战第17天】Java Set接口以其独特的去重功能在集合框架中大放异彩。通过案例展示,使用HashSet可轻松实现数据去重,如`new HashSet(listWithDuplicates)`,并提供O(1)的平均查找效率,如`set.contains(element)`。Set的这些特性在处理重复与查找时提升了代码效率。善用Set,能让编程更高效。
42 2
|
5月前
|
Java 数据库连接 API
JDBC:Java数据库连接的“黑科技”大揭秘
【6月更文挑战第24天】JDBC,Java的数据库连接神器,统一了API,打破了数据库专有性的壁垒,提升开发效率。通过预处理语句示例展示了其简化数据库操作、防止SQL注入的能力。与原生数据库API对比,JDBC封装复杂性,聚焦业务逻辑,增强事务管理等功能,实乃开发者的得力工具。
32 0
|
5月前
|
存储 缓存 安全
震惊!Java Map竟然隐藏了这么多黑科技,你了解多少?
【6月更文挑战第18天】Java Map是高效的数据结构,用于键值对存储。并发时,ConcurrentHashMap通过分段锁或CAS保证安全。Java 8引入Stream API,允许流式处理Map进行复杂计算。TreeMap提供排序功能,而自定义Map实现能扩展功能,如自动过期或LRU缓存。Map的深度探索揭示了其强大潜力。
172 0
|
6月前
|
Java
Java 21的编程黑科技:未命名模式和变量的神秘力量
Java 21的编程黑科技:未命名模式和变量的神秘力量
49 0
|
运维 监控 安全
破解 Java Agent 探针黑科技!
破解 Java Agent 探针黑科技!
464 0
破解 Java Agent 探针黑科技!
|
8天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
7天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
|
7天前
|
Java 开发者
Java多线程编程的艺术与实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的技术文档,本文以实战为导向,通过生动的实例和详尽的代码解析,引领读者领略多线程编程的魅力,掌握其在提升应用性能、优化资源利用方面的关键作用。无论你是Java初学者还是有一定经验的开发者,本文都将为你打开多线程编程的新视角。 ####
下一篇
无影云桌面