首页> 标签> Arthas
"Arthas"
共 436 条结果
全部 问答 文章 公开课 课程 电子书 技术圈 体验
MaxCompute Arthas有哪些应用场景?
MaxCompute Arthas有哪些应用场景?
问答
Arthas  ·  分布式计算  ·  测试技术  ·  MaxCompute
2023-03-22
JVM学习.05 JVM常见的排障和调优
1、前言前面介绍了JVM相关的内存和线程相关的技术。对于JVM也算有了一个比较系统、完整的理论基础。理论总是作为指导实践的工具,但是从理论到实践,总会遇到一些虚拟机相关问题,故障。所以还需要学习一些常用的JVM排障工具,和一些常见的调优手段。2、故障排查常用工具2.1、命令行工具2.1.1、jpsJVM Process Status Tool(jps)虚拟机进程状态工具。顾名思义主要用来查看虚拟机进程,并显示虚拟机执行主类名称和这些进程的状态等。同Linux的PS指令类似。jps命令格式为:jps [option] [hostid]示例:参数:选项作用-q只输出LVMID(进程的本地虚拟机唯一ID),省略主类名称-m输出虚拟机进程启动时传递给main()的参数-l输出主类的全限定名,如果进程执行的式jar包,则输出jar的路径-v输出虚拟机进程启动的JVM参数2.1.2、jstatJVM Statistics Monitoring Tool(jstat),虚拟机统计信息监控工具。用于监视虚拟机各种运行状态信息。可以显示虚拟机进程的类加载、内存、垃圾收集、即时编译等运行时数据。jstat命令格式为:jstat [option vmid [interval [s|ms] [count] ] ]示例:S0,S1:代表Survivor0、Survivor1区E:表示Eden区O:表示老年代M:表示永久代(元空间)CCS:表示压缩类空间YGC:表示Young GCYGCT:表示Young GC Time,耗时FGC:表示Full GCFGCT:表示Full GC Time,耗时CGC:表示并发GC次数CGCT:表示并发GC耗时GCT:表示GCV Time,GC总耗时/** * -gcutil 查看gc情况 * 7864 为进程pid * 500 每间隔500ms执行一次 * 10 总共执行10次 * 所以下面的命令为:每间隔500ms,查询一次进程id为7864的gc情况,一共查询10次 */ jstat -gcutil 7864 500 10参数(参数选项比较多,列举一些常用的,其他的自行查找):选项作用-class监视类加载信息、卸载数量、总空间以及类加载的耗时-gc监视Java堆情况-gccause功能同-gcutil,但是会额外输出导致上一次gc产生的原因-gcutil功能同-gc相同,但输出主要关注的已使用空间占总空间的百分比-compiler输出即使编译过的方法,耗时等2.1.3、jmapMemory Map for Java(jmap),用于生成JVM某一时刻运行的堆快照,即heapdump或dump文件。除了转储外,还可以查看当前的堆和方法区的详细信息等。除了使用jmap,可以指定-XX:+HeapDumpOnOutOfMemoryError参数,可以让虚拟机出现内存溢出后自动生成dump文件。注意:请尽可能不要在生产环境中使用jmap -dump来转储整个内存的dump文件。因为在dump过程中,会暂停所有执行线程的业务逻辑。会直接暂停线上业务的响应。jmap命令格式为:jmap [option ] vmid示例:参数:选项作用-dump生成Java堆快照。格式为:jmap -dump:format=b,file=F://heap001.hprof {PID}jmap -dump:live,format=b,file=F://heap001.hprof {PID} // live说明只dump出存活的对象-heap监视Java堆情况。只在Linux平台下有效-histo显示队中对象统计信息,包括类,实力数量,合计容量-gcutil功能同-gc相同,但输出主要关注的已使用空间占总空间的百分比-F当虚拟机进程堆-dump选项无响应时,可使用这个选项强制生成dump快照。只在Linux平台下有效2.1.4、jhatJVM Heap Analysis Tool(jhat),虚拟机堆快照分析工具。一般与jmap搭配使用。用来分析jmap生成的对快照。内置了一个微型的http/web服务器,分析结果可以通过浏览器访问既定的端口进行查看。但是个人建议可以使用第三方工具进行分析,如常用的MAT,jProfile等。jhat命令格式为:jhat -port 8080 d://xxx.hprof接着访问http://localhost:8080即可。如果不指定-port 默认为7000。示例:2.1.5、jstackStack Trace for Java(jstack),堆栈跟踪工具。用于生成JVM当前时刻的线程快照,一般为threaddump或javacore文件。线程快照就是当前JVM内每一条线程正在执行的方法堆栈的集合,一般生成快照用于定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致长时间挂起等原因。jstack命令格式为:jstack [option] vmid示例:参数:选项作用-F当正常输出的请求不被响应时,强制输出线程堆栈-l出堆栈外,显示关于锁的附加信息-m如果调用到本地方法的话,可以显示c/c++的堆栈2.2、可视化工具2.2.1、jConsoleJava Monitoring and Management Console(jConsole),Java监视与管理控制台。是一个基于JMX的可视化监控,管理工具。其中一项我常用的功能是通过JMX的MBean堆系统进行信息收集和参数动态调整。如一次线上的最大可用线程过载,就是通过MBean中临时调整参数恢复业务的。2.2.2、jvisualvmAll-in-One Java Troubleshooting Tool(VisualVM),我认为是JDK自带的监控和故障处理能力最强大的程序之一。也是我们平时使用最经常的JVM排障工具。它不仅包含了常规的运行监控,故障处理外,还提供了比如性能分析等额外功能。另外jvisualvm还支持安装插件,可以通过插件平台扩展该工具的功能。jvisualvm除了可以监视本地进程外,还可以通过JMX远程连接。java启动程序的时候,可以通过启动参数配置JMX相关信息即可。在工具菜单栏选择插件,可以自由安装想要的插件:2.3、第三方工具2.3.1、jProfileJProfiler是一个商业授权的Java剖析工具,由EJ技术有限公司,针对的Java EE和Java SE应用程序开发的。它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合用途。JProfiler的是一个独立的应用程序,但其提供Eclipse和IntelliJ等IDE的插件。它允许两个内存剖面评估内存使用情况和动态分配泄漏和CPU剖析,以评估线程冲突。----来自百度百科2.3.2、MATEclipse Memory Analyzer (MAT)是一个快速且功能丰富的Java堆分析器,可帮助您发现内存泄漏并减少内存消耗。----来自百度百科2.3.3、arthasarthas,阿里开源的Java实时性能监控和问题排查工具。强烈推荐。具体使用方式可以参照我另一篇博客《java线上项目排查,Arthas简单上手》。3、常用的调优策略3.1、 编码阶段的预防良好的编码习惯可以减少一些常见的问题,也能使程序的性能提高。以下例举常见的几个编码阶段问题:3.1.1、避免短命大对象如byte[]。JVM中,大对象需要大量连续的内存空间,如很长的字符串或者元素数量很庞大的数组。jvm在分配空间时,有时候需要提前进行GC,以获取足够的空间分配。可以通过-XX:PretenureSizeThreshold指定大于该值的对象直接分配在老年代。3.1.2、变量作用域尽可能控制变量的作用域范围,尽可能不要定义全局变量。3.1.3、String操作String操作,尽可能使用Stringbuffer或者Stringbuilder,尽量减少字符串的+拼接。3.1.4、锁操作注意锁的粒度和范围。尽可能精确缩小锁的粒度。能不用锁就不用锁,能锁区块就不要锁整个方法体,能用对象锁,就不要用类锁。3.2、部署阶段的预防3.2.1、选用合适的硬件和软件设施很多性能问题,大部分可以通过氪金的方式解决。如果通过氪金的方式解决,效率是最高的(当然要看实际情况)。这里指的选用合适版本并不是氪金,选用配置越高越好,主要指的是做好程序的规划,业务体量,以及良好的程序设计和部署用例。做好CPU密集型和IO密集型的业务处理,如果IO密集型的,就选用IOPS高的磁盘等等。3.2.2、压力测试程序编码完成后,做一些压力测试。一个好的程序不仅要满足功能需求,更需要满足非功能性需求。压力测试正式验证这些非功能性需求是否负责指标的一个有力手段。宁愿问题在测试阶段发生,也尽量避免在生产阶段发生。3.3、常用的JVM参数配置-Xms512M 设置Heap 空间最小值-Xmx512M 设置Heap 空间最大值-Xmn200M 设置Young区大小-Xss 256K 设置线程栈大小-XX:MaxGCPauseMillis=500 垃圾回收器最大的停顿时间-XX:+UseG1GC 指定G1垃圾回收器(具体使用哪个垃圾回收期可以视程序要求而定)-XX:NewRatio 新老生代的比值-XX:+HeapDumpOnOutOfMemoryError 启动堆内存溢出打印-XX:HeapDumpPath=heap.hprof 指定Heap快照打印位置-XX:MinHeapFreeRatio jvm heap 在使用率小于n时,heap进行收缩-XX:MaxHeapFreeRatio jvm heap 在使用率大于n时,heap进行扩张3.4、问题排查和分析3.4.1、CPU过载CPU过高,可以通过top命令排查各个进程的资源占用情况。结合-Hp参数找到CPU过多的线程。如果一台服务器部署应用过多,出现CPU争用情况,可以自主分配具体CPU核心,错开CPU核心使用。具体参照我另一篇博客《windows系统启动java程序限制cpu核心数》。3.4.2、线程死锁可以使用jstack或者jvisualvm或arthas分析当前锁的情况进行排查。3.4.3、OOM出现OOM,先要观察报错类型。java.lang.OutOfMemoryError: java heap spaceheap溢出.检查是否存在内存泄漏问题. 分析堆栈对象情况java.lang.OutOfMemoryError: Meta space可通过JVM类加载的情况进行排查.jstat或者实时监测工具排查..java.lang.OutOfMemoryError:GC over head limit exceeded系统处于高频的GC状态,而且回收的效果依然不佳的情况分析GC日志曲线集合堆栈分析排查.关于OOM问题,个人经验在启动参数中加入-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof 指定溢出时候的dump文件生成目录,一旦生产出现OOM问题,需要紧急恢复情况下,大多数会采用重启的方案(前提是单机应用,且业务需要紧急恢复的情况,而且重启能解决99%的问题,如果不行,那就重启2次)。一旦重启后,内存镜像丢失就不利于接下来的问题分析和定位。所以配置完参数后,出现oom问题,系统自动帮我们dump当下的内存文件,我们就可以放心大胆重启了。然后再逐步分析hprof文件。......应该还有很多,这就不一一例举了,目前仅能想到这么多。4、小结前面几篇分别介绍了JVM的一些结构体系。对于Java程序员来说,不管是项目中,还是面试,经常会遇到关于JVM相关的问题。同时通过对JVM的深入学习,能够更加从容应对JVM底层相关的一些问题以及解决措施。
文章
Arthas  ·  运维  ·  监控  ·  IDE  ·  数据可视化  ·  Java  ·  测试技术  ·  Linux  ·  开发工具  ·  Android开发
2023-03-26
60-微服务技术栈(高级):在线检测工具Arthas(实现CPU排查与代码热更新)
1.前言背景线上代码经常会出现CPU占用过高的情况,按以往经验我会使用top指令,进一步借助于jstack去查看具体信息从而进行问题排查,但基本上都逃不过需要重新发包的局面,即使是一个增量包,应用也需要短暂停启。后来运维大兄弟让我试一下Arthas,说是可以进行代码的热更新操作,正好来试一下。关于Arthas的安装与基础使用可以参考我这两篇:Arthas安装与监听SpringBoot应用Arthas基础指令使用说明环境JDK1.8 SPringBoot 2.2.2Arthas Linux 测试代码:@RequestMapping(value = "/bigThread")@ResponseBodypublic String bigThread(int id) {    ArthasService.test();    while (true) {        Thread t2 = new Thread();        t2.start();        id ++;        if(100000 == id) {            return String.valueOf(id);        }    }}思路2.thread -b 查看是否有阻塞线程thread -b, 找出当前阻塞其他线程的线程,执行完之后并未发现,说明该线程并非一直阻塞,一直执行的3.thread 查看占用最高的线程    当thread之后不跟参数时,显示当前全部线程信息,我觉得 thread -n 10,展示前10应该就够用,可根据实际需要自己决定。下图可以很直观的看出,我们的应用瞬间占用了77%的CPU(这里我是发起请求瞬间,通过thread查看的,所以比较直观,生产环境应该只有阻塞,死锁这种状态才会比较直观)4.thread id 查看具体信息在上一步基础上,我们进一步查看,thread 15(因为上面的ID=15)他的大致意思就是:线程在等待一个条件从而继续执行,可以看到方法是在执行LinkedBlockingQueue.take方法时候,查看这个方法的API提示如下:public E take() throws InterruptedException {    E x;    int c = -1;    final AtomicInteger count = this.count;    final ReentrantLock takeLock = this.takeLock;    takeLock.lockInterruptibly();    try {        while (count.get() == 0) {            notEmpty.await();        }        x = dequeue();        c = count.getAndDecrement();        if (c > 1)            notEmpty.signal();    } finally {        takeLock.unlock();    }    if (c == capacity)        signalNotFull();    return x;}其中:AtomicInteger是保证高并发情况下的原子性,ReentrantLock标识可重入锁,都是JUC包下需要了解的这里不赘述,需要的百度了解下。这段代码关键点就在于:notEmpty.await(),从队列中消费数据,当队列为空是,线程阻塞,所以我们大致知道现在出现的问题是线程阻塞,但是还是不知道具体哪行代码的问题。如果能够明确知道这次更改了哪些代码,可以直接执行步骤6,不知道的话可以通过步骤5来定位问题。5.watch 查看哪个Controller执行了代码watch org.springframework.web.servlet.DispatcherServlet getHandler returnObj这个脚本可以检测一切通过DispatcherServlet匹配Handler的方法,也就是进入Controller的请求,如下:找到了对应的代码之后,我们来进一步观察异常信息,这里可能会有一个问题:就是我明明能通过日志去查看错误信息,为什么还需要这么繁琐的去操作。我的业务场景是:日志还是非常大的,刚捞到就被刷过去了,这时候定位日志不是很好操作,当然想捞下来日志肯定也是可以的,也很直观,我一般也都是去查看日志进行问题定位,这里也是提供一个思路。6.watch 该方法异常信息watch 类全路径 方法名 "{params[0],throwExp}" -e -x 2如上,错误很直观的提示了出来,下面就可以修复解决了,这里我们也可以通过trace指令,查看执行时长:trace 类全路径 方法名 "{params[0],throwExp}" -e -x 2返回信息如下,也可以看到错误信息,和每个方法执行的时长[arthas@10999]$ trace com.arthas.controller.OrderController bigThreadPress Q or Ctrl+C to abort.Affect(class count: 1 , method count: 1) cost in 53 ms, listenerId: 10`---ts=2020-08-19 14:45:57;thread_name=http-nio-0.0.0.0-8080-exec-10;id=16;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1f1c7bf6    `---[1452.684406ms] com.arthas.controller.OrderController:bigThread() [throws Exception]        +---[0.168814ms] com.arthas.service.ArthasService:test() #20        `---throw:java.lang.OutOfMemoryError #-2 [unable to create new native thread]7.jad 反编译热更新在上面知道问题之后,我们就来定位问题就好了,命令:jad 类全路径 方法名[arthas@13190]$ jad com.arthas.controller.OrderControllerClassLoader:                                                                                                                                                                                +-org.springframework.boot.loader.LaunchedURLClassLoader@17f052a3                                                                                                                             +-sun.misc.Launcher$AppClassLoader@3d4eac69                                                                                                                                                   +-sun.misc.Launcher$ExtClassLoader@45f45fa1                                                                                                                                             Location:                                                                                                                                                                                   file:/opt/software/arthas/Arthas.jar!/BOOT-INF/classes!/                                                                                                                                    /* * Decompiled with CFR. *  * Could not load the following classes: *  com.arthas.service.ArthasService *  org.springframework.stereotype.Controller *  org.springframework.web.bind.annotation.RequestMapping *  org.springframework.web.bind.annotation.ResponseBody */package com.arthas.controller;import com.arthas.service.ArthasService;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;@Controllerpublic class OrderController {    @RequestMapping(value={"/bigThread"})    @ResponseBody    public String bigThread(int id) {        ArthasService.test();        do {            Thread t2 = new Thread();            t2.start();        } while (100000 != ++id);        return String.valueOf(id);    }}Affect(row-cnt:1) cost in 1513 ms.此时代码就被反编译了,为了能够更改,所以我们需要输出为java文件指令:jad com.arthas.controller.OrderController > /tmp/OrderController.java即:jad 类全路径 方法名 > 存储路径/存储名称然后到tmp路径下vi修改java文件即可,修改完成之后,查看对应的classloader为编译做准备sc -d *OrderController | grep classLoaderHashmc -c 17f052a3 /tmp/OrderController.java -d /tmp但是这里编译出错了,官方提示:所以我们本地编译好class文件,上传上去是一样的编译前调用[arthas@13190]$ trace com.arthas.controller.OrderController bigThreadPress Q or Ctrl+C to abort.Affect(class count: 1 , method count: 1) cost in 77 ms, listenerId: 2`---ts=2020-08-19 15:51:46;thread_name=http-nio-0.0.0.0-8080-exec-1;id=d;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1f1c7bf6    `---[6734.666529ms] com.arthas.controller.OrderController:bigThread() [throws Exception]        +---[0.786517ms] com.arthas.service.ArthasService:test() #20        `---throw:java.lang.OutOfMemoryError #-2 [unable to create new native thread]更新前代码@RequestMapping(value = "/bigThread")@ResponseBodypublic String bigThread(int id) {    ArthasService.test();    while (true) {        Thread t2 = new Thread();        t2.start();        id ++;        if(100000 == id) {            return String.valueOf(id);        }    }}更新后代码@RequestMapping(value = "/bigThread")@ResponseBodypublic String bigThread(int id) {    ArthasService.test();    Thread t2 = new Thread();    t2.start();    return "success";}编译指令[arthas@13190]$ redefine /tmp/OrderController.classredefine success, size: 1, classes:com.arthas.controller.OrderController编译后调用三次`---ts=2020-08-19 15:52:02;thread_name=http-nio-0.0.0.0-8080-exec-3;id=f;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1f1c7bf6    `---[5.609405ms] com.arthas.controller.OrderController:bigThread()        `---[0.204675ms] com.arthas.service.ArthasService:test() #20`---ts=2020-08-19 15:52:04;thread_name=http-nio-0.0.0.0-8080-exec-4;id=10;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1f1c7bf6    `---[3.900149ms] com.arthas.controller.OrderController:bigThread()        `---[0.14636ms] com.arthas.service.ArthasService:test() #20`---ts=2020-08-19 15:52:04;thread_name=http-nio-0.0.0.0-8080-exec-5;id=11;is_daemon=true;priority=5;TCCL=org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader@1f1c7bf6    `---[1.90945ms] com.arthas.controller.OrderController:bigThread()        `---[0.147353ms] com.arthas.service.ArthasService:test() #20可以发现时间从6734.666529ms变成3ms左右,说明热更新的代码生效了8.profile 绘制火焰图做后续分析📎20200819-102814.svg 附件如下图:
文章
Arthas  ·  存储  ·  运维  ·  Java  ·  测试技术  ·  Linux  ·  API  ·  微服务
2023-03-24
59-微服务技术栈(高级):在线检测工具Arthas(精准定位Java应用CPU负载过高)
1.前言尝试一:定位哪个Controller执行了代码前言 trace指令能追踪调用链路,而Springmvc应用都是借助于:javax.servlet.Servlet * 执行的 watch指令能够实时监测指定方法的:返回值,抛出异常,入参,同时支持OGNL操作实践为了节省时间,这里直接给出实施方案,采用watch指令,命令如下[监听内容是依靠trace的内容决定的,但是SpringMvc应用都是一样的,所以可以复用]:watch org.springframework.web.servlet.DispatcherServlet getHandler returnObj发起调用会看到打印信息,就能迅速定位到对应的代码尝试二:反编译查看代码
文章
Arthas  ·  Java  ·  测试技术  ·  开发者  ·  微服务
2023-03-24
58-微服务技术栈(高级):在线检测工具Arthas(jvm相关指令)
1. dashboard—当前系统的实时数据面板第二章节已说,这里不再赘述2. thread—查看当前 JVM 的线程堆栈信息第二章节已说,这里不再赘述3. jvm—查看当前 JVM 的信息jvm4. sysprop—查看和修改JVM的系统属性4.1 查看全部$ sysprop  KEY                                                  VALUE------------------------------------------------------------------------------------------------------------------------------------- java.runtime.name                                    Java(TM) SE Runtime Environment sun.boot.library.path                                /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib java.vm.version                                      25.51-b03 user.country.format                                  CN gopherProxySet                                       false java.vm.vendor                                       Oracle Corporation java.vendor.url                                      http://java.oracle.com/ path.separator                                       : java.vm.name                                         Java HotSpot(TM) 64-Bit Server VM file.encoding.pkg                                    sun.io user.country                                         US sun.java.launcher                                    SUN_STANDARD sun.os.patch.level                                   unknown java.vm.specification.name                           Java Virtual Machine Specification user.dir                                             /private/var/tmp java.runtime.version                                 1.8.0_51-b16 java.awt.graphicsenv                                 sun.awt.CGraphicsEnvironment java.endorsed.dirs                                   /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/endors                                                      ed os.arch                                              x86_64 java.io.tmpdir                                       /var/folders/2c/tbxwzs4s4sbcvh7frbcc7n000000gn/T/ line.separator java.vm.specification.vendor                         Oracle Corporation os.name                                              Mac OS X sun.jnu.encoding                                     UTF-8 java.library.path                                    /Users/wangtao/Library/Java/Extensions:/Library/Java/Extensions:/Network/Libra                                                      ry/Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java:. sun.nio.ch.bugLevel java.specification.name                              Java Platform API Specification java.class.version                                   52.0 sun.management.compiler                              HotSpot 64-Bit Tiered Compilers os.version                                           10.12.6 user.home                                            /Users/wangtao user.timezone                                        Asia/Shanghai java.awt.printerjob                                  sun.lwawt.macosx.CPrinterJob file.encoding                                        UTF-8 java.specification.version                           1.8 user.name                                            wangtao java.class.path                                      . java.vm.specification.version                        1.8 sun.arch.data.model                                  64 java.home                                            /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre sun.java.command                                     Test java.specification.vendor                            Oracle Corporation user.language                                        en awt.toolkit                                          sun.lwawt.macosx.LWCToolkit java.vm.info                                         mixed mode java.version                                         1.8.0_51 java.ext.dirs                                        /Users/wangtao/Library/Java/Extensions:/Library/Java/JavaVirtualMachines/jdk1.                                                      8.0_51.jdk/Contents/Home/jre/lib/ext:/Library/Java/Extensions:/Network/Library                                                      /Java/Extensions:/System/Library/Java/Extensions:/usr/lib/java sun.boot.class.path                                  /Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/lib/resour                                                      ces.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/li                                                      b/rt.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/Home/jre/l                                                      ib/sunrsasign.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Contents/H                                                      ome/jre/lib/jsse.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Content                                                      s/Home/jre/lib/jce.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jdk/Conte                                                      nts/Home/jre/lib/charsets.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.jd                                                      k/Contents/Home/jre/lib/jfr.jar:/Library/Java/JavaVirtualMachines/jdk1.8.0_51.                                                      jdk/Contents/Home/jre/classes java.vendor                                          Oracle Corporation file.separator                                       / java.vendor.url.bug                                  http://bugreport.sun.com/bugreport/ sun.cpu.endian                                       little sun.io.unicode.encoding                              UnicodeBig sun.cpu.isalist 4.2 查看指定属性$ sysprop java.version4.3 修改单个属性-- 查看$ sysprop user.countryuser.country=US-- 修改$ sysprop user.country CNSuccessfully changed the system property.user.country=CN5. sysenv—查看JVM的环境变量5.1 查看全部环境变量sysenv5.2 查看指定环境变量sysenv 环境变量KEY如:sysenv JAVA_HOME6. vmoption—查看和修改JVM里诊断相关的option6.1 查看全部optionvmoption6.2 查看指定optionvmoption key如:vmoption MaxHeapFreeRatio6.3 更新指定option[arthas@56963]$ vmoption PrintGCDetails trueSuccessfully updated the vm option.PrintGCDetails=true7. perfcounter—查看当前 JVM 的Perf Counter信息使用参考$ perfcounter java.ci.totalTime                            2325637411 java.cls.loadedClasses                       3403 java.cls.sharedLoadedClasses                 0 java.cls.sharedUnloadedClasses               0 java.cls.unloadedClasses                     0 java.property.java.version                   11.0.4 java.property.java.vm.info                   mixed mode java.property.java.vm.name                   OpenJDK 64-Bit Server VM...可以用-d参数打印更多信息:$ perfcounter -d Name                                   Variability   Units        Value--------------------------------------------------------------------------------- java.ci.totalTime                      Monotonic     Ticks        3242526906 java.cls.loadedClasses                 Monotonic     Events       3404 java.cls.sharedLoadedClasses           Monotonic     Events       0 java.cls.sharedUnloadedClasses         Monotonic     Events       0 java.cls.unloadedClasses               Monotonic     Events       0jdk9以上的应用如果没有打印出信息,应用在启动时,加下面的参数:--add-opens java.base/jdk.internal.perf=ALL-UNNAMED --add-exports java.base/jdk.internal.perf=ALL-UNNAMED8. logger—查看和修改logger8.1 查看所有logger信息[arthas@2062]$ logger name                                   ROOT class                                  ch.qos.logback.classic.Logger classLoader                            sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash                        2a139a55 level                                  INFO effectiveLevel                         INFO additivity                             true codeSource                             file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar appenders                              name            CONSOLE                                        class           ch.qos.logback.core.ConsoleAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        target          System.out                                        name            APPLICATION                                        class           ch.qos.logback.core.rolling.RollingFileAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        file            app.log                                        name            ASYNC                                        class           ch.qos.logback.classic.AsyncAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        appenderRef     [APPLICATION]从appenders的信息里,可以看到CONSOLE logger的target是System.outAPPLICATION logger是RollingFileAppender,它的file是app.logASYNC它的appenderRef是APPLICATION,即异步输出到文件里8.2 查看指定logger[arthas@2062]$ logger -n org.springframework.web name                                   org.springframework.web class                                  ch.qos.logback.classic.Logger classLoader                            sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash                        2a139a55 level                                  null effectiveLevel                         INFO additivity                             true codeSource                             file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar8.3 查看指定classloader的logger其中,classloader为上述8.1或8.2中返回的[arthas@2062]$ logger -c 2a139a55 name                                   ROOT class                                  ch.qos.logback.classic.Logger classLoader                            sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash                        2a139a55 level                                  DEBUG effectiveLevel                         DEBUG additivity                             true codeSource                             file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar appenders                              name            CONSOLE                                        class           ch.qos.logback.core.ConsoleAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        target          System.out                                        name            APPLICATION                                        class           ch.qos.logback.core.rolling.RollingFileAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        file            app.log                                        name            ASYNC                                        class           ch.qos.logback.classic.AsyncAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        appenderRef     [APPLICATION]8.4 更新全局logger level[arthas@2062]$ logger --name ROOT --level debugupdate logger level success.8.5 更新指定classloader logger level默认情况下,logger命令会在SystemClassloader下执行,如果应用是传统的war应用,或者spring boot fat jar启动的应用,那么需要指定classloader。可以先用 sc -d yourClassName 来查看具体的 classloader hashcode,然后在更新level时指定classloader:[arthas@2062]$ logger -c 2a139a55 --name ROOT --level debug8.6 查看没有appender的logger默认情况下,logger命令只打印有appender的logger的信息。如果想查看没有appender的logger的信息,可以加上参数--include-no-appender。注意,通常输出结果会很长[arthas@2062]$ logger --include-no-appender name                                   ROOT class                                  ch.qos.logback.classic.Logger classLoader                            sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash                        2a139a55 level                                  DEBUG effectiveLevel                         DEBUG additivity                             true codeSource                             file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar appenders                              name            CONSOLE                                        class           ch.qos.logback.core.ConsoleAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        target          System.out                                        name            APPLICATION                                        class           ch.qos.logback.core.rolling.RollingFileAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        file            app.log                                        name            ASYNC                                        class           ch.qos.logback.classic.AsyncAppender                                        classLoader     sun.misc.Launcher$AppClassLoader@2a139a55                                        classLoaderHash 2a139a55                                        appenderRef     [APPLICATION]  name                                   com class                                  ch.qos.logback.classic.Logger classLoader                            sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash                        2a139a55 level                                  null effectiveLevel                         DEBUG additivity                             true codeSource                             file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar  name                                   com.alibaba class                                  ch.qos.logback.classic.Logger classLoader                            sun.misc.Launcher$AppClassLoader@2a139a55 classLoaderHash                        2a139a55 level                                  null effectiveLevel                         DEBUG additivity                             true codeSource                             file:/Users/hengyunabc/.m2/repository/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar...9. getstatic—查看类的静态属性有需再更10. ognl—执行ognl表达式有需再更11. mbean—查看 Mbean 的信息有需再更
文章
Arthas  ·  Oracle  ·  Java  ·  关系型数据库  ·  测试技术  ·  网络性能优化  ·  API  ·  开发者  ·  微服务  ·  Spring
2023-03-24
57-微服务技术栈(高级):在线检测工具Arthas(基础指令)
1.dashboard输入dashboard,按回车/enter,会展示当前进程的信息,按ctrl+c可以中断执行ID: Java级别的线程ID,注意这个ID不能跟jstack中的nativeID一一对应NAME: 线程名GROUP: 线程组名PRIORITY: 线程优先级, 1~10之间的数字,越大表示优先级越高STATE: 线程的状态CPU%: 线程消耗的cpu占比,采样100ms,将所有线程在这100ms内的cpu使用量求和,再算出每个线程的cpu使用占比。TIME: 线程运行总时间,数据格式为分:秒INTERRUPTED: 线程当前的中断位状态DAEMON: 是否是daemon线程2.jad反编译指令输入:jad + 文件全路径,如我想查看主启动类,则:jad com.arthas.ArthasApplication3.thread最忙的前N个线程并打印堆栈thread -n 3所有线程的信息thread指定线程的运行堆栈thread id如上有线程ID为37的,所以这里指明id=37当前阻塞其他线程的线程thread -b无阻塞返回有阻塞返回"http-bio-8080-exec-4" Id=27 TIMED_WAITING    at java.lang.Thread.sleep(Native Method)    at test.arthas.TestThreadBlocking.doGet(TestThreadBlocking.java:22)    -  locked java.lang.Object@725be470 <---- but blocks 4 other threads!    at javax.servlet.http.HttpServlet.service(HttpServlet.java:624)    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)    at test.filter.TestDurexFilter.doFilter(TestDurexFilter.java:46)    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)    at com.taobao.tomcat.valves.ContextLoadFilterValve$FilterChainAdapter.doFilter(ContextLoadFilterValve.java:191)    at com.taobao.eagleeye.EagleEyeFilter.doFilter(EagleEyeFilter.java:81)    at com.taobao.tomcat.valves.ContextLoadFilterValve.invoke(ContextLoadFilterValve.java:150)    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:429)    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)    -  locked org.apache.tomcat.util.net.SocketWrapper@7127ee12    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)    at java.lang.Thread.run(Thread.java:745)     Number of locked synchronizers = 1    - java.util.concurrent.ThreadPoolExecutor$Worker@31a6493e注意, 目前只支持找出synchronized关键字阻塞住的线程, 如果是java.util.concurrent.Lock, 目前还不支持。指定采样时间间隔thread -n 3 -i 间隔时间(ms)查看指定状态的线程thread –state thread –state 状态状态:[RUNNABLE, BLOCKED, WAITING, TIMED_WAITING, NEW, TERMINATED]4.watch查看方法耗时出参watch 类全路径 方法名 returnObj如我有这样一个方法:则指令为:watch com.arthas.controller.ArthasController arthasTest returnObj查看指定方法入参出参watch com.arthas.controller.ArthasController arthasTest "{params,returnObj}" -x 2观察异常信息5.退出Arthas如果只是退出当前的连接,可以用quit或者exit命令。Attach到目标进程上的arthas还会继续运行,端口会保持开放,下次连接时可以直接连接上。如果想完全退出arthas,可以执行stop命令。
文章
Arthas  ·  Java  ·  测试技术  ·  开发者  ·  数据格式  ·  微服务
2023-03-24
56-微服务技术栈(高级):在线检测工具Arthas(下载安装)
1.依赖Arthas的使用需要别的Java应用先启动,所以确保您的服务器上(Windows/Linux/Mac)上已经启动需要安装JDK需要能访问公网2.安装arthas-bootcurl -O https://arthas.aliyun.com/arthas-boot.jar下载完成后如下图3.上传一个java应用您可以用我自己开发的这个Demo(基于SpringBoot+JDK1.8),如下附件:📎Arthas.jar或使用官方提供的:curl -O https://arthas.aliyun.com/arthas-demo.jarjava -jar arthas-demo.jar4.启动Java应用java -jar Arthas.jar 启动完成后如下图,我在这个Demo中预留了一个测试接口(如果你使用官网的Demo这可忽略),访问之后如下:或浏览器访问:5.启动Arthasjava -jar arthas-boot.jar启动完之后他会提示选择对应的Java进程,我这里只有一个应用,即:Arthas.jar,所以这里我输入1启动成功6.小结安装运行前提是服务器上有java进程在进行,可以看到Arthas是支持多个Java进程的处理的,只要选择对应的序号即可。本章节很简单,之后我们再来具体看看Arthas能做什么。
文章
Arthas  ·  Java  ·  测试技术  ·  Linux  ·  开发者  ·  微服务  ·  Windows
2023-03-24
java线上项目排查,Arthas简单上手
Arthas 是Alibaba开源的Java诊断工具。参考:arthas当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决: 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! 是否有一个全局视角来查看系统的运行状况? 有什么办法可以监控到JVM的实时运行状态? 怎么快速定位应用的热点,生成火焰图? Arthas支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。1、安装(Linux):curl -L https://alibaba.github.io/arthas/install.sh | sh2、启动:./as.as序号后的数值(如:15075)为当前服务器上的进程PID。选择你要排查的项目进程,选择序号(如:1):则进入到arthas交互页面。3、常用命令:3.1)“上帝视角”,即Dashboard。对当前项目的数据监控。3.2)thread。查看当前线程信息,查看线程的堆栈。thread:查看所有线程。thread -n 5:查看最忙(CPU使用率最高)的5条线程。thread -b:找出当前阻塞其他线程的线程。thread -state:查看指定状态的线程。3.3)jad。反编译class。jad com.icode.controller.VersionController3.4) watch。观察指定方法的调用情况。能观察到的范围为:返回值、抛出异常、入参,通过编写 OGNL 表达式进行对应变量的查看。如查看某个方法的返回值:watch 全路径类名 方法名 returnObj3.5) trace。输出方法路径上的每个节点上耗时。trace 全路径类名 方法名3.6)jvm。查看当前JVM信息。4、中断、退出:    4.1)使用ctrl+c中断artahs执行。    4.2)使用 exit 退出arthas。此外,arthas还提供web console。通过浏览器连接arthas。其他常用命令,以及用法参考官方文档。 这里只展示几个测试用的简单上手命令。以供以后查阅。
文章
Arthas  ·  监控  ·  Java  ·  测试技术  ·  Linux  ·  数据处理
2023-03-23
请问一下,我cmd启动的arthas,cmd已经关闭了,但是网页端怎么还可以访问呢?
请问一下,我cmd启动的arthas,cmd已经关闭了,但是网页端怎么还可以访问呢?
问答
Arthas  ·  测试技术
2023-03-22
Arthas 是使用哪个框架写的呀?
Arthas 是使用哪个框架写的呀?
问答
Arthas  ·  测试技术
2023-03-21
1 2 3 4 5 6 7 8 9
...
20
跳转至:
阿里云云原生
8798 人关注 | 7222 讨论 | 2086 内容
+ 订阅
  • 统一观测丨使用 Prometheus 监控 Nginx Ingress 网关最佳实践
  • 【送猫超卡、阿里云代金券】动手体验 SAE+云效 10 分钟快速打通 CI/CD 流水线
  • RocketMQ x OpenTelemetry 分布式全链路追踪最佳实践
查看更多 >
阿里巴巴大数据计算
347728 人关注 | 963 讨论 | 951 内容
+ 订阅
  • MaxCompute 包年包月套餐与非预留计算资源将于北京时间2023年4月30日00:00:00停止续订
  • 阿里云 MaxCompute 2022-12月刊
  • MaxCompute 新售卖规格解读与新版控制台操作详解
查看更多 >
开发与运维
5783 人关注 | 133437 讨论 | 319379 内容
+ 订阅
  • 如何使用 layui 的富文本编辑器组件?底层原理是什么?
  • 如何使用 layui 的日期选择器组件?底层原理是什么?
  • 如何在微信小程序中使用第三方SDK?
查看更多 >
微服务
23047 人关注 | 11737 讨论 | 35112 内容
+ 订阅
  • 资源总结
  • 【Spring面试】 BeanFactory和FactoryBean是什么?
  • Yii2.0框架一共有哪些组件?底层原理是什么?
查看更多 >
大数据
188712 人关注 | 30988 讨论 | 83925 内容
+ 订阅
  • 如何使用 PHP 和微信公众号 API 实现获取用户的地理位置消息?底层原理是什么?
  • WEB专业例子测试
  • 2023美赛春季赛A题思路数据代码论文分享
查看更多 >