java中如何使用JVM命令来实现服务器故障排查
本篇文章就给大家介绍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+RESQ:
RES
= (Resident size (kb)) 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATAT:
SHR
= (Shared Mem size (kb)) 共享内存大小,单位kbW:
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视频教程!
Atas ialah kandungan terperinci java中如何使用JVM命令来实现服务器故障排查. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Terdapat banyak soalan yang sering ditanya oleh pemula Linux, "Adakah Linux mempunyai Pengurus Tugas?", "Bagaimana untuk membuka Pengurus Tugas pada Linux Pengguna dari Windows tahu bahawa Pengurus Tugas sangat berguna?" Anda boleh membuka Pengurus Tugas dengan menekan Ctrl+Alt+Del dalam Windows. Pengurus tugas ini menunjukkan kepada anda semua proses yang sedang berjalan dan memori yang mereka gunakan, dan anda boleh memilih dan mematikan proses daripada program pengurus tugas. Apabila anda mula-mula menggunakan Linux, anda juga akan mencari sesuatu yang setara dengan pengurus tugas di Linux. Pakar Linux lebih suka menggunakan baris arahan untuk mencari proses, penggunaan memori, dll., tetapi anda tidak perlu melakukannya

Sokongan Zabbix untuk bahasa Cina tidak begitu baik, tetapi kadangkala kami masih memilih bahasa Cina untuk tujuan pengurusan Dalam antara muka web yang dipantau oleh Zabbix, orang Cina di bawah ikon grafik akan memaparkan petak kecil. Ini tidak betul dan memerlukan muat turun fon. Contohnya, "Microsoft Yahei", "Microsoft Yahei.ttf" dinamakan "msyh.ttf", muat naik fon yang dimuat turun ke /zabbix/fonts/fonts dan ubah suai dua aksara dalam /zabbix/include/defines.inc.php fail di define('ZBX_GRAPH_FONT_NAME','DejaVuSans');define('ZBX_FONT_NAME'

Tahukah anda, bagaimana untuk menyemak tarikh penciptaan akaun pada sistem Linux? Jika anda tahu, apa yang anda boleh lakukan? Adakah anda berjaya? Jika ya, bagaimana untuk melakukannya? Pada asasnya sistem Linux tidak menjejaki maklumat ini, jadi apakah cara alternatif untuk mendapatkan maklumat ini? Anda mungkin bertanya mengapa saya menyemak ini? Ya, terdapat situasi di mana anda mungkin perlu menyemak maklumat ini dan ia akan membantu anda pada masa itu. Anda boleh menggunakan 7 kaedah berikut untuk mengesahkan. Gunakan /var/log/secure Gunakan alat aureport Gunakan .bash_logout Gunakan arahan chage Gunakan arahan useradd Gunakan arahan passwd Gunakan arahan terakhir Kaedah 1: Gunakan /var/l

Pemasangan seluruh sistem Jika anda memasang fon seluruh sistem, ia akan tersedia kepada semua pengguna. Cara terbaik untuk melakukan ini ialah menggunakan pakej RPM daripada repositori perisian rasmi. Sebelum memulakan, buka alat "Perisian" dalam Fedora Workstation, atau alat lain menggunakan repositori rasmi. Pilih kategori "Tambahan" dalam bar pilihan. Kemudian pilih "Fon" dalam kategori. Anda akan melihat fon yang tersedia serupa dengan fon dalam tangkapan skrin di bawah: Apabila anda memilih fon, beberapa butiran akan muncul. Bergantung pada beberapa senario, anda mungkin boleh melihat beberapa contoh teks untuk fon. Klik butang "Pasang" untuk menambahkannya pada sistem anda. Bergantung pada kelajuan sistem dan lebar jalur rangkaian, proses ini mungkin mengambil sedikit masa untuk diselesaikan

1. Cari font wingdings, wingdings2, wingdings3, Webdings, dan MTExtra dari Internet 2. Masukkan folder utama, tekan Ctrl+h (tunjukkan fail tersembunyi), dan semak jika terdapat folder .fonts satu. 3. Salin fon yang dimuat turun seperti wingdings, wingdings2, wingdings3, Webdings, dan MTExtra ke folder .fonts dalam folder utama Kemudian mulakan wps untuk melihat jika masih terdapat dialog peringatan "System missing font kotak. Jika tidak, hanya Kejayaan Nota: wingdings, wingdin

Persekitaran percubaan: OS: LinuxCentos7.4x86_641 Lihat zon waktu pelayan semasa & senaraikan zon waktu dan tetapkan zon waktu (jika sudah menjadi zon waktu yang betul, sila langkau): #timedatectl#timedatectllist-timezones#timedatectlset-timezoneAsia. /Shanghai2 Memahami konsep zon waktu: GMT, UTC, CST, DSTUTC: Seluruh bumi dibahagikan kepada dua puluh empat zon waktu Setiap zon waktu mempunyai waktu tempatan sendiri, demi penyatuan. masa bersatu digunakan, dipanggil Masa Selaras Sejagat (UTC :UniversalTim).

Cara menggunakan satu kabel rangkaian untuk menyambungkan dua hos ubuntu ke Internet 1. Sediakan hos A: ubuntu16.04 dan hos B: ubuntu16.042 Hos A mempunyai dua kad rangkaian, satu disambungkan ke rangkaian luaran dan satu lagi disambungkan menjadi tuan rumah B. Gunakan arahan iwconfig untuk melihat semua kad rangkaian pada hos. Seperti yang ditunjukkan di atas, kad rangkaian pada hos A pengarang (komputer riba) ialah: wlp2s0: Ini ialah kad rangkaian wayarles. enp1s0: kad rangkaian berwayar, kad rangkaian yang disambungkan ke hos B. Selebihnya tiada kaitan dengan kita, tidak perlu ambil peduli. 3. Konfigurasikan IP statik A. Edit fail #vim/etc/network/interfaces untuk mengkonfigurasi alamat IP statik untuk antara muka enp1s0, seperti ditunjukkan di bawah (di mana #==========

Seni bina CPU yang berbeza bermakna menjalankan DOS pada Raspberry Pi tidak mudah, tetapi ia tidak banyak masalah. FreeDOS mungkin biasa kepada semua orang. Ia adalah sistem pengendalian yang lengkap, percuma dan serasi untuk DOS. Ia boleh menjalankan beberapa permainan DOS lama atau perisian komersial, dan juga boleh membangunkan aplikasi terbenam. Selagi program boleh berjalan pada MS-DOS, ia boleh berjalan pada FreeDOS. Sebagai pemula dan penyelaras projek FreeDOS, ramai pengguna akan bertanya kepada saya soalan sebagai orang dalam. Soalan yang paling kerap saya tanya ialah: "Bolehkah FreeDOS dijalankan pada Raspberry Pi?" Lagipun, Linux berjalan dengan baik pada Raspberry Pi
