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

JVM诊断工具-Greys

作者头像
Luga Lee
发布2021-12-09 20:12:24
1.2K0
发布2021-12-09 20:12:24
举报
文章被收录于专栏:架构驿站
  • 工具概述

Greys为一款“事后工具” ,即服务已经上线了,无法再通过打印日志等方式进行埋点分析,此时可以借助此工具,来跟踪代码执行耗时、堆栈运行情况等。使用Greys,我们无需编写 脚步,它是命令交互式的,直接输入命令指定监控的类、方法。

  • 工作原理

(1)基于动态字节码修改技术(Hotswap)来实现运行时 Java 程序的跟踪和替换。

(2)利用了Java SE 6 新特性Instrumentation。

  • 使用场景

(1)分析哪些方法慢,查询具体的故障点

(2)查看方法的参数、返回值

(3)查看对象属性等

# 程序安装

1、在线安装方式(推荐)

代码语言:javascript
复制
  [root@testserver ~]# curl -sLk http://ompc.oss.aliyuncs.com/greys/install.sh|bash
  Tips:
  安装成功后,若出现“greys not found, please check your network” ,则需进行本地安装

2、本地安装方式

(1)下载最新版本的Greys

代码语言:javascript
复制
    [root@testserver ~]# wget http://ompc.oss.aliyuncs.com/greys/release/greys-stable-bin.zip

(2)解压zip文件后,执行以下命令,即可完成本地安装

代码语言:javascript
复制
    [root@testserver ~]# cd greys
    [root@testserver ~]# sh ./install-local.sh

3、 操作指南

代码语言:javascript
复制
 [root@testserver greys]# ./greys.sh 944————>“944 为 jvm的进程号”

如下,执行此命令后,显示greys相关信息:

代码语言:javascript
复制
  [root@testserver greys]# ./greys.sh 944
                                                            _                    
      ____  ____ _____ _   _  ___ _____ _____ ____  _____ _| |_ ___  ____  _   _ 
    / _  |/ ___) ___ | | | |/___|_____|____ |  _ \(____ (_   _) _ \|    \| | | |
    ( (_| | |   | ____| |_| |___ |     / ___ | | | / ___ | | || |_| | | | | |_| |
    \___ |_|   |_____)\__  (___/      \_____|_| |_\_____|  \__)___/|_|_|_|\__  |
    (_____|           (____/                                              (____/ 
                                              +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
                                              |v|e|r|s|i|o|n|:|1|.|7|.|6|.|6|
                                              +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
    ga?>
    ga?>

4、常用命令参考

代码语言:javascript
复制
ga?>help
+----------+----------------------------------------------------------------------------------+
|       sc | Search all the classes loaded by JVM                                             |
+----------+----------------------------------------------------------------------------------+
|       sm | Search the method of classes loaded by JVM                                       |
+----------+----------------------------------------------------------------------------------+
|  monitor | Monitor the execution of specified Class and its method                          |
+----------+----------------------------------------------------------------------------------+
|    watch | Display the details of specified class and method                                |
+----------+----------------------------------------------------------------------------------+
|       tt | Time Tunnel                                                                      |
+----------+----------------------------------------------------------------------------------+
|    stack | Display the stack trace of specified class and method                            |
+----------+----------------------------------------------------------------------------------+
|   ptrace | Display the detailed thread path stack of specified class and method             |
+----------+----------------------------------------------------------------------------------+
|       js | Enhanced JavaScript                                                              |
+----------+----------------------------------------------------------------------------------+
|    trace | Display the detailed thread stack of specified class and method                  |
+----------+----------------------------------------------------------------------------------+
|  session | Display current session information                                              |
+----------+----------------------------------------------------------------------------------+
|     quit | Quit Greys console                                                               |
+----------+----------------------------------------------------------------------------------+
|  version | Display Greys version                                                            |
+----------+----------------------------------------------------------------------------------+
|      jvm | Display the target JVM information                                               |
+----------+----------------------------------------------------------------------------------+
|    reset | Reset all the enhanced classes                                                   |
+----------+----------------------------------------------------------------------------------+
|      asm | Display class bytecode by asm format                                             |
+----------+----------------------------------------------------------------------------------+
| shutdown | Shut down Greys server and exit the console                                      |
+----------+----------------------------------------------------------------------------------+
|     help | Display Greys Help                                                               |
+----------+----------------------------------------------------------------------------------+
|      top | Display The Threads Of Top CPU TIME                                              |
+----------+----------------------------------------------------------------------------------+

5、具体参考示例

针对help命令行所显示的操作中,若进行相关操作,可通过执行“help arg”命令查询使用方式,例如:help stack/trace/ptrace/tt/monitor

代码语言:javascript
复制
ga?>help stack
+---------+----------------------------------------------------------------------------------+
|   USAGE | -[En:] class-pattern method-pattern condition-express                            |
|         | Display the stack trace of specified class and method                            |
+---------+----------------------------------------------------------------------------------+
| OPTIONS |              [E] | Enable regular expression to match (wildcard matching by def  |
|         |                  | ault)                                                         |
|         | -----------------+-------------------------------------------------------------- |
|         |             [n:] | Threshold of execution times                                  |
|         | -----------------+-------------------------------------------------------------- |
|         |    class-pattern | Path and classname of Pattern Matching                        |
|         | -----------------+-------------------------------------------------------------- |
|         |   method-pattern | Method of Pattern Matching                                    |
|         | -----------------+-------------------------------------------------------------- |
|         |  condition-expre | Conditional expression by OGNL                                |
|         |               ss |                                                               |
|         |                  | FOR EXAMPLE                                                   |
|         |                  |      TRUE : 1==1                                              |
|         |                  |      TRUE : true                                              |
|         |                  |     FALSE : false                                             |
|         |                  |      TRUE : params.length>=0                                  |
|         |                  |     FALSE : 1==2                                              |
|         |                  |                                                               |
|         |                  | THE STRUCTURE                                                 |
|         |                  |           target : the object                                 |
|         |                  |            clazz : the object's class                         |
|         |                  |           method : the constructor or method                  |
|         |                  |     params[0..n] : the parameters of method                   |
|         |                  |        returnObj : the returned object of method              |
|         |                  |         throwExp : the throw exception of method              |
|         |                  |         isReturn : the method ended by return                 |
|         |                  |          isThrow : the method ended by throwing exception     |
+---------+----------------------------------------------------------------------------------+
| EXAMPLE | stack -E org\.apache\.commons\.lang\.StringUtils isBlank                         |
|         | stack org.apache.commons.lang.StringUtils isBlank                                |
|         | stack *StringUtils isBlank                                                       |
|         | stack *StringUtils isBlank 'params[0].length==1'                                 |
|         | stack *StringUtils isBlank '#cost>100'                                           |
+---------+----------------------------------------------------------------------------------+

以Trace命令为例,使用 trace命令 跟踪指定类、方法的执行时间、参数、返回值情况,如下场景:(此处以官网给的参考为主)

场景:跟踪CookieDecoder类中 requestDecode()方法耗时超过500ms 的方法执行情况:

代码语言:javascript
复制
 ga?>trace  -n 2  com.netease.urs.CookieDecoder  requestDecode    '#cost>500'
 *************************************************************************************************************
 *   -n 2 :代表只打印2次就退出(防止刷屏,影响性能)                                                           
 *   com.netease.urs.CookieDecoder :监听的类名                                                               *
 *   requestDecode :监听的方法名                                                                              *
 *   ‘#cost>500’ : 打印条件为耗时超过 500ms                                                                  *
 *************************************************************************************************************    执行后,会显示:
代码语言:javascript
复制
ga?>trace  -n 2  com.netease.urs.CookieDecoder  requestDecode    '#cost>10'
Press Ctrl+D to abort.
Affect(class-cnt:1 , method-cnt:2) cost in 262 ms.

代表动态修改了一个类,对两个方法(例如方法重载)进行监控,修改花费262毫秒。 如果出现满足条件的情况,则我们会看到打印结果:

代码语言:javascript
复制
`---+Tracing for : thread_name="http-nio-8003-exec-8" thread_id=0x7a;is_daemon=true;priority=5;
`---+[5283,5283ms]com.netease.urs.CookieDecoder:requestDecode()
    +---[1,0ms]java.lang.System:nanoTime()
    +---[2,1ms]org.apache.http.client.methods.HttpPost:<init>(@39)
    +---[2,0ms]java.lang.StringBuffer:<init>(@41)
    +---[2,0ms]java.lang.StringBuffer:append(@42)
    +---[2,0ms]java.net.URLEncoder:encode(@43)
    +---[2,0ms]java.lang.StringBuffer:append(@43)
    +---[2,0ms]java.lang.StringBuffer:append(@44)
    +---[2,0ms]java.lang.StringBuffer:append(@45)
    +---[2,0ms]java.lang.StringBuffer:append(@46)
    +---[2,0ms]java.lang.StringBuffer:append(@47)
    +---[2,0ms]java.lang.StringBuffer:append(@48)
    +---[2,0ms]java.lang.Integer:<init>(@49)
    +---[2,0ms]java.lang.Integer:<init>(@49)
    +---[2,0ms]java.lang.reflect.Method:invoke(@49)
    +---[2,0ms]java.lang.StringBuffer:append(@49)
    +---[2,0ms]java.lang.StringBuffer:toString(@50)
    +---[2,0ms]org.apache.http.entity.StringEntity:<init>(@50)
    +---[2,0ms]org.apache.http.entity.StringEntity:setContentType(@51)
    +---[2,0ms]org.apache.http.client.methods.HttpPost:setEntity(@52)
    +---[2,0ms]org.apache.http.client.methods.HttpPost:getParams(@53)
    +---[2,0ms]org.apache.http.params.HttpParams:setIntParameter(@55)
    +---[2,0ms]org.apache.http.params.HttpParams:setIntParameter(@58)
    +---[5282,5280ms]com.netease.urs.http.CustomHttpComponent:execute(@60)
    +---[5283,0ms]org.apache.http.HttpResponse:getEntity(@61)
    +---[5283,0ms]org.apache.http.util.EntityUtils:toString(@62)
    +---[5283,0ms]com.netease.urs.util.LogUtil:debug(@63)
    +---[5283,0ms]org.apache.http.client.methods.HttpPost:releaseConnection(@71)
    +---[5283,0ms]java.lang.System:nanoTime(@64)
    `---[5283,0ms]com.netease.urs.CookieDecoder:$btrace$com$netease$fa$trace$UrsInterfaceCalls$2$requestDecode(@64)
   

可以看到,主要耗时在

+---[5282,5280ms]com.netease.urs.http.CustomHttpComponent:execute(@60)

退出前可以使用 reset 恢复增强类(即被动态修改的代码)。最后,使用shutdown 关闭greys 并退出即可。

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

本文分享自 架构驿站 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档