58-微服务技术栈(高级):在线检测工具Arthas(jvm相关指令)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 开发者对于生产问题故障的排查、定位,随着微服务的喷发,也不再像是以前那边依赖纯日志、gc日志进行问题排查与定位了,本节开始介绍一个生产环境使用的排错工具Arthas,帮助大家更高效、便捷地实现生产问题排错。

1. dashboard—当前系统的实时数据面板

第二章节已说,这里不再赘述

2. thread—查看当前 JVM 的线程堆栈信息

第二章节已说,这里不再赘述

3. jvm—查看当前 JVM 的信息

jvm

4. 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.version

4.3 修改单个属性

-- 查看

$ sysprop user.country

user.country=US


-- 修改

$ sysprop user.country CN

Successfully changed the system property.

user.country=CN

5. sysenv—查看JVM的环境变量

5.1 查看全部环境变量

sysenv

5.2 查看指定环境变量

sysenv 环境变量KEY

如:sysenv JAVA_HOME

6. vmoption—查看和修改JVM里诊断相关的option

6.1 查看全部option

vmoption

6.2 查看指定option

vmoption key

如:vmoption MaxHeapFreeRatio

6.3 更新指定option

[arthas@56963]$ vmoption PrintGCDetails true

Successfully updated the vm option.

PrintGCDetails=true

7. 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       0

jdk9以上的应用

如果没有打印出信息,应用在启动时,加下面的参数:

--add-opens java.base/jdk.internal.perf=ALL-UNNAMED --add-exports java.base/jdk.internal.perf=ALL-UNNAMED

8. logger—查看和修改logger

8.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.out
  • APPLICATION logger是RollingFileAppender,它的file是app.log
  • ASYNC它的appenderRefAPPLICATION,即异步输出到文件里

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.jar

8.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 debug

update logger level success.

8.5 更新指定classloader logger level

默认情况下,logger命令会在SystemClassloader下执行,如果应用是传统的war应用,或者spring boot fat jar启动的应用,那么需要指定classloader。

可以先用 sc-dyourClassName 来查看具体的 classloader hashcode,然后在更新level时指定classloader:

[arthas@2062]$ logger -c 2a139a55 --name ROOT --level debug

8.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 的信息

有需再更

相关文章
|
13天前
|
存储 Java 索引
深入浅出JVM(十)之字节码指令(下篇)
深入浅出JVM(十)之字节码指令(下篇)
|
13天前
|
存储 Java 索引
深入浅出JVM(九)之字节码指令(上篇)
深入浅出JVM(九)之字节码指令(上篇)
|
13天前
|
存储 Java 调度
JVM指令手册
JVM指令手册汇总
|
13天前
|
Java
|
13天前
|
存储 Java 编译器
深入理解JVM - 字节码指令
深入理解JVM - 字节码指令
69 0
|
13天前
|
设计模式 Java 关系型数据库
BAT等大厂年薪30W+面试清单:JVM\MySQL\设计模式\分布式\微服务
疫情影响下招聘名额缩减不少,但阿里、腾讯、抖音、快手等互联网公司却加快了人才招聘的节奏。这里根据自身的实际经历,整理了一份面试这些大厂的清单,希望能帮助到大家查漏补缺,攻克面试难关。
|
13天前
|
消息中间件 前端开发 架构师
华为架构师复盘2024最全2340页面试题jvm+spring+redis+MQ+微服务
包括 Java 集合、JVM、多线程、并发编程、设计模式、Spring全家桶、Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、MongoDB、Redis、MySQL、RabbitMQ、Kafka、Linux、Netty、Tomcat、Python、HTML、CSS、Vue、React、JavaScript、Android 大数据、阿里巴巴等大厂面试题等、等技术栈!
|
13天前
|
消息中间件 监控 Java
微服务架构深入理解 | 技术栈
微服务架构深入理解 | 技术栈
144 0
|
6月前
|
Arthas Java 测试技术
微服务轮子项目(49) -常见JVM内存错误及解决方案
微服务轮子项目(49) -常见JVM内存错误及解决方案
74 0
|
6月前
|
Java 微服务
微服务轮子项目(48) -JVM性能调优
微服务轮子项目(48) -JVM性能调优
96 0