JVM:JavaAgent技术

一、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,根据现有类的字节码信息进行增强。
  • 获取所有已加载类的信息。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

玉成226

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值