文章目录
jps获取Java进程号
进程号很重要,后面的命令都必须用这个进程id
# 一般在Linux中我们会使用通用命令来查询对应应用的pid
ps -ef | grep java
# 但其实安装了java后可以使用java自带的命令
jps
jmap查询堆内存使用情况
语法帮助
./jmap -h
Usage:
jmap [option] <pid>
(to connect to running process)
jmap [option] <executable <core>
(to connect to a core file)
jmap [option] [server_id@]<remote server IP or hostname>
(to connect to remote debug server)
where <option> is one of:
<none> to print same info as Solaris pmap
-heap to print java heap summary
-histo[:live] to print histogram of java object heap; if the "live"
suboption is specified, only count live objects
-clstats to print class loader statistics
-finalizerinfo to print information on objects awaiting finalization
-dump:<dump-options> to dump java heap in hprof binary format
dump-options:
live dump only live objects; if not specified,
all objects in the heap are dumped.
format=b binary format
file=<file> dump heap to <file>
Example: jmap -dump:live,format=b,file=heap.bin <pid>
-F force. Use with -dump:<dump-options> <pid> or -histo
to force a heap dump or histogram when <pid> does not
respond. The "live" suboption is not supported
in this mode.
-h | -help to print this help message
-J<flag> to pass <flag> directly to the runtime system
查看当前应用的堆信息概览
# <pid>为对应的java进程号
$ ./jmap -heap 2388
Attaching to process ID 2388, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0 ## 最小堆使用比例
MaxHeapFreeRatio = 100 ## 最大堆可用比例
MaxHeapSize = 4269801472 (4072.0MB) ## 最大堆空间大小
NewSize = 89128960 (85.0MB) ## 新生代分配大小
MaxNewSize = 1422917632 (1357.0MB) ## 最大新生代可分配大小
OldSize = 179306496 (171.0MB) ## 老年代大小
NewRatio = 2 ## 新生代和老年代的大小比例
SurvivorRatio = 8 ## 新生代Eden和Suivivor比例,即8:1:1
MetaspaceSize = 21807104 (20.796875MB) ## 元空间默认大小
CompressedClassSpaceSize = 1073741824 (1024.0MB) ##
MaxMetaspaceSize = 17592186044415 MB ## 最大元空间大小
G1HeapRegionSize = 0 (0.0MB) ## G1 堆区域大小
Heap Usage: ## 堆实际使用情况
PS Young Generation ## 新生代区域
Eden Space: ## 伊甸园区
capacity = 268435456 (256.0MB) ## 容量
used = 5368728 (5.120018005371094MB) ## 已使用
free = 263066728 (250.8799819946289MB) ## 未使用
2.0000070333480835% used ## 使用比例
From Space: ## Survivor from区
capacity = 11010048 (10.5MB)
used = 0 (0.0MB)
free = 11010048 (10.5MB)
0.0% used
To Space: ## Survivor To区)
capacity = 34603008 (33.0MB)
used = 0 (0.0MB)
free = 34603008 (33.0MB)
0.0% used
PS Old Generation ## 老年代情况
capacity = 166723584 (159.0MB)
used = 75345992 (71.85553741455078MB)
free = 91377592 (87.14446258544922MB)
45.19216189594389% used
4157 interned Strings occupying 319128 bytes. ## String常量池大小
打印对象图
# <pid>为对应的java进程号
jmap -histo <pid>
dump文件
如果上面那个觉得不是很显眼的话, 可以打印dump
文件使用外部工具分析
# <pid> 为对应的java进程号, file指定生成的文件名
jmap -dump:live,format=b,file=heap.bin <pid>
还有一个jhat
命令可以本地启动一个服务器来解析上面的文件,端口号为7000,可以访问localhost:7000来查看。最下面有一个Other Queries
最可以点击查看对象树,空间占用、对象实例的
# heap.bin是上面dump生成的文件名
./jhat heap.bin
jstat对应用程序进行实时采样
语法说明
$ ./jstat -h
-h requires an integer argument
Usage: jstat -help|-options
jstat -<option> [-t] [-h<lines>] <vmid> [<interval> [<count>]]
Definitions:
<option> An option reported by the -options option
<vmid> Virtual Machine Identifier. A vmid takes the following form:
<lvmid>[@<hostname>[:<port>]]
Where <lvmid> is the local vm identifier for the target
Java virtual machine, typically a process id; <hostname> is
the name of the host running the target Java virtual machine;
and <port> is the port number for the rmiregistry on the
target host. See the jvmstat documentation for a more complete
description of the Virtual Machine Identifier.
<lines> Number of samples between header lines.
<interval> Sampling interval. The following forms are allowed:
<n>["ms"|"s"]
Where <n> is an integer and the suffix specifies the units as
milliseconds("ms") or seconds("s"). The default units are "ms".
<count> Number of samples to take before terminating.
-J<flag> Pass <flag> directly to the runtime system.
-
options可选项
$ ./jstat -options -class ## 显示加载的class的数量 -compiler ## -gc ## 显示gc相关的信息 -gccapacity ## 显示gc对象的使用和占用大小,新生代、老年代、元空间 -gccause ## 同gcutil,只不过多了一个最后一次或正在发生的垃圾回收的诱因 -gcmetacapacity ## 只显示元空间对象的占用大小 -gcnew ## 年轻代gc对象信息 -gcnewcapacity ## 年轻代对象的信息及其占用量 -gcold ## 老年代gc对象信息 -gcoldcapacity ## 老年代对象的信息及其占用量 -gcutil ## 统计gc信息 -printcompilation ## 当前VM执行的信息
基础演示
$ ./jstat -class 2144
Loaded Bytes Unloaded Bytes Time
687 1367.7 0 0.0 0.14
- Loaded / Bytes 已装载类数量和字节大小
- Unloaded / Bytes 已卸载类数量占用字节大小
- Time 总耗时
gc相关
-gc
查看各个分代区gc情况、当前占用容量以及已使用容量,这里不是分配的最大容量。
当然这个概念说的不一定对,只是对比了分析工具之后得出的结论。
类似于最大分配容量是10M, 当然先占用了5M容量, 但是这是提前开辟的一片内存空间, 然后只有3M空间是存储了对象的。然后占用容量就是5M, 已使用容量就是3M.
尤其是对新生代的统计,详细细分了伊甸园区和幸存者0区和1区,如果想直接看各个对象代的容量概览,可以使用-gccapacity
以及对应的-gcnewcapacity
-gcoldcapacity
- 单位都是kb
- S0C S0U 即Servivor 0 capacity 和 Servicor 0 used ,幸存from区总容量和已使用大小,和幸存to区是相对概念
- S1C S1U 即Servivor 1 capacity 和 Servicor 1 used ,幸存to区总容量和已使用大小,和幸存from区是相对概念
- EC 即Eden capacity ,伊甸园区当前占用容量,非最大可分配容量大小
- EU 即Eden used, 伊甸园区当前使用大小
- OC 即Old capacity, 老年代当前占用容量,非最大可分配容量大小
- OU 即Old used, 老年代已使用大小
- MC 即Metaspace capacity, 元空间当前占用容量,非最大可分配容量大小
- MU 即Metaspace used, 元空间已使用大小
- CCSC CCSU 查询说是压缩类大小和已使用大小,不明其意
- YGC 即Young GC 从应用程序启动到当前采样时年轻代gc次数
- YGCT 即Young GC花费时长,单位s
- FGC 即Full GC 次数
- FGCT 即Full Gc花费时长,单位s
下面是各属性和Java VisualVM
工具的对应图,注意这个命令看不到分代区最大可分配内存,所以没有对应起来。
-gccapacity
相对于-gc
,这里可以看到各个分代区对象最大可分配大小以及当前已占用大小, 而-gc
只能看到各个分代区从应用启动开始到采样时当前占用了多少以及已使用了多少,这个区别在上面-gc
的时候解析过了。这里看的就是最大可以分配多少以及目前占用了多少,这个就是我们平常最容易理解的概念了
- 单位kb
- NGCMN 年轻代初始化的容量大小
- NGCMX 年轻代可以分配的最大容量
- NGC 年轻代中当前占用容量,这个值是S0和S1以及Eden区的和,即下面的S0C, S1C , EC
- S0C 年轻代中survivor0的当前占用容量
- S1C 年轻代中survivor1的当前占用容量
- EC 年轻代中Eden的当前占用容量
- OGCMN old代中初始化大小
- OGCMX old代可以分配最大容纳
- OC Old代当前占用的容量,非最大可分配容量大小
- MCMN metaspace(元空间)初始化容量
- MCMX metaspace(元空间)可以分配的最大容量
- MC metaspace(元空间)当前占用的容量
没搞清楚的问题,是OGC和OC的区别???
-gcnew/-gcold/gcnewcapacity/gcoldcapacity
上面的-gc
更偏向去看分代区当前占用的容量以及已使用的容量,gccapacity
虽然可以看新生代、老年代、元空间最大可分配空间,但是对新生代不太友好,无法看到新生代的伊甸园区、幸存0区和幸存1区最大可分配控件
然后这里的命令更倾向于对上面的指令进行分代区分,只看某个代的情况
比如如果我想详细看到新生代可分配容量、已占用容量(看不到实际对象已使用容量)则直接使用更细分的-gcnew
-
-gcnew
- NGCMN 年轻代初始化容量
- NGCMX 年轻代最大分配容量
- NGC 年轻代当前占用容量,包含EUCX和幸存区的大小,但是幸存区大小0区和1区的大小加起来和这个对不上,所以这一块有点没搞清楚
- S0CMX 幸存者0区最大可分配容量
- S0C 幸存0区当前占用容量
- S1CMX 幸存者1区最大可分配容量
- S1C 幸存1区当前占用容量
- ECMX 伊甸园区最大可分配容量
- EC 伊甸园区当前占用容量
- YGC young gc次数
- FGC full gc次数
-
-gcnewcacpcity
- S0C 幸存者0区当前占用容量大小,非最大可分配容量大小
- S1C 幸存者1区当前占用容量大小,非最大可分配容量大小
- S0U 幸存者0区当前已使用容量大小
- S1U 幸存者1区当前已使用容量大小
- TT MTT DSS 含义不明,待补充
- EC 伊甸园区当前占用容量大小,非最大可分配容量
- YGC young gc次数
- YGCT young gc耗时
-gccause
显示垃圾回收的相关信息以及最后一次或当前正在发生的垃圾回收产生的原因,这里只统计各对象代的占用百分比
- SO Servicor 幸存者0区已使用的容量占幸存者0区总容量的百分比
- S1 Servicor 幸存者1区已使用的容量占幸存者1区总容量的百分比
- E Eden 伊甸园区已使用的容量占总伊甸园区总容量的百分比
- O Old 老年代已使用容量占老年代总容量的百分比
- CCS 不知道对应的全称是啥了,查了资料是压缩使用比例,还是不知道啥意思
- YGC 即从应用程序启动后到采样时Young gc次数
- YGCT 即从应用程序启动后到采样时Young gc花费时间,单位s
- FGC 即从应用程序启动后到采样时Full gc次数
- FGCT 即从应用程序启动后到采样时Full gc花费时间,单位s
- GCT 即从应用程序启动后到采样时gc用的总时间
- LGCC 最后一次gc的时间
- GCC 采样时正在gc的原因, 如果没有即No GC