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

在这里插入图片描述

Arthas是啥

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

官网地址:
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<CardInfo> taskList = getAllCardInfo(); //拿出每一个信息出来 taskList.forEach(info -> { // do something executor.scheduleWithFixedDelay(() -> { //调用M方法 info.m(); }, 2, 3, TimeUnit.SECONDS); }); } private static List<CardInfo> getAllCardInfo(){ List<CardInfo> taskList = new ArrayList<>(); //每次查询100张卡出来 for (int i = 0; i < 100; i++) { CardInfo ci = new CardInfo(); taskList.add(ci); } return taskList; } }

这个是上篇文章讲述的案例,感兴趣的可以了解一下。

首先我们需要使用javac 命令将Java文件进行编译javac FullGCTest.java进行编译,然后打印GC日志,进行风险监控打印GC日志:
java -Xms200M -Xmx200M -XX:+PrintGC FullGCTest

Arthas启动命令:java -jar arthas-boot.jar

在这里插入图片描述

我们就看到了我们刚才启动的FullGCTest的应用程序,我们输入编号 1 回车,这样我们就把Arthas挂靠到我们的程序上,接下来我们只需要做对应的命令操作就可以了

在这里插入图片描述

命令详情文档:https://arthas.aliyun.com/doc/commands.html

2. 功能列表 命令 详细说明
jvm   查看当前JVM信息  
thread   查看当前JVM的线程堆栈信息  
watch   方法执行数据观测  
dashboard   当前系统的实时数据面板  
trace   方法内部调用路径,并输出方法路径上的每个节点上耗时  
stack   输出当前方法被调用的调用路径  
tt   方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测  
vmoption   查看,更新JVM已加载的类信息  
sc   查看JVM已加载的类信息  
sm   查看已加载类的方法信息  
jad   反编译指定已加载类的源码  
classloader   查看classloader的继承树,urls,类加载信息  
heapdump   类似jmap命令的heap dump 功能  
jvm

在这里插入图片描述

OPERATING-SYSTEM:系统相关参数

THREAD相关:

COUNT : JVM当前活跃的线程数

DAEMON-COUNT : JVM当前活跃的守护线程数

PEAK-COUNT: 从JVM启动开始曾经活着的最大线程数

STARTED-COUNT: 从JVM启动开始总共启动过的线程次数

DEADLOCK-COUNT: JVM当前死锁的线程数

MEMORY

FILE-DESCRIPTOR(文件描述符相关):

MAX-FILE-DESCRIPTOR-COUNT:JVM进程最大可以打开的文件描述符数

OPEN-FILE-DESCRIPTOR-COUNT:JVM当前打开的文件描述符数

thread 命令

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zydpzy.html