可以做go分析的网站,太原做网站多少钱,淄博公司网站建设价格,网站源码破解#x1f680; 优质资源分享 #x1f680;
学习路线指引#xff08;点击解锁#xff09;知识定位人群定位#x1f9e1; Python实战微信订餐小程序 #x1f9e1;进阶级本课程是python flask微信小程序的完美结合#xff0c;从项目搭建到腾讯云部署上线#xff0c;打造一… 优质资源分享
学习路线指引点击解锁知识定位人群定位 Python实战微信订餐小程序 进阶级本课程是python flask微信小程序的完美结合从项目搭建到腾讯云部署上线打造一个全栈订餐系统。Python量化交易实战入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
Arthas 是阿里开源的 Java 诊断工具。在线排查问题无需重启动态跟踪 Java 代码实时监控 JVM 状态。Arthas 支持 JDK 6支持 Linux/Mac/Windows采用命令行交互模式同时提供丰富的 Tab 自动补全功能进一步方便进行问题的定位和诊断。
Arthas可以通过简单的命令交互模式接入运行的JVM快速定位和诊断线上程序运行的问题。在不重启服务的情况下实时动态的修改相关代码并实时生效具体工作原理如下
连接JVM通过attach机制通过attach pid连接正在运行的JVM查看及修改JVM字节码通过instrument技术对运行中的JVM附加或修改字节码来实现增强的逻辑
Arthas的执行过程如下Arthas底层调用rt.jar包的ManagementFactory获取整个JVM内部信息通过命令集成与后端交互执行返回结果整个工程简单清晰容易上手。
arthas-demo入门
可以使用阿里云给的基础教程地址练习: https://arthas.aliyun.com/doc/arthas-tutorials.html?languagecnidarthas-basics
在这里,我使用自己的服务器,跟着基础教程做入门联系。
1.下载math-game.jar,再用java -jar命令启动
[rootlocalhost arthas]# wget https://arthas.aliyun.com/math-game.jar
[rootlocalhost arthas]# java -jar arthas-boot.jar
2.新开Terminal 下载arthas-boot.jar再用java -jar命令启动
[rootlocalhost arthas]# wget https://arthas.aliyun.com/arthas-boot.jar
[rootlocalhost arthas]# java -jar arthas-boot.jar
arthas-boot是Arthas的启动程序它启动后会列出所有的Java进程用户可以选择需要诊断的目标进程。
选择第一个进程输入 1 (math-game这个程序对应的就是1)再Enter/回车
Attach成功之后会打印Arthas LOGO。输入 help 可以获取到更多的帮助信息。 3. dashboard 命令可以查看当前系统的实时数据面板 数据说明:
IDjava级别的线程ID注意这个ID不能跟jstack中的nativeID一一对应NAME线程名GROUP线程组名PRIORI线程的优先级1~10之间的数字越大表示优先级越高STATE线程的状态%CPU线程的CPU使用率比如采样间隔1000ms某个线程的增量cpu时间为100ms则cpu的使用率为100/100010%DELTA_TIME上次采样之后线程运行增量cpu时间数据格式为秒TIME线程运行总CPU时间数据格式为 分:秒INTERRUPTED线程当前的中断位状态DAEMON是否是daemon后台线程
4. thread 命令会打印线程ID 1的栈 还可以通过thread 1 | grep main( 命令来查找main class: 参数说明
参数名称参数说明id线程id[ n: ]指定最忙的前N个线程并打印堆栈[ b ]找出当前阻塞其他线程的线程目前只支持找出synchronized关键字阻塞住的线程 如果是java.util.concurrent.Lock 目前还不支持。[ i ]指定cpu占比统计的采样间隔单位为毫秒[ --all ]显示所有匹配的线程[ --state ]查看指定状态的线程,如: thread --state WAITING
5. sc命令来查找JVM里已加载的类
sc为“Search-Class” 的简写能搜索出所有已经加载到 JVM 中的 Class 信息。 参数说明
参数名称参数说明class-pattern类名表达式匹配支持全限定名。如demo.MathGame也支持demo/MathGamemethod-pattern方法名表达式匹配[ d ]输出当前类的详细信息包括这个类所加载的原始文件来源类的声明加载的ClassLoader等详细信息如果一个类被多个ClassLoader所加载则会出现多次[ E ]开启正则表达式匹配默认为通配符匹配[ f ]输出当前类的成员变量信息需要配合参数 -d一起使用[ x: ]指定输出静态变量时属性的遍历深度默认为0直接使用toString输出[ c: ]指定class的ClassLoader的hashcode[ classLoaderClass: ]指定执行表达式的ClassLoader的class name[ n: ]具有详细信息的匹配类的最大数量默认为100
sm为“Search-Method” 的简写查询某个类下所有的方法与sc的功能类似这里就不详细介绍了。
6. jad命令来反编译代码 还可以反编译指定的函数 反编译时只显示源代码
默认情况下反编译结果里会带有ClassLoader信息通过--source-only选项可以只打印源代码。这样就会清爽很多。 7. watch方法执行数据观测
watch命令可以查看函数的参数/返回值/异常信息通过编写 OGNL 表达式进行对应变量的查看。
从上面的结果里说明函数被执行了两次第一次结果是 locationAtExceptionExit说明函数抛出了异常因此returnObj是null第二次结果是locationAtExit说明函数正常返回因此可以看到returnObj的结果是一个ArrayList。
参数说明
参数名称参数说明class-pattern类名表达式匹配method-pattern方法名表达式匹配express观察表达式默认值为{params,target,returnObj}单个值可以不用加 {}多个值需要加condition-express条件表达式不能加 {}可以使用逗号分隔子表达式取表达式最后一个值来判断[ b ]在方法调用之前观察默认关闭由于观察事件点是在方法调用前此时返回值或异常均不存在params代表方法入参[ e ]在方法异常之后观察默认关闭,params代表方法出参[ s ]在方法返回之后观察默认关闭,params代表方法出参[ f ]在方法结束之后正常返回和异常返回观察默认打开,params代表方法出参[ E ]开启正则表达式匹配默认为通配符匹配[ x: ]指定输出结果的属性遍历深度默认为1[ #cost ]监控耗时
条件表达式的例子
下面这个例子表示只有参数小于0的调用才会响应。 异常信息的例子:
-e 表示抛出异常时才触发
express中表示异常信息的变量时throwExp 8. vmtool命令可以搜索内存对象
vmtool 利用JVMTI接口实现查询内存对象强制GC等功能。 参数说明
参数名称参数说明–action getInstances返回结果绑定到 instances变量上它是数组。–className指定类名完成路径支持 java.lang.String,也支持java/lang/String[ --limit ]限制返回值数量避免获取超大数据时对JVM造成压力。默认值是10。[ -x ]指定返回结果展开层数,默认为1[ c: ]指定class的ClassLoader的hashcode通过sc命令找到加载class的classLoader[ classLoaderClass: ]指定执行表达式的ClassLoader的class name强制GC的命令vmtool --action forceGc
9. 退出Arthas
用 exit 或者 quit 命令可以退出Arthas。退出Arthas之后还可以再次用 java -jar arthas-boot.jar 来连接。
10. 彻底退出Arthas
exit/quit命令只是退出当前sessionarthas server还在目标进程中运行。
想完全退出Arthas可以执行 stop 命令。
Arthas的其他重点使用功能
1. mc 内存编译器Memory Compiler/内存编译器
Memory Compiler/内存编译器编译.java文件生成.class。通过 -c / --classLoaderClass 参数指定classLoader-d 参数指定输出目录编译生成.class文件之后可以结合retransform 命令实现热更新代码。retransform的限制1.不允许新增加field和method 2.正在跑的函数没有退出不能生效
这里还是使用arthas的提供的教程https://arthas.aliyun.com/doc/arthas-tutorials.html?languagecnidcommand-mc-retransform
1.由于正在跑的函数没有退出时不生效的所以上面的math-game的demo就不能使用了所以得下载另一个demo一个简单的spring-boot应用。
[rootlocalhost arthas]# wget https://raw.githubusercontent.com/hengyunabc/spring-boot-inside/master/demo-arthas-spring-boot/demo-arthas-spring-boot.jar
[rootlocalhost arthas]# java -jar demo-arthas-spring-boot.jar
2.新开一个Terminal;访问下面这个路径可以看到报错500异常了。 3.启动arthas-boot应用。
4.反编译代码可以看到当id小于1是就会抛出异常。 在这里我们修改文件想让id小于1时还是能正常返回不抛出异常。
5.jad反编译UserController将结果保存在/tmp/UserController.java文件夹里。
[arthas1645]$ jad --source-only com.example.demo.arthas.user.UserController /tmp/UserController.java
6.通过vim /tmp/UserController.java编辑java类。 7.通过sc查找加载UserContoller的ClassLoader也可以在jad时显示源码里面也有classLoader的信息。
以下三个命令任意一个都可以。可以看到这个java类是由LaunchedURLClassLoader1be6f5c3 这个类加载器加载的。 8.通过mc命令编译同时指定--classLoaderClass参数指定ClassLoader
[arthas1645]$ mc --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader /tmp/UserController.java -d /tmp
也可以通过-c 参数指定ClassLoaderHash
[arthas1645]$ mc --c 1be6f5c3 /tmp/UserController.java -d /tmp
可以看到在tmp文件夹下根据UserController的类的全路径编译了一个class文件 9.retransform 命令中西加载新编译好的UserContoller.class类 10.重新编译文件可以看到代码已经替换成最新的了 11.访问 显示已经替换过的类retransform -l 恢复修改前的代码清楚指定的类retransform -d 1
清楚所有的retransform --deleteAll
2.trace 方法内部调用路径并输出方法路径上的每个节点上耗时
可以观察方法执行的时候哪个子调用比较慢
[arthas1645]$ trace ClassName methodName
trace 命令能主动搜索 class-patternmethod-pattern 对应的方法调用路径渲染和统计整个调用链路上的所有性能开销和追踪调用链路。在进行性能调优的时候十分有效。
参数说明
参数名称参数说明class-pattern类名表达式匹配method-pattern方法名表达式匹配express观察表达式默认值为{params,target,returnObj}单个值可以不用加 {}多个值需要加condition-express条件表达式[ E ]开启正则表达式匹配默认为通配符匹配[ n: ]命令执行次数[ #cost ]方法执行耗时[ --skipJDKMethod ]跳过jdk方法默认为true不跳过JDK方法 只展示耗时大于1ms的调用路径 动态trace
从上图中可以看到primeFactors的方法耗时最长如果想深入primeFactors方法可以打开一个新的终端使用telnet localhost 3658 连接上arthas在trace primeFactors时指定listenerId。 这时终端2打印的结果说明已经增强了一个函数Affect(class count: 1 , method count: 1)但不再打印更多的结果。
再查看终端1可以发现trace的结果增加了一层打印了primeFactors函数里的内容
注意 --listenerId指定的id在前一条命令的输出中可以看到。 3.stack 查看某个函数的调用堆栈路径
很多时候在一个方法被执行时方法的执行路径非常多或者根本就不着调这个方法时从哪里被执行的就可以使用stack命令。此命令和trace命令结构类似。
[arthas1645]$ stack demo.MathGame primeFactors
参数说明
参数名称参数说明class-pattern类名表达式匹配method-pattern方法名表达式匹配express观察表达式默认值为{params,target,returnObj}单个值可以不用加 {}多个值需要加condition-express条件表达式[ E ]开启正则表达式匹配默认为通配符匹配[ n: ]命令执行次数4.tt 命令
tt是TimeTunnel 的缩写tt命令记录方法执行数据的时空隧道记录下指定方法每次调用的入参和返回信息并能对这些不同的时间下调用进行观测。
watch 虽然很方便和灵活但需要提前想清楚观察表达式的拼写这对排查问题而言要求太高因为很多时候我们并不清楚问题出自于何方只能靠蛛丝马迹进行猜测。
这个时候如果能记录下当时方法调用的所有入参和返回值、抛出的异常会对整个问题的思考与判断非常有帮助。
参数说明
参数名称参数说明-t记录下类对应的方法的每次执行情况class-pattern类名表达式匹配method-pattern方法名表达式匹配[ n: ]命令执行次数condition-express条件表达式表格字段说明
表格字段字段解释index时间片段记录编号每一个编号代表着一次调用后续tt还有很多命令都是基于此编号指定记录操作非常重要。timestamp方法执行的本机时间记录了这个时间片段所发生的本机时间cost(ms)方法执行的耗时is-ret方法是否以正常返回的形式结束is-exp方法是否以抛异常的形式结束object执行对象的hashCode()注意曾经有人误认为是对象在JVM中的内存地址但很遗憾他不是。但他能帮助你简单的标记当前执行方法的类实体class执行的类名method执行的方法名
检索调用记录
tt -l 检索所有的调用记录 筛选出 primeFactors 方法的调用信息 通过 -i 参数后边跟着对应的 INDEX 编号查看到他的详细信息 重做一次调用
tt 命令由于保存了当时调用的所有现场信息所以我们可以自己主动对一个 INDEX 编号的时间片自主发起一次调用。此时需要使用 -p 参数。通过 --replay-times 指定 调用次数通过 --replay-interval 指定多次调用间隔(单位ms, 默认1000ms) 需要强调的点
ThreadLocal 信息丢失
很多框架偷偷的将一些环境变量信息塞到了发起调用线程的 ThreadLocal 中由于调用线程发生了变化这些 ThreadLocal 线程信息无法通过 Arthas 保存所以这些信息将会丢失。 2. 引用的对象
需要强调的是tt 命令是将当前环境的对象引用保存起来但仅仅也只能保存一个引用而已。如果方法内部对入参进行了变更或者返回的对象经过了后续的处理那么在 tt 查看的时候将无法看到当时最准确的值。这也是为什么 watch 命令存在的意义。
5.monitor 方法执行监控
对匹配的class-pattern / method-pattern的类、方法的调用进行监控。monitor命令是一个非实时返回的命令并不是输入之后立即返回而是不断的等待目标java进程返回信息。 参数说明
参数名称参数说明class-pattern类名表达式匹配method-pattern方法名表达式匹配[ E ]开启正则表达式匹配默认为通配符匹配[ c: ]统计周期默认值为120秒是一个整型的参数值
监控项说明
监控项timestampclassmethodtotalsuccesstailrtfail-rate说明时间戳java类方法调用次数成功次数失败次数平均rt失败率
5.target-ip
target-ip 为指定绑定的IP,如果不指定IP,Arthas只listen 127.0.0.1所以如果想从远程连接则可以使用 --target-ip参数指定listen的IP。
java -jar arthas-boot.jar --target-ip IP
绑定远程访问IP后可以在通过telnet 或者http的方式远程连接Arthas进行问题排查
还有更多的功能请查看arthas的官方文档。