java 诊断工具—— Arthas

程序员xx:我这个任务做完了,还有什么任务么?

经理:咱们这个项目有些地方速度有些慢,你来优化一下!

该说不说!小编做的这些功能,最讨厌的就是优化!某些前辈大佬写的代码小辈我实在不敢恭维!那逻辑!那sql!

接下来!今天的主角就登场了,阿里巴巴最近开源出来的一个针对 java 的工具,主要是针对 java 的问题进行诊断---Arthas(阿尔萨斯)

这就是使用Arthas诊断出的效率问题 [滑稽] 是不是特别爽,有了这个工具,妈妈再也不用担心我优化问题了,哪里慢改哪里!

一、概述

这个工具可以协助你做下面这些事情:

  • 这个类是从哪个 jar 包加载而来的?
  • 为什么会报各种类相关的 Exception?
  • 线上遇到问题无法 debug 好蛋疼,难道只能反复通过增加 System.out 或通过加日志再重新发布吗?
  • 线上的代码为什么没有执行到这里?是由于代码没有 commit?还是搞错了分支?
  • 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  • 是否有一个全局视角来查看系统的运行状况?
  • 有什么办法可以监控到JVM的实时运行状态?

二、安装方式

1.1 window 安装方式

下载地址:http://search.maven.org/classic/#search%7Cga%7C1%7Cg%3A%22com.taobao.arthas%22%20AND%20a%3A%22arthas-packaging%22

下载完成后,解压缩,如下图所示::

在Download栏下载最新的 bin.zip 包,解压后在bin目录有 as.bat。此脚本暂时只接受一个参数 pid,即只能诊断本机上的 Java 进程。

启动命令为:

as.bat <pid>

注:我在 window 10 上面启动的时候遇到如下问题,

D:\download\arthas-packaging-3.0.4-bin>telnet
'telnet' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

解决办法为:“控制面板” ——> “启动或关闭Windows功能” ——> 勾选 “Telnet 功能”

1.2 Linux 安装方式

安装Arthas:

curl -L https://alibaba.github.io/arthas/install.sh | sh

启动Arthas:

./as.sh

成功启动后,会看到如下界面。

三、常用命令

3.1 基础命令

  • help——查看命令帮助信息
  • cls——清空当前屏幕区域
  • session——查看当前会话的信息
  • reset——重置增强类,将被 Arthas 增强过的类全部还原,Arthas 服务端关闭时会重置所有增强过的类
  • version——输出当前目标 Java 进程所加载的 Arthas 版本号
  • quit——退出当前 Arthas 客户端,其他 Arthas 客户端不受影响
  • shutdown——关闭 Arthas 服务端,所有 Arthas 客户端全部退出
  • keymap——Arthas快捷键列表及自定义快捷键

jvm相关

  • dashboard——当前系统的实时数据面板
  • thread——查看当前 JVM 的线程堆栈信息
  • jvm——查看当前 JVM 的信息
  • sysprop——查看和修改JVM的系统属性
  • New! getstatic——查看类的静态属性

class/classloader相关

  • sc——查看JVM已加载的类信息
  • sm——查看已加载类的方法信息
  • dump——dump 已加载类的 byte code 到特定目录
  • redefine——加载外部的.class文件,redefine到JVM里
  • jad——反编译指定已加载类的源码
  • classloader——查看classloader的继承树,urls,类加载信息,使用classloader去getResource

monitor/watch/trace相关

请注意,这些命令,都通过字节码增强技术来实现的,会在指定类的方法中插入一些切面来实现数据统计和观测,因此在线上、预发使用时,请尽量明确需要观测的类、方法以及条件,诊断结束要执行 shutdown 或将增强过的类执行 reset 命令。

  • monitor——方法执行监控
  • watch——方法执行数据观测
  • trace——方法内部调用路径,并输出方法路径上的每个节点上耗时
  • stack——输出当前方法被调用的调用路径
  • tt——方法执行数据的时空隧道,记录下指定方法每次调用的入参和返回信息,并能对这些不同的时间下调用进行观测

options

  • options——查看或设置Arthas全局开关

管道

