目录
一、top(Linux命令)
二、jstack
分析jstack日志:
线程状态:
调用修饰
线程动作
总结
 三、jps
 四、jmap
首页 Java java教程 java中如何使用JVM命令来实现服务器故障排查

java中如何使用JVM命令来实现服务器故障排查

Oct 17, 2018 pm 03:28 PM
jstack linux命令

本篇文章就给大家介绍java中使用JVM命令来实现服务器故障排查的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。

一、top(Linux命令)

执行top命令:    (查看进程15477的详细情况,下文用到)

 

系统信息(前五行):

    • 第1行:Top 任务队列信息(系统运行状态及平均负载),与uptime命令结果相同。 

      • 系统平均负载:单核CPU情况下,0.00 表示没有任何负荷,1.00表示刚好满负荷,超过1侧表示超负荷,理想值是0.7;

      • 多核CPU负载:CPU核数 * 理想值0.7 = 理想负荷,例如:4核CPU负载不超过2.8何表示没有出现高负载。

      • 格式:up xx days, HH:MM

      • 例如:241 days, 20:11, 表示连续运行了241天20小时11分钟

      • 第1段:系统当前时间,例如:16:07:37

      • 第2段:系统运行时间,未重启的时间,时间越长系统越稳定。 

      • 第3段:当前登录用户数,例如:1 user,表示当前只有1个用户登录

      • 第4段:系统负载,即任务队列的平均长度,3个数值分别统计最近1,5,15分钟的系统平均负载 

    • 第2行:Tasks 进程相关信息 

      • 第1段:进程总数,例如:Tasks: 231 total, 表示总共运行231个进程

      • 第2段:正在运行的进程数,例如:1 running,

      • 第3段:睡眠的进程数,例如:230 sleeping,

      • 第4段:停止的进程数,例如:0 stopped,

      • 第5段:僵尸进程数,例如:0 zombie

    • 第3行:Cpus CPU相关信息,如果是多核CPU,按数字1可显示各核CPU信息,此时1行将转为Cpu核数行,数字1可以来回切换。 

      • 第1段:us 用户空间占用CPU百分比,例如:Cpu(s): 12.7%us,

      • 第2段:sy 内核空间占用CPU百分比,例如:8.4%sy,

      • 第3段:ni 用户进程空间内改变过优先级的进程占用CPU百分比,例如:0.0%ni,

      • 第4段:id 空闲CPU百分比,例如:77.1%id,

      • 第5段:wa 等待输入输出的CPU时间百分比,例如:0.0%wa,

      • 第6段:hi CPU服务于硬件中断所耗费的时间总额,例如:0.0%hi,

      • 第7段:si CPU服务软中断所耗费的时间总额,例如:1.8%si,

      • 第8段:st Steal time 虚拟机被hypervisor偷去的CPU时间(如果当前处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的)

    • 第4行:Mem 内存相关信息(Mem: 12196436k total, 12056552k used, 139884k free, 64564k buffers) 

      • 第1段:物理内存总量,例如:Mem: 12196436k total,

      • 第2段:使用的物理内存总量,例如:12056552k used,

      • 第3段:空闲内存总量,例如:Mem: 139884k free,

      • 第4段:用作内核缓存的内存量,例如:64564k buffers

    •  第5行:Swap 交换分区相关信息(Swap: 2097144k total, 151016k used, 1946128k free, 3120236k cached) 

      • 第1段:交换区总量,例如:Swap: 2097144k total,

      • 第2段:使用的交换区总量,例如:151016k used,

      • 第3段:空闲交换区总量,例如:1946128k free,

      • 第4段:缓冲的交换区总量,3120236k cached

 进程信息:

  在top命令中按f按可以查看显示的列信息,按对应字母来开启/关闭列,大写字母表示开启,小写字母表示关闭。带*号的是默认列。

    • A: PID = (Process Id) 进程Id;

    • E: USER = (User Name) 进程所有者的用户名;

    • H: PR = (Priority) 优先级

    • I: NI = (Nice value) nice值。负值表示高优先级,正值表示低优先级

    • O: VIRT = (Virtual Image (kb)) 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

    • Q: RES = (Resident size (kb)) 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

    • T: SHR = (Shared Mem size (kb)) 共享内存大小,单位kb

    • W: S = (Process Status) 进程状态。D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程

    • K: %CPU = (CPU usage) 上次更新到现在的CPU时间占用百分比

    • N: %MEM = (Memory usage (RES)) 进程使用的物理内存百分比

    • M: TIME+ = (CPU Time, hundredths) 进程使用的CPU时间总计,单位1/100秒 
      b: PPID = (Parent Process Pid) 父进程Id 
      c: RUSER = (Real user name) 
      d: UID = (User Id) 进程所有者的用户id 
      f: GROUP = (Group Name) 进程所有者的组名 
      g: TTY = (Controlling Tty) 启动进程的终端名。不是从终端启动的进程则显示为 ? 
      j: P = (Last used cpu (SMP)) 最后使用的CPU,仅在多CPU环境下有意义 
      p: SWAP = (Swapped size (kb)) 进程使用的虚拟内存中,被换出的大小,单位kb 
      l: TIME = (CPU Time) 进程使用的CPU时间总计,单位秒 
      r: CODE = (Code size (kb)) 可执行代码占用的物理内存大小,单位kb 
      s: DATA = (Data+Stack size (kb)) 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb 
      u: nFLT = (Page Fault count) 页面错误次数 
      v: nDRT = (Dirty Pages count) 最后一次写入到现在,被修改过的页面数 
      y: WCHAN = (Sleeping in Function) 若该进程在睡眠,则显示睡眠中的系统函数名 
      z: Flags = (Task Flags ) 任务标志,参考 sched.h

    • X: COMMAND = (Command name/line) 命令名/命令行

