OOM异常运维与Weblogic 调优
一:背景
项目运行中,经常会出现程序挂起或 OOM 内存泄漏等情况
这个时候就需要运维人员快速定位问题,并为问题后续解决提供支持
二:现象
1.服务不能访问,网页报404错误
2.查看GC 状态
jstat -gc [进程号] 5000 20 --每5秒查看gc 查看20次
参数 | 含义 |
---|---|
S0C | 年轻代第一个survivor的容量(字节) |
S1C | 年轻代第二个survivor的容量(字节) |
S0U | 年轻代第一个survivor已使用的容量(字节) |
S1U | 年轻代第二个survivor已使用的容量(字节) |
EC | 年轻代中Eden的空间(字节) |
EU | 年代代中Eden已使用的空间(字节) |
OC | 老年代的容量(字节) |
OU | 老年代中已使用的空间(字节) |
PC | 永久代的容量 |
PU | 永久代已使用的容量 |
YGC | 从应用程序启动到采样时年轻代中GC的次数 |
YGCT | 从应用程序启动到采样时年轻代中GC所使用的时间(单位:S) |
FGC | 从应用程序启动到采样时老年代中GC(FULL GC)的次数 |
FGCT | 从应用程序启动到采样时老年代中GC所使用的时间(单位:S) |
观察YGCT 和 FGCT 的次数变化,再进行GC 后,年轻代使用是否有变化,一般都是变小内存被回收,如果年轻代一直保持高位或者超出设定的值 一般就是内存溢出了
三:查错
1.查询程序日志 (业务报错,程序正常运行)
2.登录到WebLogic管理控制台 (线程异常,可查看线程堆栈信息)
导航到
服务器>监视>线程>转储线程堆栈
3.查看进程下线程号
ps -T -p <进程号>
SPID 为线程号,
根据线程号可直接去控制台查看转储线程堆栈 的具体信息
4.系统挂起,404异常,但未自动生成dump文件,无法访问了
jmap -heap [进程号] --查看整个JVM内存状态
jmap -dump:file=文件名.dump [进程号] --生成dump 文件(路径最好在空文件夹里)
5.查看weblogic 对jvm 内存的配置 是否配置过低
Linux 服务器路径:/home/…/Oracle/Middleware/user_projects/
domains/base_domain/bin/
setDomainEnv.sh 文件 中
四:分析dump 文件
dump 下载下来后,可以使用MAT 进行分析(eclipse 可以直接下载MAT 插件 或者直接使用MAT 客户端)
1.模拟程序 OOM异常,并产生dump文件
2.eclipse 按照MAT 插件 或者 下载mat
单独的客户端
3.使用MAT 导入dump(会自动进行分析,
时间较长)
4.打开.hprof 文件,看查看分析结果
5.直接可以从饼图中看出内存占用过大
6.0xff1ca88 主线程 占用了96.78%,可以点Details 查看详情
7.详情里就可以看出哪个线程里哪里实例存在问题
五:weblogic JVM 参数调优
weblogic 安装使用,往往初始对JVM 参数的默认配置 往往不符合我们的日常需求
这就需要对参数进行调整
Linux 服务器路径:/home/…/Oracle/Middleware/user_projects/
domains/base_domain/bin/
setDomainEnv.sh 文件 中
搜索对应参数名 对数值进行修改
注意 if 判断,java的版本选择
如图 选择的是自定义的jdk版本(即else中的)
JVM 常用 调整参数