最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Arthas

网站源码admin3浏览0评论

Arthas

Arthas

tip:作为程序员一定学习编程之道,一定要对代码的编写有追求,不能实现就完事了。我们应该让自己写的代码更加优雅,即使这会费时费力。

推荐:体系化学习Java(Java面试专题)

开头:
我们先说下生产使用频率较高的有哪些:dashboard、heapdump、jvm、memory、thread

文章目录

  • JVM相关命令的使用
    • dashboard
    • getstatic
    • heapdump
    • jvm
    • logger
      • 1、logger
      • 2、logger -c 31cefde0
      • 3、 logger -n org.springframework.web
      • 4、logger --name ROOT --level debug
      • 5、logger --include-no-appender
    • mbean
    • memory
    • ognl
    • perfcounter
    • sysenv
    • sysprop
    • thread
    • vmoption
    • vmtool
      • 1、vmtool --action getInstances --className java.lang.String --limit 10
      • 2、sc -d
      • 3、vmtool --action forceGc
      • 4、vmtool --action interruptThread -t [id]

JVM相关命令的使用

dashboard

这个命令是一个可视化的控制台,显示CPU、内存这些使用指标,已经一些线程的状态,算是一个使用频率相当高的命令,主要帮助我们初步查看是什么问题。

下面是使用截图:

getstatic

这个命令是获取一个类的静态变量,该命令主要辅助我们线上定位某些静态的变量具体有什么值,帮助我们分析故障。
语法: getstatic [类的全限定名] [类中的变量名] [ognl表达式]
例子: getstatic com.pany.camp.arthas.Test map ‘entrySet().iterator.{? #this.key.name()==“a”}’

我写一个例子的代码,辅助理解这个命令。

package com.pany.camp.arthas;import com.googlemon.collect.Maps;
import org.springframework.stereotype.Component;import java.util.Map;@Component
public class Test {public static Map<String, String> map = Maps.newHashMap();static {map.put("a", "zhangsan");map.put("b", "lisi");}
}

下面是命令的使用截图,都可以打印类中的静态变量。

heapdump

这个命令是用来 dump 内存情况的,主要用来做内存分析的,定位内存溢出、内存泄露这类问题,线上使用一定注意内存的大小,不然 dump 的文件很大,也是很费时间的。而且有些重要的生产系统是禁止 dump 的,也是要注意的, dump 之前一般会做一次垃圾回收的动作。
这个命令类似于 Java 的 jmap 的 heap dump。

命令: heapdump [–live] [文件路径/文件名.hprof]
–live 是可选的,意思是打印有活跃引用的对象,丢弃进行垃圾回收的对象。

例子:heapdump --live /root/test/study-06-01.hprof

使用截图如下:

导出的这个问题怎么分析呢?
可以通过 1、JProfiler 2、VisualVM 3、其他内存分析工具 进行内存分析。

jvm

这个命令主要是用来打印 jvm 相关信息的,使用也很简单。

语法: jvm

使用截图:

官网对字段也有描述:
THREAD 相关
COUNT: JVM 当前活跃的线程数
DAEMON-COUNT: JVM 当前活跃的守护线程数
PEAK-COUNT: 从 JVM 启动开始曾经活着的最大线程数
STARTED-COUNT: 从 JVM 启动开始总共启动过的线程次数
DEADLOCK-COUNT: JVM 当前死锁的线程数

文件描述符相关
MAX-FILE-DESCRIPTOR-COUNT:JVM 进程最大可以打开的文件描述符数
OPEN-FILE-DESCRIPTOR-COUNT:JVM 当前打开的文件描述符数

logger

这个打印一些日志相关的信息,这个一般不常用。

命令: loggger [-c hashcode] [-n 包名] [–name 名称] [–level 日志级别]
这里有几种用法,我列举下:

1、logger

打印 logger 的信息

2、logger -c 31cefde0

根据 hashcode 打印信息,hashcode 可以用 sc -d yourClassName 来看 classloader hashcode。

用 sc -d yourClassName 来看 classloader hashcode

3、 logger -n org.springframework.web

根据包名去打印信息。

4、logger --name ROOT --level debug

如果我们是 war 包或者 jar 包这种启动的,需要指定 classloader,通过这个方式更新日志级别: logger -c 31cefde0 --level info

5、logger --include-no-appender

这个主要打印没有appender的 logger 的信息,这个不常用,主要打印信息非常长。

mbean

这个命令就是查看 Mbean 的信息,但是 mbean 是什么呢?
MBean 就是一种规范的 JavaBean,通过集成和实现一套标准的 Bean 接口,这种叫 MBean,Mbean 注册到 MBeanServer 中。

这个命令不常用,了解了解即可。
用法如下:
列出所有 Mbean 的名称:mbean
列出所有 Mbean 的名称:mbean -m java.lang:type=Threading
查看 mbean 属性信息:mbean java.lang:type=Threading
mbean 的 name 支持通配符匹配: mbean java.lang:type=Th*

memory

这个命令是查看 jvm 信息,这个看内存配置和使用情况的时候也会使用。

命令: memory

使用截图如下:

ognl

这个命令是 3.0.5 版本增加的,支持 ognl 表达式。

ognl 表达式的资料网址:
OGNL 特殊用法请参考:
OGNL 表达式官方指南: .html

perfcounter

查看 jvm 的 Perf Counter 信息。 Perf Counter 是什么呢?
它是性能计数器,编译器用来优化代码的。

命令: perfcounter [-d]
-d 这个参数可选,加了能打印更多信息,这个命令也不常用。

sysenv

查看当前 JVM 的环境属性,基本上这个也很少用。

命令:sysenv
使用截图如下:

sysprop

查看当前 JVM 的系统属性,基本上这个也很少用。

命令:sysprop
使用截图如下:

thread

查看当前线程信息,查看线程的堆栈,这个命令属于常用命令。

命令使用如下(使用比较多的我都给加粗了):
thread 打印第一页线程信息
thread -n 5 打印 top5 繁忙的线程信息
thread --all 显示所有的线程
thread [id] 打印制定 id 的线程运行堆栈
thread -b 打印当前阻塞其他线程的线程
thread -i 1000 每过1000ms 统计一次线程信息
thread -n 5 -i 1000 每过1000ms 统计一次 top5 线程信息



vmoption

查看,更新 VM 诊断相关的参数,这个命令偶尔也会用。

命令:vmoption [操作]
例如:vmoption 打印所有的操作
vmoption PrintGC 打印GC参数

使用截图如下:

vmtool

这个命令从 3.5.1 版本开始支持,利用 JVMTI 接口,实现查询内存对象,强制 GC 等功能,不常用。

举例几种用法:
获取 String 对象,limit 用来限制返回数量,防止返回太多。

1、vmtool --action getInstances --className java.lang.String --limit 10

2、sc -d

这个我们上面举例过,用来用户 classloader 的。

3、vmtool --action forceGc

动态的打开 PrintGC的开发,和 vmoption 一样可以操作改变参数。

4、vmtool --action interruptThread -t [id]

这个是用来 interrupt 指定线程,可以用来中断另一个线程。
例如: vmtool --action interruptThread -t 1

发布评论

评论列表(0)

  1. 暂无评论