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

本文涉及的产品
云原生网关 MSE Higress,422元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 开发者对于生产问题故障的排查、定位,随着微服务的喷发,也不再像是以前那边依赖纯日志、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 的信息

有需再更

相关文章
|
5月前
|
Arthas 监控 Java
(十一)JVM成神路之性能调优篇:GC调优、Arthas工具详解及各场景下线上最佳配置推荐
“在当前的互联网开发模式下,系统访问量日涨、并发暴增、线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代开发过程中炙手可热的名词,无论是在开发、面试过程中,性能优化都是一个常谈常新的话题”。
454 3
|
2月前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
36 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
2月前
|
Arthas 监控 Java
JVM知识体系学习七:了解JVM常用命令行参数、GC日志详解、调优三大方面(JVM规划和预调优、优化JVM环境、JVM运行出现的各种问题)、Arthas
这篇文章全面介绍了JVM的命令行参数、GC日志分析以及性能调优的各个方面,包括监控工具使用和实际案例分析。
51 3
|
2月前
|
SQL 缓存 Java
JVM知识体系学习三:class文件初始化过程、硬件层数据一致性(硬件层)、缓存行、指令乱序执行问题、如何保证不乱序(volatile等)
这篇文章详细介绍了JVM中类文件的初始化过程、硬件层面的数据一致性问题、缓存行和伪共享、指令乱序执行问题,以及如何通过`volatile`关键字和`synchronized`关键字来保证数据的有序性和可见性。
31 3
|
4月前
|
Java
Java常见JVM虚拟机指令(47个)
Java常见JVM虚拟机指令(47个)
69 3
Java常见JVM虚拟机指令(47个)
|
4月前
|
缓存 前端开发 Java
浅析JVM invokedynamic指令与Java Lambda语法
【8月更文挑战第27天】在Java的演进历程中,invokedynamic指令的引入和Lambda表达式的出现无疑是两大重要里程碑。它们不仅深刻改变了Java的开发模式和性能表现,还极大地推动了Java在函数式编程和动态语言支持方面的进步。本文将从技术角度浅析JVM中的invokedynamic指令及其与Java Lambda语法的紧密联系。
62 0
|
5月前
|
监控 Java Linux
Linux下JVM相关指令详解及案例介绍
Linux下JVM相关指令详解及案例介绍
58 1
|
5月前
|
缓存 Devops 微服务
微服务01好处,随着代码越多耦合度越多,升级维护困难,微服务技术栈,异步通信技术,缓存技术,DevOps技术,搜索技术,单体架构,分布式架构将业务功能进行拆分,部署时费劲,集连失败如何解决
微服务01好处,随着代码越多耦合度越多,升级维护困难,微服务技术栈,异步通信技术,缓存技术,DevOps技术,搜索技术,单体架构,分布式架构将业务功能进行拆分,部署时费劲,集连失败如何解决
|
5月前
|
存储 运维 Java
Java中的字节码与JVM指令集详解
Java中的字节码与JVM指令集详解
|
7月前
|
存储 Java 索引
深入浅出JVM(十)之字节码指令(下篇)
深入浅出JVM(十)之字节码指令(下篇)