Java性能监控特工,看完你就明白了!

简介: PS:最近是跳槽的高峰期,我连日加班好多天,整理出了包含16000 多道面试题的面试宝典,并且指北君也会持续更新这份面试宝典中的题目,希望它能帮助大家找到自己心仪的工作!【文末有领取方式】

Java Agent是目前各种监测调试JVM的主要技术。Eclipse,IntelliJ,Visual VM ,JConsole 等都依赖于此技术。相信你们的Java 程序部署的时候肯定也会配置各种Java Agent相关的信息。下面给大家盘一盘Java Agent!


1 Java Agent的作用


Java Agent是java.lang.instrument.Instrumentation API的一部分,Instrumentation 提供了修改字节码的机制。并且可以动态或者静态地完成。这意味着我们可以在不接触源程序代码的情况下,向程序中添加一些代码来改变程序。Java Agent有多种用途,如面向切面编程(AOP),程序分析等。AOP可以在不修改原有代码的情况下向程序提供日志记录或安全类似的功能。

我们也可以使用JavaAgent来操控字节码可以和其他的程序进行组合。在JVM的层面监听对象创建、垃圾回收,线程创建等

性能分析工具使用了大量Java Agent 在程序执行的时候分析JVM的一些参数指标。


2 Java Agent的原理


Agent类必须实现下面的方法,这个方法就是agent类的入口,类似于java 的main方法入口。

20.png

JVM初始化之后main方法执行之前premain方法会被调用,程序中可以有多个agent。每一个agent都是按照JVM初始化的顺序进行调用。如果上述 premain方法没有找到,那么JVM会调用他的重载方法。方法如下:

21.png

JVM 启动之后,可以通过attach去调用agentmain方法,许多动态的JVM参数分析都是通过这个方法来完成的。

22.png

同样的如果上述agentmain方法没有找到,那么也会执行其重载方法的版本。

23.png


下图为 OpenJDK11中的Agent类:24.png


3 一个自定义Agent示例


下面我们实现一个简单的Java Agent类来体验一下Agent。


3.1 自定义Agent类

创建普通Maven工程并新建Agent启动类

25.png


3.2 将Agent类打成jar包

将上述自定义Java Agent 类打包到jar包中,增加Maven build 参数如下

26.jpg


执行 mvn clean package命令打包后,可以看到taget目录下的jar包文件如下。

27.jpg


3.3 使用java命令使用指定的agent

这里我们使用java命令行启动并使用我们自定义的Java Agent类

28.png

java -javaagent:E:\javaNorth\javanorthagent\target\javanorthagent-1.0-SNAPSHOT.jar="hello javanorth"  com.javanorth.agent.Main

输出结果如下:

29.png



总结


本片简单介绍了Java Agent类的使用,并给出了一个简单的Agent代码示例。其中Visual VM ,JConsole 等工具会使用JDK自带的Agent来实现实现JVM状态分析。同样arthas 和skywalking也是使用的agent的技术来实现对JVM的监测分析。

附上Git地址:欢迎来瓢!

https://github.com/javatechnorth/java-study-note/tree/master/javanorthagent

面试大全包括:包括 Java 集合、JVM、多线程、并发编程、设计模式、SpringBoot、SpringCloud、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!

领取方式:扫描下方公众号【Java技术指北】回复【006】即可获取30.jpg

相关文章
|
28天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
104 38
|
4月前
|
运维 监控 算法
java实现一个动态监控系统,监控接口请求超时的趋势
java实现一个动态监控系统,监控接口请求超时的趋势
256 2
|
25天前
|
SQL 监控 Java
Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面
本文探讨了Java连接池技术的最新发展,包括高性能与低延迟、智能化管理与监控、扩展性与兼容性等方面。同时,结合最佳实践,介绍了如何选择合适的连接池库、合理配置参数、使用监控工具及优化数据库操作,以实现高效稳定的数据库访问。示例代码展示了如何使用HikariCP连接池。
14 2
|
28天前
|
Prometheus 监控 Cloud Native
JAVA线程池监控以及动态调整线程池
【10月更文挑战第22天】在 Java 中,线程池的监控和动态调整是非常重要的,它可以帮助我们更好地管理系统资源,提高应用的性能和稳定性。
65 4
|
28天前
|
Prometheus 监控 Cloud Native
在 Java 中,如何使用线程池监控以及动态调整线程池?
【10月更文挑战第22天】线程池的监控和动态调整是一项重要的任务,需要我们结合具体的应用场景和需求,选择合适的方法和策略,以确保线程池始终处于最优状态,提高系统的性能和稳定性。
110 2
消息中间件 缓存 监控
123 0
|
4月前
|
监控 算法 Java
深入探索Java虚拟机:性能监控与调优实践
在面对日益复杂的企业级应用时,Java虚拟机(JVM)的性能监控和调优显得尤为重要。本文将深入探讨JVM的内部机制,分析常见的性能瓶颈,并提供一系列针对性的调优策略。通过实际案例分析,我们将展示如何运用现代工具对JVM进行监控、诊断及优化,以提升Java应用的性能和稳定性。
|
4月前
|
缓存 Prometheus 监控
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
Java面试题:如何监控和优化JVM的内存使用?详细讲解内存调优的几种方法
95 3
|
5月前
|
监控 负载均衡 Java
Java虚拟机调优技巧及性能监控
Java虚拟机调优技巧及性能监控
|
5月前
|
监控 安全 Java
构建Java版监控系统:从入门到精通
构建Java版监控系统:从入门到精通
63 1
下一篇
无影云桌面