每5秒输出一次服务器状态,关注CPU上下文切换,Context Switch , CS
打开Java visualVm,启动一个Junit测试,即可看到pid
然后通过cmd进入到jdk bin目录执行 jstack即可
ps -ef 查看所有进程
ps -ef | grep java 查看Java进程
查看正在运行的java程序的扩展参数,支持在运行时修改部分参数
基本用法:-flag option pid
jinfo -flag name pid | 打印指定jvm参数 |
---|---|
jinfo -flag +/- name pid | 修改jvm的布尔值 |
jinfo -flag name=value pid | 修改jvm参数 |
jinfo -flags pid | 打印所有jvm参数 |
1.java -XX:+PrintFlagsFinal -version | grep manageable
manageable 代表可以修改
打开GC日志,需先执行jinfo -flag +PrintGCDetails,再执行jinfo -flag +PrintGC
打开PrintGCDetails
$ jinfo -flag PrintGCDetails 11332
-XX:-PrintGCDetails
$ jinfo -flag +PrintGCDetails 11332
-XX:+PrintGCDetails
内存分析,用于生成heap dump文件,如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError,出现OOM的时候自动生成dump文件,
还可以查询finalize执行队列、Java堆和永久代的详细信息,如当前使用率、当前使用的是哪种收集器
jmap -dump:live,format=b,file=/home/logs/jmap.bin pid | 生成java堆快照,live只dump活跃对象 |
---|---|
jmap -heap pid | 显示java堆详细信息,包括垃圾收集器,参数配置 |
jmap -finalizerinfo pid | 显示F-Queue中等待执行finalizer线程执行finalize方法的对象,只Linux生效 |
jmap -histo[:live] pid | 打印当前java堆中各个对象的数量、大小 |
jmap -permstat pid | 打印java堆永久代的信息,只Linux |
-F | 强制生成dump |
jmap -dump:live 以及 jmap -histo:live都会触发Full GC
通过jmap和jvm之间进行通信,有两种实现方式:attach 和 SA
在JVM中,有一个叫”Attach Listener”的线程,专门负责监听attach的请求,并执行对应的操作,比如jmap -dump和jmap -histo
jmap -heap 、-permstat、-finalizerinfo则是SA方式,或者加了-F,jmap -histo -F
SA方式,和attach方式不同的是,相关的主要逻辑都在SA中实现,从JVM中获取数据。
attach API是“in-process”,而SA是“out-of-process”的,简单来说,in-process就是调试器(或类似的功能)运行在目标进程内
而out-of-process是调试器跟目标进程是独立的两个进程,通过进程间通信来实现调试
以jstack为例,默认参数下它用的是attach API
jstack 默认 —— attach API —— in-process 运行在目标进程内 ,优点速度快;缺点容易影响目标进程
jstack -F —— SA —— out-of-process 通过进程间通信 ,优点:调试功能与调试目标之间有良好的隔离,即便调试功能自身有问题也不会 影响到目标进程;缺点速度慢
用于收集hotspot各方面运行数据,可以显示类加载,GC情况,内存等
用法:jstat option pid interval(s/ms) count
例如 jstat -gc 8088 2s 10,每2秒查询一次,查询10次
-gc pid | 显示gc相关的堆信息,查看gc的次数、时间,各个区大小 |
---|---|
-compiler pid | 显示jit编译过的方法 |
-gcutil pid | 与gc基本相同,突出使用空间百分比 |
-gccapacity pid | 突出各个区最大最小空间 |
-gcmetacapacity | 显示metaspace的大小 |
-gcnew | 新生代信息 |
-gcoldcapacity | 老生代使用的最大和最小空间 |
-gccause | 显示最后一次或当前正在发生的垃圾回收的诱因 |
S | survivor(幸存区), +C总容量,+U 使用多少 |
---|---|
YGC | 年轻代中gc次数,+T 时间 |
LGCC | 上一次GC原因 |
MCMN | metaspace中初始化(最小)的大小,-X最大,-MN,-MX |
CCSC | 当前压缩类空间大小 |
jstat -gccapacity 34
方法区的大小,并没等于-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m
生成jvm当前时刻线程快照
用法:jstack -l pid
-F 强制输出,-l 显示锁附加信息,-m 如果调用本地方法,显示c++堆栈,但如果Java方法被编译过,则看不到(然而大部分经常访问的Java方法其实都被编译过)
jps 命令类似与 linux 的 ps 命令,但是它只列出系统中所有的 Java 应用程序。 通过 jps 命令可以方便地查看 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息
用法:jps
-l 输出全名,-v 输出jvm启动参数,-m 输出启动时传给main的参数
$ jps
34 Bootstrap
1999 Jps
可以导出堆、查看Java进程、导出线程信息、执行GC、还可以进行采样分析
jcmd -l = jcmd = jps 查看所有的进程列表信息
需要开启 -XX:NativeMemoryTracking=detail
jcmd pid VM.native_memory detail -- 查看详细内存信息
sudo -u admin /java/bin/jcmd 32 VM.native_memory baseline --建立基线
sudo -u admin /java/bin/jcmd 32 VM.native_memory detail.diff -- 和基线内存对比
分析jmap生成的dump文件,不过不推荐使用
用法:jhat jmap.dump
用法:pmap -x pid
pmap -x 39 |head -15|sort -r -k2
perf record -g -p pid 开启监控栈函数调用,手动结束,生成perf.data
执行perf report -i perf.data查看报告
可以动态地跟踪java运行程序,将跟踪字节码注入到运行类中,对运行代码侵入较小,对性能上的影响可以忽略不计
yum install net-tools
ifconfig
find / -name '*java*'
pstree -p 25922 |wc -l
205
ps -hH -p 5447 | wc -l
432
降序 加 -r:jmap -histo:live 9928 | sort -k2 -r |head -10
查看内存 free -h
total:内存总大小。
used:使用了多少内存。
free:除了buff/cache剩余了多少内存。
shared:共享内存。
buff/cache:缓冲、缓存区内存数。
available:真实剩余的可用内存数。
关系:total = used + free + buff/cache
关系:available 包含 free 和 buff/cache 剩余部分,则是真实剩余内存。
r 列表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu。
b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。
详解:
第一行: 当前时间,336 days - 运行了336天 ,2 users - 当前2个用户,load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况
第二行:tasks - 系统当前有133个进程,1个运行中,132个休眠,zombie - 僵尸状态
第三行:CPU相关
us — 用户空间占用CPU的百分比。
sy — 内核空间占用CPU的百分比。
ni — 改变过优先级的进程占用CPU的百分比
id — 空闲CPU百分比
wa — IO等待占用CPU的百分比
hi — 硬中断(Hardware IRQ)占用CPU的百分比
si — 软中断(Software Interrupts)占用CPU的百分比
第四行:内存状态
total — 物理内存总量
used — 使用中的内存总量
free — 空闲内存总量
buffers — 缓存的内存量
第五行:swap交换分区
total — 交换区总量
used — 使用的交换区总量
free — 空闲交换区总量
avail Mem — 可用交换取总量
第七行:
依次对应:
PID — 进程id
USER — 进程所有者
PR — 进程优先级
NI — nice值。负值表示高优先级,正值表示低优先级
VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR — 共享内存大小,单位kb
S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程
%CPU — 上次更新到现在的CPU时间占用百分比
%MEM — 进程使用的物理内存百分比
TIME+ — 进程使用的CPU时间总计,单位1/100秒
需要注意的是:第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少。
使用技巧:
输入 b ,running状态加亮
输入x 排序加亮
shift+> 移动高亮
VSZ–进程的虚拟大小
RSS–驻留集的大小,可以理解为内存中页的数量
yum -y install iotop
sar yum -y install sysstat
sar -q 2 3
runq-sz:运行队列的长度(等待运行的进程数)
plist-sz:进程列表中进程(processes)和线程(threads)的数量
ldavg-1:最后1分钟的系统平均负载(Systemload average)
ldavg-5:过去5分钟的系统平均负载
ldavg-15:过去15分钟的系统平均负载
sar -r 内存使用统计
%memused:物理内存使用率,这个值是kbmemused和内存总量(不包括swap)的一个百分比
sar 2 5 每隔几秒输出几次
#%user 用户态的CPU使用统计
#%nice 更改过优先级的进程的CPU使用统计
#%iowait CPU等待IO数据的百分比
#%steal 虚拟机的vCPU占用的物理CPU的百分比
#%idle 空闲的CPU百分比
【54% 的线程正处于休眠态】–>
这可能是他们都在等一个抢手的资源,也可能是正常的,他们是需要等待某个时机才能继续做,可以通过左侧’休眠态线程’看到更多的信息.
【54% 的线程正在等待一个没有被任何线程持有的监控对象】–>
很有可能是在进行垃圾回收,并阻塞了所有的监控对象’
jmap -heap pid
(sudo -u admin /java/bin ) jmap -histo:live 34 | head -10
继续通过 jmap -dump ,通过mat分析
https://blog.csdn.net/u011381576/article/details/79635867
https://www.cnblogs.com/yjd_hycf_space/p/7755633.html