jvm常用命令

文章目录

    • vmstat 5
  • jvm相关
    • 在windows下查看Java 的pid
    • 查看pid
    • jinfo
    • jmap
      • jmap原理
    • jstat
    • jstack
    • jps
    • jcmd
    • jhat
    • pmap
    • JConsole
    • Java VisualVM
    • perf
    • btrace
  • Linux
    • 查询docker网卡
    • Linux基础操作
    • 查询线程数
    • 排序
    • CPU相关
      • vmstat 3 5 每隔3秒,输出5次
      • free
      • top
      • ps aux
    • Linux安装命令
      • sar
  • 实际分析
    • 堆外内存
  • 参考

vmstat 5

每5秒输出一次服务器状态,关注CPU上下文切换,Context Switch , CS
在这里插入图片描述

jvm相关

在windows下查看Java 的pid

打开Java visualVm,启动一个Junit测试,即可看到pid
然后通过cmd进入到jdk bin目录执行 jstack即可
jvm常用命令_第1张图片

jvm常用命令_第2张图片

查看pid

ps -ef 查看所有进程
ps -ef | grep java 查看Java进程

jinfo

查看正在运行的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
jvm常用命令_第3张图片
打开PrintGCDetails

$ jinfo -flag PrintGCDetails 11332
-XX:-PrintGCDetails 
$ jinfo -flag +PrintGCDetails 11332
-XX:+PrintGCDetails 

jmap

内存分析,用于生成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原理

通过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 通过进程间通信 ,优点:调试功能与调试目标之间有良好的隔离,即便调试功能自身有问题也不会 影响到目标进程;缺点速度慢

jstat

用于收集hotspot各方面运行数据,可以显示类加载,GC情况,内存等
用法:jstat option pid interval(s/ms) count
例如 jstat -gc 8088 2s 10,每2秒查询一次,查询10次

jstat用法示例
-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 -gc 34 2s 10
在这里插入图片描述

jstat -gccapacity 34
在这里插入图片描述

在这里插入图片描述

方法区的大小,并没等于-XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m
在这里插入图片描述

jstack

生成jvm当前时刻线程快照
用法:jstack -l pid
-F 强制输出,-l 显示锁附加信息,-m 如果调用本地方法,显示c++堆栈,但如果Java方法被编译过,则看不到(然而大部分经常访问的Java方法其实都被编译过)

jps

jps 命令类似与 linux 的 ps 命令,但是它只列出系统中所有的 Java 应用程序。 通过 jps 命令可以方便地查看 Java 进程的启动类、传入参数和 Java 虚拟机参数等信息
用法:jps
-l 输出全名,-v 输出jvm启动参数,-m 输出启动时传给main的参数

$ jps 
34 Bootstrap
1999 Jps

jcmd

可以导出堆、查看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   -- 和基线内存对比

jhat

分析jmap生成的dump文件,不过不推荐使用
用法:jhat jmap.dump

pmap

用法:pmap -x pid

pmap -x 39 |head -15|sort -r -k2

jvm常用命令_第4张图片

JConsole

jvm常用命令_第5张图片

Java VisualVM

jvm常用命令_第6张图片

perf

perf record -g -p pid 开启监控栈函数调用,手动结束,生成perf.data
执行perf report -i perf.data查看报告

btrace

可以动态地跟踪java运行程序,将跟踪字节码注入到运行类中,对运行代码侵入较小,对性能上的影响可以忽略不计

Linux

查询docker网卡

yum install net-tools
ifconfig

Linux基础操作

    • uptime 系统负载
    • sar yum -y install sysstat
  1. ll -Sl -h 从大到小排序
  2. yum install net-tools 安装软件(docker中)
  3. find / -type f -size +1G 找到大于1G的文件
  4. find / -name * gc * 模糊查询 根目录,无空格
 find / -name '*java*'
  1. pstree -p | wc -l 查询当前整个系统已用的线程或进程数;pstree -p 7368 | wc -l 加具体进程号,单个进程的线程
  2. grep -c ‘cpu[0-9][0-9]*’ /proc/stat 查看CPU核数

查询线程数

  1. pstree -p pid | wc -l
 pstree -p 25922 |wc -l  
 205
  1. cat /proc/pid/status
    jvm常用命令_第7张图片
  2. ps -hH -p pid | wc -l
 ps -hH -p 5447 | wc -l
 432

排序

排序 head -10,显示前10条,但是不排序jvm常用命令_第8张图片

sort -k2 k是第几个参数,按照从小到大排序
jvm常用命令_第9张图片

降序 加 -r:jmap -histo:live 9928 | sort -k2 -r |head -10
jvm常用命令_第10张图片

查看内存 free -h
在这里插入图片描述
total:内存总大小。
used:使用了多少内存。
free:除了buff/cache剩余了多少内存。
shared:共享内存。
buff/cache:缓冲、缓存区内存数。
available:真实剩余的可用内存数。
关系:total = used + free + buff/cache
关系:available 包含 free 和 buff/cache 剩余部分,则是真实剩余内存。

CPU相关

vmstat 3 5 每隔3秒,输出5次

重点关注swap
malljvm常用命令_第11张图片

jvm常用命令_第12张图片
jvm常用命令_第13张图片
在这里插入图片描述
r 列表示运行和等待cpu时间片的进程数,如果长期大于1,说明cpu不足,需要增加cpu。
b 列表示在等待资源的进程数,比如正在等待I/O、或者内存交换等。

jvm常用命令_第14张图片
jvm常用命令_第15张图片

free

free -h 系统自动选择合适的单位
在这里插入图片描述

  • 实际可用内存:buffers+cached+free
  • free -h -s 5 每5秒打印一次

top

详解:
第一行: 当前时间,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秒
jvm常用命令_第16张图片
需要注意的是:第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了

第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少。

使用技巧:
输入 b ,running状态加亮
输入x 排序加亮
shift+> 移动高亮

ps aux

VSZ–进程的虚拟大小
RSS–驻留集的大小,可以理解为内存中页的数量
jvm常用命令_第17张图片

Linux安装命令

  • yum -y install iotop

  • sar yum -y install sysstat

sar

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 每隔几秒输出几次

jvm常用命令_第18张图片
#%user 用户态的CPU使用统计
#%nice 更改过优先级的进程的CPU使用统计
#%iowait CPU等待IO数据的百分比
#%steal 虚拟机的vCPU占用的物理CPU的百分比
#%idle 空闲的CPU百分比

【54% 的线程正处于休眠态】–>
这可能是他们都在等一个抢手的资源,也可能是正常的,他们是需要等待某个时机才能继续做,可以通过左侧’休眠态线程’看到更多的信息.
【54% 的线程正在等待一个没有被任何线程持有的监控对象】–>
很有可能是在进行垃圾回收,并阻塞了所有的监控对象’

实际分析

堆外内存

top 显示实际占用7.6G
jvm常用命令_第19张图片

jmap -heap pid
jvm常用命令_第20张图片
(sudo -u admin /java/bin ) jmap -histo:live 34 | head -10
jvm常用命令_第21张图片
继续通过 jmap -dump ,通过mat分析

jmap -heap pid
jvm常用命令_第22张图片

参考

https://blog.csdn.net/u011381576/article/details/79635867
https://www.cnblogs.com/yjd_hycf_space/p/7755633.html

你可能感兴趣的:(jvm)