文章目录
一、Java工具的介绍
在Java的世界中,除了Java编写的业务系统之外,还有一类程序也需要Java程序员参与编写,这类程序就是Java工具。常见的Java工具有以下几类:
- 诊断类工具,如Arthas、VisualVM等。
- 开发类工具,如Idea、Eclipse。
- APM应用性能监测工具,如Skywalking、Zipkin等。
- 热部署工具,如Jrebel等。
二、Java Agent技术
1、介绍
Java Agent技术是JDK提供的用来编写Java工具的技术,使用这种技术生成一种特殊的jar包,这种jar包可以让Java程序运行其中的代码。
Java Agent技术实现了让Java程序执行独立的Java Agent程序中的代码,执行方式有两种:
- 静态加载模式。
- 动态加载模式。
2、静态加载模式
静态加载模式可以在程序启动的一开始就执行我们需要执行的代码,适合用APM等性能监测系统从一开始就监控程序的执行性能。静态加载模式需要在Java Agent的项目中编写一个premain的方法,并打包成jar包。
接下来使用以下命令启动Java程序,此时Java虚拟机将会加载agent中的代码并执行。
premain方法会在主线程中执行。
3、动态加载模式
动态加载模式可以随时让java agent代码执行,适用于Arthas等诊断系统。动态加载模式需要再Java Agent的项目中编写一个agentmain的方法,并打包成jar包。
接下来使用以下代码就可以让java agent代码在指定的java进程中执行了。
agentmain方法会在独立线程中执行。
三、搭建java agent静态加载模式环境
1、创建maven项目
添加maven-assembly-plugin插件,此插件可以打包出java agent的jar包。
2、编写类和premain方法
premian方法中打印一行信息。
3、编写MANIFEST.MF文件
此文件主要用于描述java agent的配置属性,比如使用哪一类的premain方法。
4、使用maven-assembly-plugin进行打包
5、创建Spring Boot应用
静态加载上一步打包完的java agent
6、打印方法执行的参数和耗时
(1)介绍
打印方法执行的参数和耗时需要对原始类的方法进行增强,可以使用类似Spring AOP这类面向切面编程的方式,但是考虑到并非每个项目都使用了Spring框架,所以我们选择的是最基础的字节码增强框架。字节码增强框架是在当前类的字节码信息中插入一部分字节码指令,从而起到增强的作用。
(2)ASM
ASM是一个通用的Java字节码操作和分析框架。它可用于直接以二进制形式修改现有类或动态生成类。ASM重点关注性能。让操作尽可能小尽可能快,所以它非常适合在动态系统中使用。ASM的缺点是代码复杂。ASM的官网:https://asm.ow2.io/
(3)操作步骤
- 引入依赖:
- 搭建基础框架,此代码为固定代码
- 编写一个类描述如何去增强类,类需要继承自MethodVisitor
(3)Byte Buddy
Byte Buddy是一个代码生成和操作库,用于在Java应用程序运行时创建和修改Java类,而无需编译器的帮助。Byte Buddy底层基于ASM,提供了非常方便的API。
官网地址:https://bytebuddy.net/
操作步骤:
-
引入依赖
-
搭建基础框架,此代码为固定代码
-
编写一个Advice通知描述如何去增强类
四、JMX技术
1、背景
JMX(Java Management Extensions)是Java平台上的一套为应用程序、设备、系统等植入管理功能的框架。JMX设计用于提供一个标准的方式来监控和管理Java应用程序、设备和服务。它定义了一套用于监控和管理资源的接口、类和服务,这些资源可以是任何Java应用程序,包括Java虚拟机(JVM)本身。
JMX架构主要由以下几个部分组成:
- JMX Agent(JMX代理):JMX Agent是运行在Java虚拟机上的一个组件,它管理着JVM内部的各种资源。Agent内部包含了MBean Server(MBean服务器),用于注册和管理MBean(Managed Beans,管理Bean)。
- MBean Server(MBean服务器):MBean Server是JMX Agent的核心,负责注册和存储MBean。MBean是实现了特定接口的Java对象,这些对象封装了需要被管理资源的信息和操作。MBean Server为这些MBean提供了一个统一的注册和访问机制。
- MBean(管理Bean):MBean是JMX的核心概念,它是代表被管理资源的Java对象。MBean可以是标准的(Standard MBean),动态的(Dynamic MBean),或者开放的(Open MBean)。它们封装了资源的信息和操作,使得外部可以通过JMX接口对这些资源进行管理。
- Connectors(连接器):JMX提供了多种连接器,用于JMX客户端与MBean Server之间的通信。这些连接器可以是RMI(Remote Method Invocation,远程方法调用)、JMXMP(JMX Messaging Protocol,JMX消息协议)或者JMX over HTTP等。通过这些连接器,JMX客户端可以远程连接到MBean Server,进而对MBean进行管理。
- JMX客户端:JMX客户端是一个用于与MBean Server交互的应用程序。它可以使用JMX API来查询MBean Server中的MBean信息,执行MBean上的操作,以及接收来自MBean的通知。
JMX广泛应用于Java应用程序的监控和管理中,包括JVM的性能监控、Web应用的监控、数据库的监控等。通过使用JMX,开发者可以很方便地实现对Java应用程序的远程监控和管理,从而提高应用程序的可靠性和可维护性。
2、介绍
JDK从1.5开始提供了Java Management Extensions(JMX)技术,通过Mbean对象的写入和获取,实现:
- 运行时配置的获取和更改。
- 应用程序运行信息的获取(线程栈、内存、类信息等)。
3、使用
获取JVM默认提供的Mbean可以通过如下方式,例如获取内存信息:
ManagementFacotry提供了一系列的方法获取各种各样的信息:
4、ManagementFacotry.getPlatformMXBeans
更多的信息可以通过ManagementFacotry.getPlatformMXBeans获取,比如:
通过这种方式,获取到了Java虚拟机中分配的直接内存和内存映射缓冲区的大小:
获取到虚拟机诊断用额MXBean,通过这个Bean对象可以生成内存快照。
5、Instumentation对象
Java Agent中可以获得Java虚拟机提供的Instumentation对象:
该对象有以下几个作用:
- redefine,重新设置类的字节码信息。
- retransform,根据现有类的字节码信息进行增强。
- 获取所有已加载类的信息。