命令格式
jstat命令命令格式:
jstat [Options] vmid[interval] [count]
参数说明:
Options,选项,我们一般使用 -gcutil 查看gc情况
vmid
,VM的进程号,即当前运行的java进程号
interval
,间隔时间,单位为秒或者毫秒
count
,打印次数,如果缺省则打印无数次
示例说明
示例
通常运行命令如下:
jstat -gc 12538 5000
即会每5秒一次显示进程号为12538的java进成的GC情况,
显示内容如下图:
结果说明
S0C:年轻代中第一个survivor(幸存区)的容量 (字节)
S1C
:年轻代中第二个survivor(幸存区)的容量 (字节)
S0U
:年轻代中第一个survivor(幸存区)目前已使用空间 (字节)
S1U
:年轻代中第二个survivor(幸存区)目前已使用空间 (字节)
EC
:年轻代中Eden(伊甸园)的容量 (字节)
EU
:年轻代中Eden(伊甸园)目前已使用空间 (字节)
OC
:Old代的容量 (字节)
OU
:Old代目前已使用空间 (字节)
PC
:Perm(持久代)的容量 (字节)
PU
:Perm(持久代)目前已使用空间 (字节)
YGC
:从应用程序启动到采样时年轻代中gc次数
YGCT
:从应用程序启动到采样时年轻代中gc所用时间(s)
FGC
:从应用程序启动到采样时old代(全gc)gc次数
FGCT
:从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT
:从应用程序启动到采样时gc用的总时间(s)
NGCMN
:年轻代(young)中初始化(最小)的大小 (字节)
NGCMX
:年轻代(young)的最大容量 (字节)
NGC
:年轻代(young)中当前的容量 (字节)
OGCMN
:old代中初始化(最小)的大小 (字节)
OGCMX
:old代的最大容量 (字节)
OGC
:old代当前新生成的容量 (字节)
PGCMN
:perm代中初始化(最小)的大小 (字节)
PGCMX
:perm代的最大容量 (字节)
PGC
:perm代当前新生成的容量 (字节)
S0
:年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1
:年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E
:年轻代中Eden(伊甸园)已使用的占当前容量百分比
O
:old代已使用的占当前容量百分比
P
:perm代已使用的占当前容量百分比
S0CMX
:年轻代中第一个survivor(幸存区)的最大容量 (字节)
S1CMX
:年轻代中第二个survivor(幸存区)的最大容量 (字节)
ECMX
:年轻代中Eden(伊甸园)的最大容量 (字节)
DSS
:当前需要survivor(幸存区)的容量 (字节)(Eden区已满)
TT
: 持有次数限制
MTT
: 最大持有次数限制
进入到了tomcat的bin的目录下中,命令中vi catalina.sh 来编辑然后在该文件中添加为
JAVA_OPTS="-Xms128m -Xmx256m -Xmn100m -XX:MaxPermSize=30m -Xloggc:/usr/local/tomcat/logs/gc.$$.log"
gc开启完成之后,只要启动了tomcat之后,就可目录下生成了gc的log的日志内容。
为了能方便中进行分析的话,需要把Linux中gc日志拷贝到windows本地种。
进行打开hpjtune的jar的文件,来分析gc的文件。
打开了hpjtune的之后,点击打开文件,
浏览gc的日志的文件,并选中之后,点击打开。
这样话可以分析gc的具体的内容了。
GC是垃圾回收站。FULL GC分析和问题定位
a. GC log收集和分析
(1)在JVM启动参数增加:"-verbose:gc -Xloggc:<file_name> -XX:+PrintGCDetails -XX:+PrintGCDateStamps"
PrintGCTimeStamp只能获得相对时间,建议使用PrintGCDateStamps获得full gc 发生的绝对时间
(2)如果采用CMS GC,仔细分析jstat FGC输出和GC 日志会发现, CMS的每个并发GC周期则有两个stop-the-world阶段——initial mark与final re-mark,使得CMS的每个并发GC周期总共会更新full GC计数器两次,initial mark与final re-mark各一次
b. Dump JVM 内存快照
/opt/taobao/java/bin/jmap -dump:format=b,file=dump.bin pid
这里有一个问题是什么时候进行dump?
一种方法是前面提到的用jstat工具观察,当OLD区到达比较高的比例如60%,一般会很快触发一次FULL GC,可以进行一次DUMP,在FULL GC发生以后再DUMP一次,这样比较就可以发现到底是哪些对象导致不停的FULL GC
另外一种方法是通过配置JVM参数
-XX:+HeapDumpBeforeFullGC -XX:+HeapDumpAfterFullGC分别用于指定在full GC之前与之后生成heap dump
c. 利用MAT((Memory Analyzer Tool)工具分析dump文件
关于MAT具体使用方法网上有很多介绍,这里不做详细展开,这里需要注意的是:
(1) MAT缺省只分析reachable的对象,unreachable的对象(将被收集掉的对象)被忽略,而分析FULL GC频繁原因时unreachable object也应该同时被重点关注。如果要显示unreachable的对象细节必须用mat 1.1以上版本并且打开选项“keep unreachable object”
(2) 通常dump文件会好几个G,无法在windows上直接进行分析,我们可以先把dump文件在linux上进行分析,再把分析好的文件拷贝到windows上,在windows上用MAT打开分析文件。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)