参考  Linux性能分析工具top命令详解

执行top -Hp PID,如 top -Hp 15477

查看某进程中的线程  注:此时PID是线程id

如线程15571有异常需要查看,使用jstack打印堆栈,查看线程15571状态(15571 16进制=3cd3)

二、jstack

 参考 java命令--jstack 工具

    Java命令学习系列(二)——Jstack

  需要到JDK安装目录下使用(可通过ps x查看java进程,得到jdk安装目录)

  ./jstack PID(进程id)   ./jstack 15477

  红框中即为线程15571(16进制=3cd3) 状态

分析jstack日志:

 

监视器Monitor:

 Monitor是 Java中用以实现线程之间的互斥与协作的主要手段,它可以看成是对象或者 Class的锁。

每一个对象都有,也仅有一个 monitor。

下面这个图,描述了线程和Monitor之间关系,以及线程的状态转换:

进入区(Entrt Set):表示线程通过synchronized要求获取对象的锁。如果对象被锁住,则进入拥有者;否则在进入区等待。一旦对象锁被其他线程释放,立即参与竞争。

拥有者(The Owner):表示某一线程成功竞争到对象锁。

等待区(Wait Set):表示线程通过对象的object.wait()方法,释放对象的锁,并在等待区等待被唤醒。

从图中可以看出,一个 Monitor在某个时刻,只能被一个线程拥有,该线程就是 <span style='font-family: "Microsoft YaHei"'>Active Thread</span>,而其它线程都是 <span style='font-family: "Microsoft YaHei"'>Waiting</span> <span style='font-family: "Microsoft YaHei"'>Thread</span>,分别在两个队列 <span style='font-family: "Microsoft YaHei"'>Entry</span> <span style='font-family: "Microsoft YaHei"'>Set</span>和 <span style='font-family: "Microsoft YaHei"'>Wait</span> <span style='font-family: "Microsoft YaHei"'>Set</span>里面等候。

<span style='font-family: "Microsoft YaHei"'>Entry</span> <span style='font-family: "Microsoft YaHei"'>Set</span>中等待的线程动作是 <span style='font-family: "Microsoft YaHei"'>Waiting for monitor entry</span>。

在 <span style='font-family: "Microsoft YaHei"'>Wait</span> <span style='font-family: "Microsoft YaHei"'>Set</span>中等待的线程动作是 <span style='font-family: "Microsoft YaHei"'>in Object.wait()</span>当一个线程申请进入临界区时,它就进入了 Entry Set队列。

(我们称被 synchronized保护起来的代码段为临界区。当一个线程申请进入临界区时,它就进入了 “Entry Set ”队列)

线程状态:

NEW:未启动的。不会出现在Dump中。

