第二类: 内存常用命令:
free, vmstat,JMap, Jstack ,jstat
free命令:
主要用于查看系统的空闲内存和已经使用的内存
free命令用法
free [-b | -k | -m] [-o] [-s delay ] [-t] [-V]
free [选项]
-b 按bytes字节显示内存大小
-k 按kilobytes字节显示内存大小
-m 按megabytes字节显示内存大小
-o 是一个是否显示 buffer 调整值的一个开关
-s 每次显示内存信息的时间间隔
-t 是一个是否显示 内存总量统计 的一个开关
示例:
-sh-3.00$ free -t -s 3
total used free shared buffers cached
Mem: 4149104 4088024 61080 0 130292 2002228
-/+ buffers/cache: 1955504 2193600
Swap: 2096472 208 2096264
Total: 6245576 4088232 2157344
total used free shared buffers cached
Mem: 4149104 4088024 61080 0 130292 2002228
-/+ buffers/cache: 1955504 2193600
Swap: 2096472 208 2096264
Total: 6245576 4088232 2157344
第一部分Mem行:
total 内存总数
used 已经使用的内存数
free 空闲的内存数
shared 当前已经废弃不用,总是0
buffers Buffer 缓存内存数
cached Page 缓存内存数
下面是buffers与cached的区别。
buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.
cached是用来给文件做缓冲。
前者针对磁盘块的读写,后者针对文件inode的读写。
那就是说:buffers是用来存储,目录里面有什么内容,权限等等。
而cached直接用来记忆我们打开的文件,如果你想知道他是不是真的生效,你可以试一下,先后执行两次命令#man X ,你就可以明显的感觉到第二次的开打的速度快很多。
关系:total(1002M) = used(769M) + free(232M)
第二部分(-/+ buffers/cache):
(-buffers/cache) used内存数:286M (指的第一部分Mem行中的used - buffers - cached)
(+buffers/cache) free内存数: 715M (指的第一部分Mem行中的free + buffers + cached)
可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。
vmstat命令:
vmstat 命令报告关于内核线程、虚拟内存、磁盘、系统调用和 CPU 活动的统计信息。
vmstat命令用法
vmstat [-a] [-n] [delay [ count]]
vmstat [-f] [-s] [-m]
vmstat [-S unit]
vmstat [-d]
vmstat [-p disk partition]
vmstat [-V]
vmstat [选项]
-s 显示各种事件和内存的统计信息
-S 显示各内存的统计信息的单位 K/M
-d 显示磁盘的读写统计信息
delay 显示信息的时间间隔
count 显示统计信息的次数
输出信息:
内核进程:
r 置于运行队列中的内核线程数目。
b 置于等待队列(等待资源、等待输入/输出)的内核线程数目。
mem内存:
swpd 使用的虚拟内存大小
free 闲置内存大小
inact 闲置内存大小(包含 buffer/cache)
active 活动的内存大小(包含 buffer/cache)
swap 交换区
si 每秒从磁盘交换到swap区的大小
so 每秒从swap区交换到磁盘的大小
io 磁盘io
bi 每秒收到块设备的阻塞次数
bo 每秒发送给块设备的阻塞次数
System
in 每秒的终端次数
cs 每秒的上下文交换次数
cpu
us 用户进程消耗的cpu时间百分比
sy 系统进程消耗的cpu时间百分比
id cpu空闲时间百分比
wa 等待磁盘IO的百分比
示例:
-sh-3.00$ vmstat 3 4
procs -----------memory---------- ---swap-- -----io---- --system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 208 47808 131732 2014828 0 0 0 5 0 0 1 0 99 0
0 0 208 47744 131732 2014828 0 0 0 28 1042 1608 0 0 100 0
0 0 208 47736 131740 2014820 0 0 0 85 1086 1670 0 0 100 0
0 0 208 47800 131740 2014820 0 0 0 43 1054 1436 0 0 100 0
关于磁盘统计信息:
Reads
total: Total reads completed successfully
merged: grouped reads (resulting in one I/O)
sectors: Sectors read successfully
ms: milliseconds spent reading
Writes
total: Total writes completed successfully
merged: grouped writes (resulting in one I/O)
sectors: Sectors written successfully
ms: milliseconds spent writing
IO
cur: I/O in progress
s: seconds spent for I/O
-sh-3.00$ vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
ram0 0 0 0 0 0 0 0 0 0 0
ram1 0 0 0 0 0 0 0 0 0 0
ram2 0 0 0 0 0 0 0 0 0 0
ram3 0 0 0 0 0 0 0 0 0 0
ram4 0 0 0 0 0 0 0 0 0 0
ram5 0 0 0 0 0 0 0 0 0 0
ram6 0 0 0 0 0 0 0 0 0 0
ram7 0 0 0 0 0 0 0 0 0 0
ram8 0 0 0 0 0 0 0 0 0 0
ram9 0 0 0 0 0 0 0 0 0 0
ram10 0 0 0 0 0 0 0 0 0 0
ram11 0 0 0 0 0 0 0 0 0 0
ram12 0 0 0 0 0 0 0 0 0 0
ram13 0 0 0 0 0 0 0 0 0 0
ram14 0 0 0 0 0 0 0 0 0 0
ram15 0 0 0 0 0 0 0 0 0 0
sda 0 0 0 0 0 0 0 0 0 0
sdb 3185123 325652 101742680 7396945 106171205 176510901 2261463001 113888066 0 27536
sr0 0 0 0 0 0 0 0 0 0 0
md0 0 0 0 0 0 0 0 0 0 0
md1 0 0 0 0 0 0 0 0 0 0
md2 0 0 0 0 0 0 0 0 0 0
md3 0 0 0 0 0 0 0 0 0 0
作为一个java 开发者,常用的java bin下面提供的几个常用的java 内存查看分析工具还是有 必要熟悉下的,顺便记录下常用的java 查看内存命令:
一: JMap:
可以通过 /opt/taobao/java1/bin/jmap -h 查看命令的帮助
jmap 会打印出 堆中的对象相关信息,如数量,大小
EG:
/opt/taobao/java/bin/jmap -dump:format=b,file=heap.dump 8139
/opt/taobao/java/bin/jmap -histo 8139 > ~/heap.dump
这里 -dump 参数指定了 dump生产的文件的格式,否则 使用MAT(安装地址: http://download.eclipse.org/technology/mat/latest/update-site/ ) 来分析内存的打开dump的内存文件的时候会提示你 invalid HPROF file header 错误, 如果打开dump文件因内存大小问题异常,可以修改eclipse的 启动配置,加大
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms80m
-Xmx512m
二: Jstack
主要是打印栈信息,也就是方法调用的信息,内存的溢出也就分 堆溢出和 栈溢出
Options:
-F to force a thread dump. Use when jstack <pid> does not respond (process is hung)
-m to print both java and native frames (mixed mode)
-l long listing. Prints additional information about locks
-h or -help to print this help message
线程dump来查看分析cpu资源的占用, EG:
[admin@buy14 ~]$ /opt/taobao/java/bin/jstack 10623 > ~/jstack.dump
[admin@buy14 ~]$ ps -To %cpu,spid 10623 查看是什么线程在占用CPU,
三:jstat
jstat是vm的状态监控工具,监控的内容有类加载、运行时编译及GC。
/opt/taobao/java1/bin/jstat -options 可以查看有些什么选择项
jstat -class pid:显示加载class的数量,及所占空间等信息。
jstat -compiler pid:显示VM实时编译的数量等信息。
jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。
jstat -gcnew pid:new对象的信息。
jstat -gcnewcapacity pid:new对象的信息及其占用量。
jstat -gcold pid:old对象的信息。
jstat -gcoldcapacity pid:old对象的信息及其占用量。
jstat -gcpermcapacity pid: perm对象的信息及其占用量。
jstat -util pid:统计gc信息统计。
jstat -printcompilation pid:当前VM执行的信息。
除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。