【死磕JVM】用Arthas排查JVM内存 真爽!我从小用到大

您所在的位置:网站首页 jvm排查问题 【死磕JVM】用Arthas排查JVM内存 真爽!我从小用到大

【死磕JVM】用Arthas排查JVM内存 真爽!我从小用到大

2024-06-18 23:46| 来源: 网络整理| 查看: 265

在这里插入图片描述

Arthas是啥

当我们系统遇到JVM或者内存溢出等问题的时候,如何对我们的程序进行有效的监控和排查,就发现了几个比较常用的工具,比如JDK自带的 jconsole、jvisualvm还有一个最好用的工具——jprofiler,但是这个是收费的,或者除了很有钱的公司,一般很少人会用这个,还有一个就是我们今天的主角——Arthas ,为什么今天会重点讲这个呢?

官网地址:http://arthas.gitee.io/ GitHub地址:https://github.com/alibaba/arthas/

Arthas 是Alibaba开源的Java诊断工具,采用命令行交互模式,提供了较为丰富的功能,主要还是他是免费里面的算是好用且功能比较强大的一个JVM排查的插件,在了解这个利器之后,发现还是挺好用的,而且支持的功能也比较全面,那么Arthas到底可以为我们做哪些事情呢?

提供性能看板,包括线程、cpu、内存等信息,并且会定时的刷新。根据各种条件查看线程快照。找出cpu占用率最高的n个线程输出jvm的各种信息,如gc算法、jdk版本、ClassPath等遇到问题无法在线上 debug,热部署加日志直接替换查看某个类的静态属性,也可以通过ognl语法执行一些语句查看已加载的类的详细信息,这个类从哪个jar包加载的,查看类的方法的信息dump 类的字节码到指定目录直接反编译指定的类快速定位应用的热点,生成火焰图可以监控到JVM的实时运行状态

以前,你碰到这些问题,解决的办法大多是,修改代码,重新上线。但是在大公司里,上线的流程是非常繁琐的,如果为了多加一行日志而重新发布版本,无疑是非常折腾人的。但是阿里巴巴开源的Arthas 有了更为优雅的线上调试方法。

Arthas 支持JDK6,同时可以在 Linux/Mac/Windows上运行,自动Tab 补全功能,更方便我们定位问题和诊断

下载地址:https://arthas.gitee.io/download.html 你可以下载zip的包我下载的是arthas-packaging-3.5.0-bin.zip 或者通过命令去下载

wget https://alibaba.github.io/arthas/arthas-boot.jar

使用手册 1. 快速启动

当我们下载好之后,我们直接通过命令启动就可以java -jar arthas-boot.jar,但是在此之前我们需要通过检测的代码来挂靠到Arthas上面

import java.math.BigDecimal; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; public class FullGCTest { //模拟银行卡的类 private static class CardInfo { //小农的银行卡信息记录 BigDecimal price = new BigDecimal(10000000.0); String name = "牧小农"; int age = 18; Date birthdate = new Date(); public void m() {} } //线程池 定时线程池 //50个,然后设置 拒绝策略 private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(50, new ThreadPoolExecutor.DiscardOldestPolicy()); public static void main(String[] args) throws Exception { executor.setMaximumPoolSize(50); for (;;){ modelFit(); Thread.sleep(100); } } /** * 对银行卡进行风险评估 */ private static void modelFit(){ List taskList = getAllCardInfo(); //拿出每一个信息出来 taskList.forEach(info -> { // do something executor.scheduleWithFixedDelay(() -> { //调用M方法 info.m(); }, 2, 3, TimeUnit.SECONDS); }); } private static List getAllCardInfo(){ List taskList = new ArrayList(); //每次查询100张卡出来 for (int i = 0; i public static void main(String[] args) throws Exception{ for(;;){ System.in.read(); new TT().m(); } } } public class TT{ public void m(){ System.out.println(2); } }

使用命令javac *.java,编译成class文件,然后运行 T 文件

[root@VM-0-7-centos t]# java T a 2 2

当我们输入a的时候打印2,但是我们上线以后才发现,我们需要输出的1,这个是如果要从本地更改要重新发布上线,为了这一个修改,明显是不值当的,但是如果我们用 redafine 热部署就可以帮助我们直接替换,不用重新发布jvm

然后我们将 T 这个程序挂靠到 Arthas 上面去 在这里插入图片描述

然后我们直接修改 TT.java 程序 vi TT.java,将里面打印2的值修改成1

public class TT{ public void m(){ System.out.println(1); } }

然后编译执行 ```javac TT.java ````

在回到我们挂靠的Arthas 上面执行 redefine /usr/local/mxn/fuccGc/t/TT.class

[arthas@398842]$ redefine /usr/local/mxn/fuccGc/t/TT.class redefine success, size: 1, classes: TT

执行成功 大家可以看到我们在没有重新启动的情况下成功替换了class文件 在这里插入图片描述

watch

watch:方法执行的数据观测,可以通过watch指令,来监控某个类,监控后,运行下你的功能,复现下场景,arthas会提供给你具体的出参和入参,帮助你排查故障

trace

输出方法调用路径,并输出耗时,这个指令对于优化代码非常的有用,可以看出具体每个方法执行的时间,如果是for循环等重复语句,还能看出n次循环中的最大耗时,最小耗时,和平均耗时,完美!

tt

在我们对某个方法开启tt后,会记录每一次调用(我们可以设置最大监控次数)的入参和返回参数,并能对这些不同时间下调进行观测

[arthas@405136]$ tt -t FullGCTest modelFit

在这里插入图片描述

命令参数解析-t tt 命令有很多个主参数,-t 就是其中之一。这个参数的表明希望记录下类 *Test 的 print 方法的每次执行情况。 -n 3 当你执行一个调用量不高的方法时可能你还能有足够的时间用 CTRL+C 中断 tt 命令记录的过程,但如果遇到调用量非常大的方法,瞬间就能将你的 JVM 内存撑爆。

此时你可以通过 -n 参数指定你需要记录的次数,当达到记录次数时 Arthas 会主动中断tt命令的记录过程,避免人工操作无法停止的情况。

ognl表达式

ognl表达式

OGNL特殊用法请参考:https://github.com/alibaba/arthas/issues/71 OGNL表达式官方指南:https://commons.apache.org/proper/commons-ognl/language-guide.html

调用静态函数:ognl '@[email protected]("hello")' 获取静态类的静态字段:ognl '@FullGCTest@random'

Arthas还支持Web Console,详见:https://alibaba.github.io/arthas/web-console.html

总结

Arthas是一个线上Debug神器,相比于其他工具,Arthas有着比较全面的功能,上手也比较容易,对于刚开始入门的小伙伴也是可以轻松掌握的,对于文中有不懂或者有问题的小伙伴,大家可以在下面留言评论。

原创不易,希望大家多多捧场,记得一键三连!!!

我是牧小农,怕什么真理无穷,进一步有进一步的欢喜,大家加油!



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3