93 处理内存的命令(极客)

Linux 命令行工具之 top 命令
实时显示正在执行进程的 CPU 使用率、内存使用率以及系统负载等信息。

通过 top -Hp pid 查看具体线程使用系统资源

Linux 命令行工具之 vmstat 命令

vmstat 是一款指定采样周期和次数的功能性监测工具,我们可以看到,它不仅可以统计内存的使用情况,还可以观测到 CPU 的使用率、swap 的使用情况。
在这里插入图片描述
r:等待运行的进程数;b:处于非中断睡眠状态的进程数;swpd:虚拟内存使用情况;free:空闲的内存;buff:用来作为缓冲的内存数;si:从磁盘交换到内存的交换页数量;so:从内存交换到磁盘的交换页数量;bi:发送到块设备的块数;bo:从块设备接收到的块数;in:每秒中断数;cs:每秒上下文切换次数;us:用户 CPU 使用时间;sy:内核 CPU 系统使用时间;id:空闲时间;wa:等待 I/O 时间;st:运行虚拟机窃取的时间。

JDK 工具之 jstat 命令
jstat 可以监测 Java 应用程序的实时运行情况,包括堆内存信息以及垃圾回收信息。我们可以运行 jstat -help 查看一些关键参数信息。
jstat -option 查看 jstat 有有哪些操作。

-class:显示 ClassLoad 的相关信息;-compiler:显示 JIT 编译的相关信息;-gc:显示和 gc 相关的堆信息;-gccapacity:显示各个代的容量以及使用情况;-gcmetacapacity:显示 Metaspace 的大小;-gcnew:显示新生代信息;-gcnewcapacity:显示新生代大小和使用情况;-gcold:显示老年代和永久代的信息;-gcoldcapacity :显示老年代的大小;-gcutil:显示垃圾收集信息;-gccause:显示垃圾回收的相关信息(通 -gcutil),同时显示最后一次或当前正在发生的垃圾回收的诱因;-printcompilation:输出 JIT 编译的方法信息。

举例:
jstat -gc pid 查看堆内存的使用情况。

S0C:年轻代中 To Survivor 的容量(单位 KB);S1C:年轻代中 From Survivor 的容量(单位 KB);S0U:年轻代中 To Survivor 目前已使用空间(单位 KB);S1U:年轻代中 From Survivor 目前已使用空间(单位 KB);EC:年轻代中 Eden 的容量(单位 KB);EU:年轻代中 Eden 目前已使用空间(单位 KB);OC:Old 代的容量(单位 KB);OU:Old 代目前已使用空间(单位 KB);MC:Metaspace 的容量(单位 KB);MU:Metaspace 目前已使用空间(单位 KB);YGC:从应用程序启动到采样时年轻代中 gc 次数;YGCT:从应用程序启动到采样时年轻代中 gc 所用时间 (s);FGC:从应用程序启动到采样时 old 代(全 gc)gc 次数;FGCT:从应用程序启动到采样时 old 代(全 gc)gc 所用时间 (s);GCT:从应用程序启动到采样时 gc 用的总时间 (s)。

jstack pid 命令查看线程的堆栈信息,通常会结合 top -Hp pid 或 pidstat -p pid -t 一起查看具体线程的状态,也经常用来排查一些死锁的异常。每个线程堆栈的信息中,都可以查看到线程 ID、线程的状态(wait、sleep、running 等状态)以及是否持有锁等。

常用的监控和故障处理命令,有以下几个:
jps (JVM Process Status Tool):用于显示指定系统内所有的HotSpot虚拟机进程;

jstat (JVM statistics Monitoring):用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据;

jmap (JVM Memory Map):用于生成 heap dump 文件,如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现 OOM 的时候自动生成 dump 文件;

jhat (JVM Heap Analysis Tool):该命令通常与 jmap 搭配使用,用来分析 jmap 生成的 dump 文件,jhat 内置了一个微型的HTTP/HTML服务器,生成 dump 的分析结果后,可以在浏览器中查看;

jstack (Java Virtual Machine Stack Trace):用于生成 Java 虚拟机当前时刻的线程快照;

jinfo (JVM Configuration info):用于实时查看和调整后的虚拟机运行参数;
下面一起来看看相关命令的使用。

2.1、jps

jps 用于显示指定系统内所有的HotSpot虚拟机进程。
命令的使用格式如下。(其中[options]、[hostid]参数为非必填)

jps [options] [hostid]

options 参数详解:
-l:输出主类全名或jar路径
-q:只输出LVMID
-m:输出JVM启动时传递给 main() 的参数
-v:输出JVM启动时显示指定的JVM参数

在操作系统终端输入如下命令,即可查看 Java 相关的服务进程,示例如下。

$ jps -l -m
6628 sun.tools.jps.Jps -l -m
20094 springboot-example-web.jar --server.port=80

不带参数的显示结果。

$ jps
7669 Jps
20094 jar

左边是进程号,右边是 Java 服务名称。

2.2、jstat

jstat 用于监视虚拟机运行时状态信息的命令,它可以显示出虚拟机进程中的类装载、内存、垃圾收集、JIT 编译等运行数据。
命令的使用格式如下。

jstat [option] LVMID [interval] [count]

各个参数详解:
option:操作参数
LVMID:本地虚拟机进程ID
interval:连续输出的时间间隔
count:连续输出的次数

option 参数内容详解!
2.2.1、示例参数:class

-class参数用于监视类装载、卸载数量、总空间以及耗费的时间。
在操作系统终端输入如下命令,即可查看相关信息,示例如下。

$ jstat -class 20094
Loaded  Bytes  Unloaded  Bytes     Time
 12988 23508.0        0     0.0      30.21

各个参数解读如下:
Loaded : 加载class的数量
Bytes : class字节大小
Unloaded : 未加载class的数量
Bytes : 未加载class的字节大小
Time : 加载时间

2.2.2、示例参数:compiler

-compiler参数用于输出 JIT 编译过的方法数量耗时等。
在操作系统终端输入如下命令,即可查看相关信息,示例如下。

$ jstat -compiler 20094
Compiled Failed Invalid   Time   FailedType FailedMethod
   14524      5       0    43.33          1 org/springframework/core/annotation/AnnotationsScanner processMethodHierarchy

各个参数解读如下:
Compiled : 编译数量
Failed : 编译失败数量
Invalid : 无效数量
Time : 编译耗时
FailedType : 失败类型
FailedMethod : 失败方法的全限定名

2.2.3、示例参数:gc

-gc参数用于垃圾回收堆的行为统计,属于常用命令。
在操作系统终端输入如下命令,即可查看相关信息,示例如下。

$ jstat -gc 20094
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
18432.0 18944.0  0.0   10133.7 281088.0 197255.5  139776.0   55324.5   70420.0 66352.5 9020.0 8405.8     25    0.599   3      0.673    1.273

其中 C 表示 Capacity 总容量,U 表示 Used 已使用的容量。
各个参数解读如下:
S0C:survivor0区的总容量
S1C:survivor1区的总容量
S0U:survivor0区已使用的容量
S1U:survivor1区已使用的容量
EC:Eden区的总容量
EU:Eden区已使用的容量
OC:Old区的总容量
OU:Old区已使用的容量
MC:泛指Metaspace区的总容量
MU:泛指Metaspace区已使用的容量
CCSC:泛指类压缩空间(Compressed class space,属于Metaspace区的一部分)的总容量
CCSU:泛指类压缩空间(Compressed class space,属于Metaspace区的一部分)已使用的容量
YGC:新生代GC次数
YGCT:新生代GC总耗时
FGC:Full GC次数
FGCT:Full GC总耗时
GCT:GC总耗时

还可以通过如下方式,来详细的监控 gc 回收情况,示例如下。

jstat -gc 20094 2000 20

以上的命令表示每隔 2000ms 输出进程号为 7140 的 gc 回收情况,一共输出 20次。

2.2.4、示例参数:gccapacity

-gccapacity参数和-gc一样,不过还会输出 Java 堆各区域使用到的最大、最小空间。
在操作系统终端输入如下命令,即可查看相关信息,示例如下。

$ jstat -gccapacity 20094
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
 43520.0 698880.0 355840.0 18432.0 18944.0 281088.0    87552.0  1398272.0   139776.0   139776.0      0.0 1110016.0  70420.0      0.0 1048576.0   9020.0     25     3

各个参数解读如下:
NGCMN : 新生代占用的最小空间
NGCMX : 新生代占用的最大空间
NGC:当前新生代的容量
OGCMN : 老年代占用的最小空间
OGCMX : 老年代占用的最大空间
OGC:当前老年代的容量
MCMN : Metaspace区占用的最小空间
MCMX : Metaspace区占用的最大空间
MC:当前Metaspace区的容量
CCSMN : Compressed class space区占用的最小空间
CCSMX : Compressed class space区占用的最大空间
CCSC:当前Compressed class space区的容量
2.2.5、示例参数:gcutil

-gcutil参数同-gc,不过输出的是已使用空间占总空间的百分比。
在操作系统终端输入如下命令,即可查看相关信息,示例如下。

jstat -gcutil 20094
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00  53.49  91.96  39.58  94.22  93.19     25    0.599     3    0.673    1.273

2.2.6、示例参数:gccause

-gccause参数用于垃圾收集统计概述(同-gcutil),附加最近两次垃圾回收事件的原因。
在操作系统终端输入如下命令,即可查看相关信息,示例如下。

$ jstat -gccause 20094
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT    LGCC                 GCC
  0.00  53.49  92.65  39.58  94.22  93.19     25    0.599     3    0.673    1.273 Allocation Failure   No GC

各个参数解读如下:
LGCC:最近垃圾回收的原因
GCC:当前垃圾回收的原因
2.2.7、示例参数:gcnew

-gcnew参数用于统计新生代的行为。
在操作系统终端输入如下命令,即可查看相关信息,示例如下。

$ jstat -gcnew 20094
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
18432.0 18944.0    0.0 10133.7  2  15 18432.0 281088.0 265231.7     25    0.599

各个参数解读如下:
TT:Tenuring threshold(提升阈值)
MTT:最大的tenuring threshold
DSS:survivor区域大小 (KB)
2.2.8、示例参数:gcnewcapacity

-gcnewcapacity参数用于新生代与其相应的内存空间的统计。
在操作系统终端输入如下命令,即可查看相关信息,示例如下。

$ jstat -gcnewcapacity 20094
 NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC
   43520.0   698880.0   355840.0 232960.0  18432.0 232960.0  18944.0   697856.0   281088.0    25     3

各个参数解读如下:
S0CMX:最大的S0空间 (KB)
S0C:当前S0区的容量 (KB)
ECMX:最大eden空间 (KB)
EC:当前eden区的容量 (KB)
2.2.9、示例参数:gcold

-gcold参数用于统计老年代的行为。
在操作系统终端输入如下命令,即可查看相关信息,示例如下。

$ jstat -gcold 20094
   MC       MU      CCSC     CCSU       OC          OU       YGC    FGC    FGCT     GCT
 70420.0  66352.5   9020.0   8405.8    139776.0     55324.5     25     3    0.673    1.273

2.2.11、示例参数:gcmetacapacity

-gcmetacapacity参数用于统计元空间的大小和空间。
在操作系统终端输入如下命令,即可查看相关信息,示例如下。

$ jstat -gcmetacapacity 20094
   MCMN       MCMX        MC       CCSMN      CCSMX       CCSC     YGC   FGC    FGCT     GCT
       0.0  1112064.0    72468.0        0.0  1048576.0     9276.0    26     3    0.673    1.513

2.2.12、示例参数:printcompilation

-printcompilation参数用于HotSpot编译方法统计。
在操作系统终端输入如下命令,即可查看相关信息,示例如下。

$ jstat -printcompilation 20094
Compiled  Size  Type Method
    4387    123    1 org/apache/catalina/core/StandardContext getLoader

各个参数解读如下:
Compiled:被执行的编译任务的数量
Size:方法字节码的字节数
Type:编译类型
Method:编译方法的类名和方法名。类名使用”/” 代替 “.” 作为空间分隔符. 方法名是给出类的方法名

2.3、jmap

jmap 用于生成 heap dump 文件,如果不使用这个命令,还可以使用-XX:+HeapDumpOnOutOfMemoryError参数来让虚拟机出现 OOM 的时候自动生成 dump 文件。
jmap 不仅可以生成 dump 文件,还可以查询finalize执行队列、Java 堆的详细信息,如当前使用率、当前使用的是哪种收集器等。
命令的使用格式如下。

jmap [option] LVMID

option 参数详解:
dump : 生成堆转储快照
finalizerinfo : 显示在F-Queue队列等待Finalizer线程执行finalizer方法的对象
heap : 显示Java堆详细信息
histo : 显示堆中对象的统计信息
clstats : 显示类加载器信息
F : 当-dump没有响应时,强制生成dump快照
option 参数使用如下。

