arthas具体有啥作用呢?以下是摘抄自官方的一段话:
当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:
1、这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
2、我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
3、遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
4、线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
5、是否有一个全局视角来查看系统的运行状况?
6、有什么办法可以监控到JVM的实时运行状态?
先放上官方链接:https://alibaba.github.io/arthas/
安装教程、命令教程在上面都有很详细的说明了。所以这篇文章并不是对它的详细解释和教程,只是聊一下个人常用的命令和理解。
从上面六个问题开始:
1、这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
命令:sc -d className
解释:sc用来查看已经加载到JVM 中的Class信息,-d输出当前类的详细信息,包括这个类所加载的原始文件来源、类的声明、加载的ClassLoader等详细信息。
示例:
从这里可以看到类的全名、源文件路径、访问权限、对应类加载器等(如果一个类被多个ClassLoader所加载,则会出现多次)。
还有其他作用的参数,详见官方文档~
2、我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
命令:jad --source-only className
解释:jad 命令将JVM中实际运行的class的byte code反编译成 java 代码,–source-only只显示源代码。
示例:
用jad反编译命令,就可以查看存在于方法区中的Class内容,能够知晓这是不是你预期中的Class。
3、遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
4、线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
命令:
1、jad --source-only demo.MathGame > /opt/arthas/MathGame.java
2、mc MathGame.java -d /opt/arthas/
3、redefine /opt/arthas/demo/MathGame.class
解释:jad用来反编译Class得到java源文件,修改完java源文件(埋点日志或者fix error了)用mc来将java源文件编译成class文件。最后用redefine重定义JVM方法区中对应的Class。这里重点在于redefine,它用来加载外部的.class文件,redefine jvm已加载的类,即热更新。(不得不说这个功能太过强大了,所以还是得慎用)
示例:
大概是因为import了别的自定义的Class的缘故,如果你mc编译不通过的话。建议直接在IDE中生产class文件上传到服务器来redefine。
不过redine使用的时候也有几点需要注意:
1、如果虚拟机中该类还未被初始化过,报错:
These classes are not found in the JVM and may not be loaded
2、如果redefine指定class中新增了方法,报错:
redefine error! java.lang.UnsupportedOperationException: class redefinition failed: attempted to add a method
3、如果redefine指定class中新增了字段或修改了字段的访问权限,报错:
redefine error! java.lang.UnsupportedOperationException: class redefinition failed: attempted to change the schema (add/remove fields)
4、因为一个Class可以被多个classloader加载,所以你要确认redefine的Class是否是你相要的那个。
5、正在跑的函数,没有退出不能生效。
另外说一点,arthas还支持了tab键的自动补全,为这么贴心的作者点赞!所以当你记不全命令或目录的时候不妨tab一下~
5、是否有一个全局视角来查看系统的运行状况?
命令:dashboard
解释:dashboard中文释义仪表盘的意思。用一个全局的视角查看系统运行状况,显示当前系统的实时数据。分三层展示线程、内存、系统运行状况、
示例:
这里也可以加个-i参数,用来指定刷新的频率。
6、有什么办法可以监控到JVM的实时运行状态?
命令:jvm
解释:jvm这个命令可查看当前jvm的信息。具体包含JVM运行时环境、Class加载统计、编译器、垃圾回收器、内存管理、内存使用、系统环境、线程统计、文件描述符等状况。(不过暂时还没怎么用到这个指令)
示例:
当前arthas肯定不止这么几个命令的,想要查看完整命令还是建议移步到官网链接,自己下载安装并实践一波,切身感受一下它的强大。当能够熟练使用之后,以后在线上总览服务器、jvm状况,查找问题也能多一种强力的方法。