讲师中心 微信公众号
AI工具推荐 视频效率加速

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

雨浩小哥_5503

雨浩小哥_5503

发布时间:2018-10-17 15:28:30

|

2686人浏览过

|

来源于博客园

转载

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

一、top(Linux命令)

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

 

系统信息(前五行):

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

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

        立即学习Java免费学习笔记(深入)”;

      • 多核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>) 任务标志,参考 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速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

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

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

相关专题

更多
bootstrap框架介绍
bootstrap框架介绍

本专题整合了bootstrap框架相关介绍,阅读专题下面的文章了解更多详细内容。

565

2026.03.18

bootstrap安装教程
bootstrap安装教程

本专题整合了bootstrap安装相关教程,阅读专题下面的文章了解更多详细操作教程。

159

2026.03.18

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

5099

2023.08.02

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2328

2023.11.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1518

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2204

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

5704

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

4729

2023.11.24

Buffalo框架零基础入门教程
Buffalo框架零基础入门教程

本专题整理Buffalo框架入门内容,涵盖Go环境准备、buffalo CLI安装、新项目生成、目录结构说明、dev热加载启动、数据库连接配置与常见报错排查,帮助新手按约定优于配置的思路跑通第一个Buffalo框架应用。

0

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
如何安装 Composer
如何安装 Composer

共1课时 | 180人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn