镇江建设银行网站,彩票网站的建设,wordpress 图片环绕,如何做网站帮别人赚钱一、arthas简述Arthas 是阿里开源的Java诊断工具。安装在系统所在服务器#xff0c;有着强大的能力#xff0c;是一个开发运维神器。主要功能在线热替换代码/代码增强全局视角的性能分析查看方法执行情况#xff0c;帮助跟踪偶现的bug支持JDK6二、官方资料官方文档的介绍非常…一、arthas简述Arthas 是阿里开源的Java诊断工具。安装在系统所在服务器有着强大的能力是一个开发运维神器。主要功能在线热替换代码/代码增强全局视角的性能分析查看方法执行情况帮助跟踪偶现的bug支持JDK6二、官方资料官方文档的介绍非常详尽https://arthas.aliyun.com/doc/使用官方的在线交互式教程来熟悉操作https://arthas.aliyun.com/doc/arthas-tutorials.html?languagecn三、idea安装插件arthas idea使用选择方法或者静态变量右键在弹出框中选择arthas command然后再选择对应的命令就会copy生成好对应的命令四、命令使用相关命令使用可以看官方文档下面只是简单说明下常用命令version查看当前Arthas版本 helparthas命令行帮助dashboard系统监控台信息classloader显示所有类加载信息sysprop打印所有的System Properties信息指定单个key
sysprop user.dir通过grep过滤
sysprop | grep user设置新的value
sysprop testKey testValuesysenv 命令可以获取到环境变量。和sysprop命令类似。jvm 打印出JVM的各种详细信息heapdump似jmap命令的heapdump功能 dump到临时文件
heapdumpdump到指定文件
heapdump ./dump.hprof只dump live对象
heapdump--live ./dump.hprofthread 查看线程相关信息查看所有线程信息
thread查看线程ID 2的栈
thread 2查看CPU使用率top n线程的栈
thread -n 3查看5秒内的CPU使用率top n线程栈
thread -n 3 -i 5000查找线程是否有阻塞
thread -bjad 反编译类反编译想要的类保存为文本文件
jad --source-only com.example.demo.arthas.user.UserController /tmp/UserController.javasm 命令则是查找类的具体函数sm -d java.math.RoundingModesc 查找jvm加载的类找到被修改类的classloader的哈希值
sc -d *UserController | grepclassLoaderHashmc 编译文件通过mcMemory Compiler来编译修改好的.java文件使用-c来指定classLoader使用-d指定输出目录
mc -c1be6f5ff /tmp/UserController.java -d /tmpredefine 热加载编译好的文件redefine/tmp/com/example/demo/arthas/user/UserController.classmonitor方法执行监控每5秒统计一次
monitor -c 5 class methodwatch方法执行数据观测如果是列表则会过滤列表中长度大于10的字符串
watch class method {params,returnObj,throwExp} params[0].length() 10 -x 1按条件过滤后展示指定属性
watch class method {params[0].{? #this.name.length() 5}.{age}} -n 1 -x 1找到第一个符合条件的数据用^
watch class method {params[0].{^ #this.name.length() 5}.{age}} -n 1 -x 1找到最后一个符合条件的数据用$
watch class method {params[0].{$ #this.name.length() 5}.{age}} -n 1 -x 1trace方法内部调用路径并输出方法路径上的每个节点上耗时追踪方法的内部调用
trace class method -n 5 --skipJDKMethod false 过滤大于200ms的调用链,只输出一次
trace class method #cost200 -n 1stack输出当前方法被调用的调用路径tt方法执行数据的时空隧道记录下指定方法每次调用的入参和返回信息并能对这些不同的时间下调用进行观测使用tt命令从调用记录里获取到spring context
tt -i 1000 -w target.getApplicationContext()获取spring bean并调用函数
tt -i 1000 -w ‘target.getApplicationContext().getBean(“helloWorldService”).getHelloMessage()’ognl动态执行代码调用static函数
ognl java.lang.Systemout.println(hello ognl)获取静态类的静态字段获取UserController类里的logger字段
ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader com.example.demo.arthas.user.UserControllerlogger通过-x参数控制返回值的展开层数。比如
ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader -x 2 com.example.demo.arthas.user.UserControllerlogger执行多行表达式赋值给临时变量返回一个List
ognl #value1SystemgetProperty(java.home), #value2SystemgetProperty(java.runtime.name), {#value1, #value2}单独设置UserController的logger level
ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader com.example.demo.arthas.user.UserControllerlogger.setLevel(ch.qos.logback.classic.LevelDEBUG)修改logback的全局logger level
ognl --classLoaderClass org.springframework.boot.loader.LaunchedURLClassLoader org.slf4j.LoggerFactorygetLogger(root).setLevel(ch.qos.logback.classic.LevelDEBUG)OGNL特殊用法请参考https://github.com/alibaba/arthas/issues/71OGNL表达式官方指南https://commons.apache.org/proper/commons-ognl/language-guide.html五、例子排查HTTP请求返回401401通常是被权限管理的Filter拦截了那么到底是哪个Filter处理了这个请求返回了401跟踪所有的Filter函数trace javax.servlet.Filter *可以在调用树的最深层找到AdminFilterConfig$AdminFilter返回了401通过stack获取调用栈上面是通过trace命令来获取信息从结果里我们可以知道通过stack跟踪HttpServletResponse:sendError()同样可以知道是哪个Filter返回了401stack javax.servlet.http.HttpServletResponse sendError params[0]401