Arthas支持使用管道对上述命令的结果进行进一步的处理,如sm org.apache.log4j.Logger | grep

  • grep——搜索满足条件的结果
  • plaintext——将命令的结果去除颜色
  • wc——按行统计输出结果

Web Console 通过websocket连接Arthas。

  • Web Console

其他特性

  • 异步命令支持
  • 执行结果存日志
  • 批处理的支持
  • ognl表达式的用法说明

3.2 使用示例

首先,在窗口中,输入 help 查看一下所有提供的可用命令(他的通信本质是通过 telnet 协议来通信的),如下图:

这里主要说一下 watch ,这个命令对变量进行数据监测。

首先贴上我的测试代码:

package com.oct.tail;

import java.util.UUID;

/**
 * @Author Ryan
 * @Date 2018/9/18  9:58
 * @desc
 */
public class OtherTestCase {

    /**
     *
     * @return
     */
    public static String uuid(){
       return UUID.randomUUID().toString().replaceAll("-", "");
    }

    public static void main(String[] args) {

        while(true){
            System.out.println("uuid = " + uuid());

            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

如下我做一个示例 ( 本人是基于 Window 10 , JDK 8 环境, Linux 雷同),(对于 watch 命令我假装不知道如何使用,立即输入 watch help 来看看会有什么玩意儿):

在这里,我们针对方法 uuid() 返回值进行监测。监测结果如下:

一目了然!是不是爽的起飞

4. 退出arthas

如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。

如果想完全退出arthas,可以执行shutdown命令。

当然了,Arthas不只有这些功能,更多的功能请大家浏览官方查看详细的用法以及命令

快上车!:

https://alibaba.github.io/arthas/sm.html

陛下...看完奏折,点个赞再走吧!

原文发布于微信公众号 - 互扯程序(chat_routine)

原文发表时间:2018-10-22

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT技术精选文摘

从构建分布式秒杀系统聊聊分布式锁

最近懒成一坨屎,学不动系列一波接一波,大多还都是底层原理相关的。上周末抽时间重读了周志明大湿的 JVM 高效并发部分,每读一遍都有不同的感悟。路漫漫,借此,把前...

1113
来自专栏枕边书

LINUX下的PHP

由于linux系统的稳定性,大部分的PHP服务器都被部署在linux上,而且像redis等扩展在linux能得到更好的支持,所以对于PHP程序员来说,使用lin...

3118
来自专栏Rovo89

安装SSserver和配置(二)

1.2K3
来自专栏owent

Gitlab环境搭建小计

Gitlab 开源仓库软件包官方地址: https://about.gitlab.com/

1021
来自专栏程序员宝库

Linux 下各文件夹的结构说明及用途介绍

linux下各文件夹的结构说明及用途介绍: /bin:二进制可执行命令。 /dev:设备特殊文件。 /etc:系统管理和配置文件。 /etc/rc.d:启动的配...

44612
来自专栏破晓之歌

15款Django开发常用软件包 原

1. Python social auth 一款社交账号认证/注册机制,支持Django、Flask、Webpy等在内的多个开发框架,提供了约50多个服...

602
来自专栏北京马哥教育

Linux 下各文件夹的结构说明及用途介绍

/home:用户主目录的基点,比如用户user的主目录就是/home/user,可以用~user表示。

1330
来自专栏Web项目聚集地

MyBatis-逆向工程「Generator使用指南」

当你利用搜索引擎搜索Maven会出来很多名词:对象模型、标准集合、依赖管理系统这是啥啊?差不多得你会用了Maven才会理解这些名称吧,我找到了一个博主的博客

1242
来自专栏枕边书

shell实现SSH自动登陆

前言 公司开发使用docker,每次登陆自己开发机总要输入 ssh user_name@ip_string,然后再确认输入password,手快了还经常会输错。...

4008
来自专栏北京马哥教育

史上最全 Linux 下各文件夹的结构说明及用途介绍

运维行业正在变革,推荐阅读:30万年薪Linux运维工程师成长魔法 linux下各文件夹的结构说明及用途介绍: /bin:二进制可执行命令。 /dev:设备特殊...

43611

扫码关注云+社区