前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >java 诊断工具—— Arthas

java 诊断工具—— Arthas

作者头像
互扯程序
发布2018-11-22 14:53:00
1.6K0
发布2018-11-22 14:53:00
举报
文章被收录于专栏:互扯程序互扯程序

程序员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 进程。

启动命令为:

代码语言:javascript
复制
as.bat <pid>

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

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

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

1.2 Linux 安装方式

安装Arthas:

代码语言:javascript
复制
curl -L https://alibaba.github.io/arthas/install.sh | sh

启动Arthas:

代码语言:javascript
复制
./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 ,这个命令对变量进行数据监测。

首先贴上我的测试代码:

代码语言:javascript
复制
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不只有这些功能,更多的功能请大家浏览官方查看详细的用法以及命令

快上车!:

代码语言:javascript
复制
https://alibaba.github.io/arthas/sm.html

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 互扯程序 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、概述
    • 1.2 Linux 安装方式
    • 三、常用命令
      • 3.1 基础命令
        • 3.2 使用示例
          • 4. 退出arthas
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档