【JVM】Java工具(Arthas,APM,Java Agent,JMX)

server/2024/9/19 13:23:12/ 标签: jvm, java, 开发语言

Java工具

常见的Java工具有以下几类:

1、诊断类工具,如Arthas、VisualVM等。

2、开发类工具,如Idea、Eclipse。

3、APM应用性能监测工具,如Skywalking、Zipkin等。

4、热部署工具,如Jrebel等。

Arthas中 Java Agent技术

Java Agent技术是JDK提供的用来编写Java工具的技术,使用这种技术生成一种特殊的jar包,这种jar包可以让Java程序运行其中的代码。

在这里插入图片描述

Java Agent技术实现了让Java程序执行独立的Java Agent程序中的代码,执行方式有两种:

静态加载模式

静态加载模式可以在程序启动的一开始就执行我们需要执行的代码,适合用APM等性能监测系统从一开始就监控程序的执行性能。静态加载模式需要在Java Agent的项目中编写一个premain的方法,并打包成jar包。

接下来使用以下命令启动Java程序,此时Java虚拟机将会加载agent中的代码并执行。

在这里插入图片描述

premain方法会在主线程中执行:

在这里插入图片描述

动态加载模式

动态加载模式可以随时让java agent代码执行,适用于Arthas等诊断系统。动态加载模式需要在Java Agent的项目中编写一个agentmain的方法,并打包成jar包。

在这里插入图片描述

接下来使用以下代码就可以让java agent代码在指定的java进程中执行了。

agentmain方法会在独立线程中执行:

在这里插入图片描述
在这里插入图片描述

简化版的Arthas

内存使用情况 JMX技术

JDK从1.5开始提供了Java Management Extensions (JMX) 技术,通过Mbean对象的写入和获取,实现:

运行时配置的获取和更改

应用程序运行信息的获取(线程栈、内存、类信息等)

在这里插入图片描述

获取JVM默认提供的Mbean可以通过如下的方式,例如获取内存信息:

在这里插入图片描述

ManagementFactory提供了一系列的方法获取各种各样的信息:

在这里插入图片描述

方法的执行参数和耗时

Spring AOP是不是也可以实现类似的功能呢?

Spring AOP 确实可以实现统计方法执行时间,打印方法参数等功能,但是使用这种方式存在几个问题:

代码有侵入性,AOP代码必须在当前项目中被引入才能完成相应的功能。

无法做到灵活地开启和关闭功能。

与Spring框架强耦合,如果项目没有使用Spring框架就不可以使用。

所以使用Java Agent技术 + 字节码增强技术,就可以解决上述三个问题。

ASM字节码增强技术

字节码增强框架是在当前类的字节码信息中插入一部分字节码指令,从而起到增强的作用。

ASM是一个通用的 Java 字节码操作和分析框架。它可用于直接以二进制形式修改现有类或动态生成类。ASM重点关注性能。让操作尽可能小且尽可能快,所以它非常适合在动态系统中使用。ASM的缺点是代码复杂。

ASM的官方网址:https://asm.ow2.io/

太复杂了,没有实现打印方法执行参数和耗时。

Byte Buddy字节码增强技术

Byte Buddy 是一个代码生成和操作库,用于在 Java 应用程序运行时创建和修改 Java 类,而无需编译器的帮助。 Byte Buddy底层基于ASM,提供了非常方便的 API。

在这里插入图片描述

Byte Buddy官网: https://bytebuddy.net/

APM系统的数据采集

Application performance monitor (APM) 应用程序性能监控系统是采集运行程序的实时数据并使用可视化的方式展示,使用APM可以确保系统可用性,优化服务性能和响应时间,持续改善用户体验。常用的APM系统有Apache Skywalking、Zipkin等。

Skywalking官方网站: https://skywalking.apache.org/

总结

Arthas这款工具用到了什么Java技术?

Arthas主要使用了Java Agent技术,这种技术可以让运行中的Java程序执行Agent中编写的代码。

Arthas使用了Agent中的动态加载模式,可以选择让某个特定的Java进程加载Agent并执行其中的监控代码。监控方面主要使用的就是JMX提供的一些监控指标,同时使用字节码增强技术,对某些类和某些方法进行增强,从而监控方法的执行耗时、参数等内容。

APM系统是如何获取到Java程序运行中的性能数据的?

APM系统比如Skywalking主要使用了Java Agent技术,这种技术可以让运行中的Java程序执行Agent中编写代码。

Skywalking编写了Java Agent,使用了Agent中的静态加载模式,使用字节码增强技术,对某些类和某些方法进行增强,从而监控方法的执行耗时、参数等内容。比如对Controller层方法增强,获取接口调用的时长信息,对数据库连接增强,获取数据库查询的时长、SQL语句等信息。


http://www.ppmy.cn/server/31774.html

相关文章

初识MVC

初识MVC 理论部分 今天第一次学MVC,拿到一个练手项目。现在来记录一下学习过程。 项目的背景就是个学生管理系统。我只做后端。 从大的来说MVC将应用程序分为三个主要组件(部分): 模型(Model)是应用程序…

Springboot 学习之数据库配置项加密工具:ulisesbocchio

在 springboot 项目中&#xff0c;我们为了规避安全漏洞的问题&#xff0c;要对数据库连接的用户名和密码等信息加密处理。ulisesbocchio 是一款好用的加密插件&#xff0c;下面分享一下使用方法。 一.配置 mavan 依赖&#xff0c;直接使用 spring-boot-starter 方式 <depe…

定点小数_

目录 定点小数表示和运算 定点小数的原码 定点小时加减法运算 定点小数 vs 定点整数 定点小数表示和运算 定点小数的原码 定点小数原反补转换 定点小时加减法运算 定点小数 vs 定点整数 定点小数原码依然是 取值范围等比数列 符号位 定点小数 同样的:

tensorflow_decision_forests\tensorflow\ops\inference\inference.so not found

恰好有一个帖子提到了py3.10里面的解决方案 pip install --user tensorflow2.11.0My tensorflow version is 2.11.0 and my tensorflow_decision_forests version is 1.2.0 so those should be compatible. I also am using Python version 3.10.11原文链接&#xff1a; http…

创建和激活python虚拟环境(venv), 以及在vscode上运行python虚拟环境

最近使用python做项目&#xff0c;发现佬们都是在用python的虚拟环境来放项目。发现确实有一些优势在这之中&#xff0c; 首先就是隔离性&#xff0c;我们将每个项目放入相对应的环境配置&#xff0c;可以有效避免乱七八糟的库出现在解释器中。其次就是可移植性强&#xff0c;…

【C++风云录】图形和动作捕捉库全面解析:从OpenPose到OpenCV

深入浅出&#xff1a;六大计算机视觉和动作捕捉库的教程和比较 前言 本文将为读者详细介绍六种在计算机视觉领域广泛使用的开源软件和SDK&#xff0c;包括OpenPose、Vicon SDK、Intel RealSense SDK、Microsoft Kinect SDK、PCL (Point Cloud Library)和OpenCV。我们会一一解…

【前端学习——call和apply函数】

call()和apply()这两个方法的作用可以简单归纳为改变this指向&#xff0c;从而让我们的this指向不在是谁调用了函数就指向谁。 call()方法的作用和 apply() 方法类似&#xff0c;区别就是call()方法接受的是参数列表&#xff0c;而apply()方法接受的是一个参数数组。 https:/…

用C#写一个特性,在函数上面可以自动计算函数耗时情况

用C#写一个特性&#xff0c;在函数上面可以自动计算函数耗时情况 TimingAttribute类是自定义的特性类&#xff0c;用来标记需要计时的方法。TimingInterceptor类是一个拦截器&#xff0c;它通过反射来拦截被TimingAttribute标记的方法&#xff0c;并在方法执行前后进行计时。My…

面试题分享之Java集合篇(三)

注意&#xff1a;文章若有错误的地方&#xff0c;欢迎评论区里面指正 &#x1f36d; 系列文章目录 面试题分享之Java基础篇&#xff08;二&#xff09;面试题分享之Java基础篇&#xff08;三&#xff09; 面试题分享之Java集合篇&#xff08;一&#xff09;、 面试题分享之Ja…

Java 基础面试 -- 异常处理

一、引言 在Java编程中&#xff0c;异常处理是确保程序稳定性和健壮性的重要机制。当程序在运行时遇到不可预见的问题&#xff0c;如文件读取失败、网络错误、除零异常等&#xff0c;异常处理机制允许我们捕获这些错误&#xff0c;并进行相应的处理&#xff0c;从而避免程序崩…

SQL-慢查询的定位及优化

定位慢查询sql 启用慢查询日志&#xff1a; 确保MySQL实例已经启用了慢查询日志功能。可以通过以下命令查看是否启用&#xff1a; SHOW VARIABLES LIKE slow_query_log;如果未启用&#xff0c;可以通过以下命令启用&#xff1a; SET GLOBAL slow_query_log ON;配置慢查询日志&…

ssm104园区停车管理系统+jsp

园区停车管理系统的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信息的宣传和管…

数据库管理-第180期 23ai: Cloud/Container Plus AI(20240503)

数据库管理180期 2024-05-03 数据库管理-第180期 23ai: Cloud/Container Plus AI&#xff08;20240503&#xff09;1 Free版本更新2 如我所期3 宣传图Oracle Vector DBJSON Relational DualityProperty GraphsShardingTrue CacheFirewall 总结 数据库管理-第180期 23ai: Cloud/…

QT:label标签/进度条的使用

文章目录 设置不同格式的文本显示图片文本对齐/自动换行/缩进/边距LCDNumber倒计时 ProgressBar进度条 设置不同格式的文本 在文本格式中&#xff0c;存在富文本&#xff0c;makedown格式的文本&#xff0c;还有纯文本&#xff0c;下面就依据这三个进行举例 #include "w…

嵌入式开发四:STM32 基础知识入门

为方便更好的学习STM32单片机&#xff0c;本篇博客主要总结STM32的入门基础知识&#xff0c;重点在于理解寄存器以及存储器映射和寄存器映射&#xff0c;深刻体会STM32是如何组织和管理庞大的寄存器&#xff0c;从而提高开发效率的&#xff0c;为后面的基于标准库的开发做好铺垫…

Python实战开发及案例分析(2)——单目标优化

在Python中&#xff0c;进行单目标优化主要涉及定义一个优化问题&#xff0c;包括一个目标函数和可能的约束条件&#xff0c;然后选择合适的算法来求解。Python提供了多种库&#xff0c;如SciPy、Pyomo、GEKKO等&#xff0c;用于处理各种优化问题。 案例分析&#xff1a;使用 …

python实验一 简单的递归应用

实验一 实验题目 1、兔子繁殖问题(Fibonacci’s Rabbits)。一对兔子从出生后第三个月开始&#xff0c;每月生一对小兔子。小兔子到第三个月又开始生下一代小兔子。假若兔子只生不死&#xff0c;一月份抱来一对刚出生的小兔子&#xff0c;问一年中每个月各有多少只兔子。 &…

使用protoc-jar-maven-plugin生成grpc项目

在《使用protobuf-maven-plugin生成grpc项目》中我们使用protobuf-maven-plugin完成了grpc代码的翻译。本文我们将只是替换pom.xml中的部分内容&#xff0c;使用protoc-jar-maven-plugin来完成相同的功能。总体来说protoc-jar-maven-plugin方案更加简便。 环境 见《使用proto…

Android Framework中PackageManagerService的深度剖析

摘要 Android操作系统的核心服务之一——PackageManagerService(PMS)&#xff0c;扮演着至关重要的角色&#xff0c;负责维护系统中所有应用程序的生命周期管理。本文旨在全面探讨PMS的功能特性、工作流程、实际应用场景&#xff0c;并对其进行优劣分析&#xff0c;以期为开发者…

多级留言/评论的功能实现——SpringBoot3后端篇

目录 功能描述数据库表设计后端接口设计实体类entity 完整实体类dto 封装请求数据dto 封装分页请求数据vo 请求返回数据 Controller控制层Service层接口实现类 Mapper层Mybatis 操作数据库 补充&#xff1a;返回的数据结构自动创建实体类 最近毕设做完了&#xff0c;开始来梳理…