1 内存监控与分析
1.1 实时监控工具
目前可用的实时监控工具包括Jprofile,JVisualVm,本文主要介绍JVisualVm的使用
1.1.1 Jvisualvm
Visualvm为Sun Jdk自带的内存分析与监控工具,其存在2个版本,一个为JDK自带的版本,也有脱离于JDK的独立版本。JDK自带版本建议使用JDK1.6.45及以上版本;独立版本可于http://visualvm.java.net/ 下载。
1.1.1.1 工具运行
1. 配置环境变量 JAVA_HOME,PATH,主要目标将JDK的bin目录配置到PATH环境变量上去(Linux可同样配置)
2. 在Cmd窗口运行Jvisualvm,系统会做一些系统测算,点击确定后自动跳出如下界面
1.1.1.2 插件安装
建议插件为 visual gc
a) 在线安装
1. 菜单-工具-插件-可用插件
2. 如上图,如果上图未刷新,可点击【重新载入目录】
b) 离线安装
1. 前往 http://visualvm.java.net/pluginscenters.html,选择对应版本的插件下载
2. 菜单-工具-插件-已下载-添加,添加下载下来的离线插件,然后按照提示步骤安装
1.1.1.3 程序监控
1. 运行对应的目标程序,如下图的tomcat WEB,Jvisualvm会出现如下界面,下图左侧会提示一个运行的程序tomcat
2. 双击上图圈中的tomcat,会出现系统运行的一些配置参数,如下图,我方配置了内存参数 –Xms1100m –Xmx1100m,相关解释请见其他单元
3. 使用“监视”页面监控系统资源使用情况
在这里我们主要监控内存的使用
如下图:
内存分为堆内存与PermGem内存,从上图可以看出PermGen占用为50M,最大为64M,占用率较高。
4. 使用visualgc观测内存使用情况
从上图可以看出内存主要分为Perm,Old,Eden,S0,S1,相关描述请见分代算法描述。
从上图看出Perm Gen的内存使用为51.83,当前分配为52M,最大限制为64M,这样极有可能会超过最大限制导致“java.lang.OutOfMemoryError: PermGen space”
1.2 离线分析工具
离线分析主要对如下日志进行分析
A.JVM的GC日志
对JVM的GC日志分析,可以分析程序运行所有阶段的内存使用情况,可以从中发现内存是否存在泄露和内存参数设置的合理性。
对GC文件分析的工具主要是IBM的IBM Pattern Modeling and Analysis Tool for Java Garbage Collector(ga443.jar)
B. 内存dump文件
对此类文件的分析,一般情况下是在程序已经发生Out Of Memory或者通过快捷键进行数据收集,通过对内存Dump文件进行分析,可以发现哪一类数据结构占用内存最多,通过分析这个可以获取具体的内存泄露的数据结构。
1.2.1 GC日志分析工具
1.2.1.1 GC日志收集
1.2.1.1.1 Sun Jdk
a) 配置参数
在运行程序的路径上使用
-verbose:gc -Xloggc:%logname% -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=20 -XX:GCLogFileSize=16M -XX:+PrintGCDetails -XX:+PrintHeapAtGC -XX:+ PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintClassHistogram |
其中%logname%在测试时可以用具体的文件名,但是在生产环境跟踪可以考虑使用带日期的参数来生成,诸如下文
@set tsp="%time:~0,1%" @if %tsp%==" " (@set logname=%date:~0,4%%date:~5,2%%date:~8,2%_0%time:~1,1%%time:~3,2%%time:~6,2%) & @goto LS @set logname=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2% :LS @set logname=gclogs/gc_%logname%.log
|
配置代码如下
b) 参数生效显示
启动程序后,通过Jvisualvm可以看到,相关参数已生效
同时,对应的gc日志文件会产生对应的日志文件
c) 收集日志简单分析
如下图,下图为一个完整的GC日志记录
记录信息包括:
1. 触发GC的时间,及触发Gc的原因(需要新生代39714816 bytes)字节
2. 触发GC前后的各代的内存分布
d) 使用工具分析
1.2.1.2 IBM Pattern Modeling and Analysis Tool
该工具可以分析多个JDK版本的产生的GC日志文件,包括
\内存分析工具\IBM\ga443.jar
加载对应的gclog文件,可以得到如下图的日志统计分析,包括
1. GC次数
2. GC时间段
3. 各代的最大,最小,平均值等内存占用数据
通过下图红圈圈中的按钮(或者菜单-Analysis-Graph View All)可以看,各代内存的趋势分析,通常会分析Used Ternued(after)(即年老代GC后的内存)占用趋势图
分析这个内存可以通过一些趋势来看程序的内存使用情况
1. 如果内存缓慢上升,从不下降,那么程序可能存在内存泄露
2. 如果内存变化非常陡峭,那么程序会存在大量分配短时间内存的可能
某生产环境典型内存使用情况:
参数设置: -Xmx1000M
经过连续测试后,已经定位到有问题的功能,通过连续使用该功能可形成如下的使用图,通过该工具可定位到有问题的功能。
1.2.2 Heap Dump日志分析
1.2.2.1 日志收集
1.2.2.1.1 Sun Jdk
使用Jvisualvm进行head dump,如下图(或者使用菜单-【应用程序】-【堆Dump】
这样可以得到堆Dump文件