RUNNABLE:在虚拟机内执行的,运行中状态。The Owner区

BLOCKED:受阻塞并等待监视器锁。在Entry Set区等锁

WATING:无限期等待另一个线程执行特定操作。在Wait Set区等待某个condition或monitor发生,一般停留在wait()等语句里。

TIMED_WATING:有时限的等待另一个线程的特定操作。Wait Set区和WAITING的区别是wait() 等语句加上了时间限制 wait(timeout)。

TERMINATED:已退出的。

调用修饰

表示线程在方法调用时,额外的重要的操作。修饰上方的方法调用。

locked <地址> 目标:使用synchronized申请对象锁成功,监视器的拥有者。The Owner区。

waiting to lock <地址> 目标:使用synchronized申请对象锁未成功,在Entry Set区等锁。线程状态为Blocked

waiting on <地址> 目标:使用synchronized申请对象锁成功后,释放锁,在Wait Set区等锁。线程状态为WAITING或TIMED_WATING

parking to wait for <地址> 目标:调用了park(),在Wait Set区,等待许可。

 (park是基本的线程阻塞原语,不通过监视器在对象上阻塞。

  park: 进入WAITING状态,对比wait不需要获得锁就可以让线程WAITING,通过unpark唤醒)

线程动作

线程状态产生的原因。

runnable:The Owner区,状态RUNNABLE

in Object.wait():调用wait(),Wait Set区,状态为WAITING或TIMED_WAITING,修饰waiting on 

waiting for monitor entry:等锁,Entry Set区,状态BLOCKED,修饰waiting to lock

waiting on condition:因某种条件被park,Wait Set区,状态为parking to wait for

sleeping:休眠的线程,调用了Thread.sleep()

总结

1、查看线程dump,先看线程状态/线程动作(比较直观),可以确定线程目前处于哪个阶段。然后看调用修饰及锁情况,基本就可以确定次线程是否有问题;

2、可以短时间(可能有问题的时间段)内多次打印线程快照,然后查看可能有问题的某一线程在这几次的情况,可以有效查找问题。

 三、jps

类似Linux命令ps 

参考 Java命令学习系列(一)——Jps

./jps

 ./jps -q

./jps -m

./jps -l

./jps -v

 四、jmap

参考: Java命令学习系列(三)——Jmap

            java命令--jmap命令使用

 jmap -heap PID:堆使用情况

jmap -histo PID:对象情况