2.3.1、示例参数:dump

-dump参数用于生成堆内存快照文件。
命令的使用格式如下。

-dump::live,format=b,file=<filename> pid

option 参数详解:
live : 指的是活着的对象
format : 表示指定的输出格式
file : 表示指定的文件名
pid : 表示 Java 服务进程ID
在操作系统终端输入如下命令,即可查看相关信息,示例如下。

jmap -dump:live,format=b,file=dump.hprof 20094
Dumping heap to /xxx/dump.hprof ...
Heap dump file created

2.3.4、示例参数:histo

-histo参数用于打印堆的对象统计,包括对象数、内存大小等等。也可以带上live参数,比如-histo[:live]表示只打印存活的对象,如果不加就是查询全部对象。
在操作系统终端输入如下命令,即可查看相关信息,部分示例如下。

$ jmap -histo 20094

 num     #instances         #bytes  class name
----------------------------------------------
   1:         61030        8438336  [C
   2:          9918        2169120  [I
   3:         59981        1439544  java.lang.String
   4:          5112        1331136  [B
   5:         13532        1190816  java.lang.reflect.Method
   6:         10071        1125192  java.lang.Class
   7:         32196        1030272  java.util.concurrent.ConcurrentHashMap$Node
   8:          9593         572904  [Ljava.lang.Object;
   9:         15416         493312  java.util.HashMap$Node
  10:         12115         484600  java.util.LinkedHashMap$Entry
  ...

其中class name列指的是对象类型,部分内容详解:
B:byte C:char D:double F:float I:int J:long Z:boolean [I:表示 int[]的数组 [L+类名:其他数组对象

2.3.5、示例参数:clstats

-clstats参数用于打印类加载器信息。
在操作系统终端输入如下命令,即可查看相关信息,部分示例如下。

$ jmap -clstats 20094
Attaching to process ID 20094, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.202-b08

2.5、jstack

jstack 命令用于生成 Java 虚拟机当前时刻的线程快照。
线程快照是当前 Java 虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
命令的使用格式如下。

jstack [option] LVMID

option 参数详解:
-F : 当正常输出请求不被响应时,强制输出线程堆栈
-l : 除堆栈外,显示关于锁的附加信息
-m : 如果调用到本地方法的话,可以显示C/C++的堆栈
在操作系统终端输入如下命令,即可查看相关信息,部分示例如下。

$ jstack -F 20094
Attaching to process ID 20094, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.202-b08
Deadlock Detection:

No deadlocks found.

Thread 15138: (state = BLOCKED)


Thread 30966: (state = BLOCKED)
 - sun.misc.Unsafe.park(boolean, long) @bci=0 (Compiled frame; information may be imprecise)
 - java.util.concurrent.locks.LockSupport.park(java.lang.Object) @bci=14, line=175 (Compiled frame)
 - java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await() @bci=42, line=2039 (Compiled frame)
 - java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=100, line=1088 (Compiled frame)
 - java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() @bci=1, line=809 (Compiled frame)
 - java.util.concurrent.ThreadPoolExecutor.getTask() @bci=149, line=1074 (Compiled frame)
 - java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) @bci=26, line=1134 (Interpreted frame)
 - java.util.concurrent.ThreadPoolExecutor$Worker.run() @bci=5, line=624 (Interpreted frame)
 - java.lang.Thread.run() @bci=11, line=748 (Interpreted frame)
...

2.6、jinfo

jinfo 命令用于实时查看和调整虚拟机运行参数。
命令的使用格式如下。

jinfo [option] [args] LVMID

option 参数详解:
-flag:输出指定 args 参数的值
-flags:不需要 args 参数,输出所有 JVM 参数的值
-sysprops:输出系统属性,等同于 System.getProperties()
在操作系统终端输入如下命令,即可查看相关信息,部分示例如下。

$ jinfo -flags 20094
Attaching to process ID 20094, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.202-b08
Non-default VM flags: -XX:CICompilerCount=2 -XX:InitialHeapSize=29360128 -XX:MaxHeapSize=461373440 -XX:MaxNewSize=153747456 -XX:MinHeapDeltaBytes=196608 -XX:NewSize=9764864 -XX:OldSize=19595264 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps 
Command line:  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值