(jmap -histo:live 这个命令执行,JVM会先触发gc,然后再统计信息

重点看项目上的类:[C是字符串数组,String用;[B是字节数组,网络层用到。这两个比较大一般没关系

  [C is a char[]
   [S is a short[]
   [I is a int[]
   [B is a byte[]
   [[I is a int[][]

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。更多相关教程请访问Java视频教程java开发图文教程bootstrap视频教程

以上是java中如何使用JVM命令来实现服务器故障排查的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在 Linux 下使用任务管理器 在 Linux 下使用任务管理器 Aug 15, 2024 am 07:30 AM

有很多Linux初学者经常问起的问题,“Linux有任务管理器吗?”,“怎样在Linux上打开任务管理器呢?”来自Windows的用户都知道任务管理器非常有用。你可以在Windows中按下Ctrl+Alt+Del打开任务管理器。这个任务管理器向你展示了所有的正在运行的进程和它们消耗的内存,你可以从任务管理器程序中选择并杀死一个进程。当你刚使用Linux的时候,你也会寻找一个在Linux相当于任务管理器的一个东西。一个Linux使用专家更喜欢使用命令行的方式查找进程和消耗的内存等等,但是你不用必须

解决Zabbix中文监控服务器图形图表显示乱码 解决Zabbix中文监控服务器图形图表显示乱码 Jul 31, 2024 pm 02:10 PM

zabbix对中文的支持不是很好,但为了管理方面有时候我们还是会选择中文,在zabbix监控的web界面,图形图标下面的中文会显示一个个小方块,这样是不正确的,需要下载字体。例如“微软雅黑”,“微软雅黑.ttf”命名为“msyh.ttf”,将下载的字体上传到/zabbix/fonts/字体下修改/zabbix/include/defines.inc.php文件中的两处define('ZBX_GRAPH_FONT_NAME','DejaVuSans');define('ZBX_FONT_NAME'

7个方法帮你查看Linux用户的注册日期 7个方法帮你查看Linux用户的注册日期 Aug 24, 2024 am 07:31 AM

你知道吗,如何在Linux系统上查看帐户的创建日期?如果知道,那么有些什么办法。你成功了么?如果是的话,该怎么做?基本上Linux系统不会跟踪这些信息,因此,获取这些信息的替代方法是什么?你可能会问为什么我要查看这个?是的,在某些情况下,你可能需要查看这些信息,那时就会对你会有帮助。可以使用以下7种方法进行验证。使用/var/log/secure使用aureport工具使用.bash_logout使用chage命令使用useradd命令使用passwd命令使用last命令方式1:使用/var/l

5分钟教你添加字体到Fedora 5分钟教你添加字体到Fedora Jul 23, 2024 am 09:45 AM

全系统安装如果你在系统范围内安装字体,那么它可以让所有用户使用。此方式的最佳方法是使用官方软件库中的RPM软件包。开始前打开FedoraWorkstation中的“Software”工具,或者其他使用官方仓库的工具。选择横栏中选择“Add-ons”类别。接着在该类别中选择“Fonts”。你会看到类似于下面截图中的可用字体:当你选择一种字体时,会出现一些细节。根据几种情况,你可能能够预览字体的一些示例文本。点击“Install”按钮将其添加到你的系统。根据系统速度和网络带宽,完成此过程可能需要一些

如果linux系统下WPS缺失字体导致文件乱码该怎么办? 如果linux系统下WPS缺失字体导致文件乱码该怎么办? Jul 31, 2024 am 12:41 AM

1、从网上找到wingdings、wingdings2、wingdings3、Webdings、MTExtra这些字体2、进入主文件夹,按Ctrl+h键(显示隐藏文件),查看有没有.fonts文件夹,如果没有就创建一个3、把下载下来的wingdings、wingdings2、wingdings3、Webdings、MTExtra这些字体,复制到主文件夹下的.fonts文件夹里,再去启动wps看看还有没有“系统缺失字体……”提醒对话框,没有就成功了!  注意事项:wingdings、wingdin

Centos 7安装配置NTP网络时间同步服务器 Centos 7安装配置NTP网络时间同步服务器 Aug 05, 2024 pm 10:35 PM

实验环境:OS:LinuxCentos7.4x86_641.查看当前服务器时区&列出时区并设置时区(如已是正确时区,请略过):#timedatectl#timedatectllist-timezones#timedatectlset-timezoneAsia/Shanghai2.时间时区概念理解:GMT、UTC、CST、DSTUTC:整个地球分为二十四时区,每个时区都有自己的本地时间,在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC:UniversalTim

如何使用一根网线让两台ubuntu主机联网 如何使用一根网线让两台ubuntu主机联网 Aug 07, 2024 pm 01:39 PM

如何使用一根网线让两台ubuntu主机联网1、准备主机A:ubuntu16.04主机B:ubuntu16.042、主机A有两个网卡,一个接外网,一个与主机B相接。使用命令iwconfig可以查看主机所有网卡。如上图笔者的A主机(笔记本)上的网卡有:wlp2s0:这个是无线网卡。enp1s0:有线网卡,与B主机相连的网卡。其它与我们无关,无需关心。3、配置A的静态IP编辑文件#vim/etc/network/interfaces为接口enp1s0配置静态IP地址,如下图(其中#==========

折腾!在树莓派上运行DOS 折腾!在树莓派上运行DOS Jul 19, 2024 pm 05:23 PM

不同的CPU架构意味着在树莓派上运行DOS并非唾手可得,但其实也没多麻烦。FreeDOS对大家来说也许并不陌生。它是一个完整、免费并且对DOS兼容良好的操作系统,它可以运行一些比较老旧的DOS游戏或者商用软件,也可以开发嵌入式的应用。只要在MS-DOS上能够运行的程序,在FreeDOS上都可以运行。作为FreeDOS的发起者和项目协调人员,很多用户会把我作为内行人士进行发问。而我最常被问到的问题是:“FreeDOS可以在树莓派上运行吗?”这个问题并不令人意外。毕竟Linux在树莓派上能够很好地运

See all articles