记录一次OOM分析过程
工具:
- jstat
- jmap
- jhat
1.jstat查看gc情况
S0C、S1C、S0U、S1U:Survivor 0/1区容量(Capacity)和使用量(Used)
EC、EU:Eden区容量和使用量
OC、OU:年老代容量和使用量
PC、PU:永久代容量和使用量
YGC、YGT:年轻代GC次数和GC耗时
FGC、FGCT:Full GC次数和Full GC耗时
GCT:GC总耗时
这次遇到的情况是,old区到了指定的回收阀值触发fgc,但old区回收不了,持续增长(但一直频繁fgc)。
jvm配置如下:
-server -XX:PermSize=64m -XX:MaxPermSize=128m -Xmn500m -Xms3000m -Xmx3000m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=60 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/apps/oom/gc.hprof -XX:ErrorFile=/var/log/java_error_%p.log
2.当发现old区回收不了的时候,使用jmap分析内存情况。
jmap -heap pid
使用jmap -heap pid查看进程堆内存使用情况,包括使用的GC算法、堆配置参数和各代中堆内存使用情况。
例如:
Attaching to process ID 10253, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.65-b04 using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GC Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 3145728000 (3000.0MB)
NewSize = 524288000 (500.0MB)
MaxNewSize = 524288000 (500.0MB)
OldSize = 5439488 (5.1875MB)
NewRatio = 2
SurvivorRatio = 8
PermSize = 67108864 (64.0MB)
MaxPermSize = 134217728 (128.0MB)
G1HeapRegionSize = 0 (0.0MB) Heap Usage:
New Generation (Eden + 1 Survivor Space):
capacity = 471859200 (450.0MB)
used = 113244456 (107.99832916259766MB)
free = 358614744 (342.00167083740234MB)
23.99962870279948% used
Eden Space:
capacity = 419430400 (400.0MB)
used = 66465208 (63.38616180419922MB)
free = 352965192 (336.6138381958008MB)
15.846540451049805% used
From Space:
capacity = 52428800 (50.0MB)
used = 46779248 (44.61216735839844MB)
free = 5649552 (5.3878326416015625MB)
89.22433471679688% used
To Space:
capacity = 52428800 (50.0MB)
used = 0 (0.0MB)
free = 52428800 (50.0MB)
0.0% used
concurrent mark-sweep generation:
capacity = 2621440000 (2500.0MB)
used = 259229192 (247.22022247314453MB)
free = 2362210808 (2252.7797775268555MB)
9.888808898925781% used
Perm Generation:
capacity = 67108864 (64.0MB)
used = 37059440 (35.34263610839844MB)
free = 30049424 (28.657363891601562MB)
55.22286891937256% used 19254 interned Strings occupying 2351584 bytes.
jmap -heap 只能查看jvm各个区的详细使用情况,内存中到底有哪些数据(咬着old区不放)得用jmap -histo进行分析。
jmap -histo[:live] pid
例如:
num #instances #bytes class name
----------------------------------------------
1: 32727 88492856 [I
2: 369677 62058808 [C
3: 145200 54408968 [B
4: 545638 17460416 java.util.HashMap$Entry
5: 451316 14442112 org.wltea.analyzer.dic.DictSegment
6: 158024 10051408 [Ljava.lang.Object;
7: 59193 8940656 <constMethodKlass>
8: 59193 7588736 <methodKlass>
9: 6105 7139824 <constantPoolKlass>
10: 39329 6230272 [Ljava.util.HashMap$Entry;
11: 255466 6131184 java.lang.String
12: 182746 5847872 [Lorg.wltea.analyzer.dic.DictSegment;
13: 6097 4220448 <instanceKlassKlass>
14: 5064 3900032 <constantPoolCacheKlass>
15: 100084 3202688 org.apache.lucene.document.LazyDocument$LazyField
16: 78719 3148760 java.util.LinkedHashMap$Entry
17: 11980 3120656 [S
18: 122352 2936448 java.util.ArrayList
19: 9747 2740192 [J
20: 95649 2295576 java.util.LinkedList$Node
21: 53484 2139360 org.apache.lucene.document.FieldType
22: 125687 2010992 java.lang.Character
23: 41021 1969008 org.apache.lucene.analysis.tokenattributes.PackedTokenAttributeImpl
24: 53663 1913576 [Lorg.apache.lucene.util.automaton.Transition;
class name是对象类型,说明如下:
B byte
C char
D double
F float
I int
J long
Z boolean
[ 数组,如[I表示int[]
[L+类名 其他对象
如果还需要看更加详细的信息,则使用:
jmap -dump:format=b,file=dumpFileName pid
dump出来的文件可以用MAT、VisualVM等工具查看,也可以使用jhat。
jhat -port 9999 dumpFileName
如果dump出来的文件过大,可能需要指定Xmx(jhat实际启动了一个web应用)。
jhat -J-Xmx1000m -port 9999 dumpFileName
启动成功后,则可以通过浏览器查看:
ip:port
例如:
在该页面的最后面有一些查询工具,例如:OQL(object query language)
例如上图查询的是长度大于256的int数组。
------------------------------------
企业开发的时候,有可能碰到的问题:
- oom
- 内存泄露
- 线程死锁
- 锁争用
- java进程消耗cpu过高
工具:
- jps(java virtual machine process status tool)
jps主要用来输出JVM中运行的进程状态信息。语法格式如下:
jps [options] [hostid]
q 不输出类名、Jar名和传入main方法的参数
-m 输出传入main方法的参数
-l 输出main类或Jar的全限名
-v 输出传入JVM的参数
- jstack
jstack主要用来查看某个Java进程内的线程堆栈信息。
检查过程:
1)得到相应的进程号(ps -ef |grep ***)
2)查询该进程对应的线程信息(top -Hp pid)
这里的Pid需要转成16进制,后面需要用到。
[apps@java1818 bin]$ printf "%x\n" 10831
2a4f
使用jstack进行分析
[apps@java1818 bin]$ jstack 10253 | grep 2a4f
"http-bio-2223-exec-172" daemon prio=10 tid=0x00007fb2d400a000 nid=0x2a4f waiting on condition [0x00007fb28c5c4000]
也可以将信息dump到文件中进行分析,更加方便。
- jmap ( memory map ) / jhat ( java heap analysis tool )
jmap用来查看堆内存使用状况,一般结合jhat使用。
jmap -heap pid
jmap -histo[:live] pid
jmap -dump:format=b,file=dumpFileName pid
- jstat
堆内存 = 年轻代 + 年老代 + 永久代
年轻代 = Eden区 + 两个Survivor区(From和To)
- hprof ( heap/cpu profiling tool )
hprof能够展现CPU使用率,统计堆内存使用情况。
参考资料:
http://my.oschina.net/feichexia/blog/196575
记录一次OOM分析过程的更多相关文章
- 一个杀不死的小强,kill进程无效的原因 记录故障排查过程中kill进程无效的分析过程
今天在处理一个机器异常负载(1000+)的问题,碰到了一个从未碰到过的情况,遇到了一个异常顽固的分子.我使用了所能想到的所有杀进程的方法,却始终无法干掉这个顽固分子,最后终于在谷歌大神的指引下,干掉了 ...
- 一个驱动导致的内存泄漏问题的分析过程(meminfo->pmap->slabtop->alloc_calls)
关键词:sqllite.meminfo.slabinfo.alloc_calls.nand.SUnreclaim等等. 下面记录一个由于驱动导致的内存泄漏问题分析过程. 首先介绍问题背景,在一款嵌入式 ...
- 记一次ORACLE的UNDO表空间爆满分析过程
这篇文章是记录一次ORACLE数据库UNDO表空间爆满的分析过程,主要整理.梳理了同事分析的思路.具体过程如下所示: 早上收到一数据库服务器的UNDO表空间的告警邮件,最早一封是7:55发出的(监控作 ...
- 一次数据库hang住的分析过程
现象: 普通用户和sysdba都无法登陆,业务中断 分析过程: 1.先做hanganalyze和systemstate dump $sqlplus -prelim "/as sysdba&q ...
- Android开发笔记——图片缓存、手势及OOM分析
把图片缓存.手势及OOM三个主题放在一起,是因为在Android应用开发过程中,这三个问题经常是联系在一起的.首先,预览大图需要支持手势缩放,旋转,平移等操作:其次,图片在本地需要进行缓存,避免频繁访 ...
- Mysql死锁如何排查:insert on duplicate死锁一次排查分析过程
前言 遇到Mysql死锁问题,我们应该怎么排查分析呢?之前线上出现一个insert on duplicate死锁问题,本文将基于这个死锁问题,分享排查分析过程,希望对大家有帮助. 死锁案发还原 表结构 ...
- Lucene的分析过程
转自:http://www.open-open.com/lib/view/open1348033848724.html Lucene的分析过程 回顾倒排索引的构建 收集待建索引的原文档(Documen ...
- 记录sqoop同步失败问题解决过程,过程真的是很崎岖。(1月6日解决)
记录sqoop同步失败问题解决过程,过程真的是很崎岖.事发原因:最近突然出现sqoop export to mysql时频繁出错.看了下日志是卡在某条数据过不去了,看异常.看sqoop生成的mr并未发 ...
- step_by_step_记录deepin下curl安装过程
记录 deepin 下 curl 安装过程 wget https://curl.haxx.se/download/curl-7.55.1.tar.gz .tar.gz cd curl-/ ./conf ...
随机推荐
- 牛客OI赛制测试赛2
A题: https://www.nowcoder.com/acm/contest/185/A 链接:https://www.nowcoder.com/acm/contest/185/A来源:牛客网 题 ...
- run
和配置块不同,运行块在注入器创建之后被执行,它是所有AngularJS应用中第一个被执行的方法运行块通常用来注册全局的事件监听器.例如,我们会在.run()块中设置路由事件的监听器以及过滤未经授权的请 ...
- [LeetCode&Python] Problem 492. Construct the Rectangle
For a web developer, it is very important to know how to design a web page's size. So, given a speci ...
- HDU - 5130 :Signal Interference (多边形与圆的交)
pro:A的监视区域是一个多边形. 如果A的监视区的内满足到A的距离到不超过到B的距离的K倍的面积大小.K<1 sol:高中几何体经验告诉我们满足题意的区域是个圆,那么就是求圆与多边形的交. # ...
- BZOJ4426 :最大生产率(贪心+决策单调性DP)
题意:给出N个人,现在让你分P组,每组的工作效率是最小结束时间-最大开始时间,要求每一组的效率的正数,求最大效率和.N<1000 思路: 把包含至少一个其他的分到A组:否则到B组. A组的要么单 ...
- xdoj-1319 求树上任意一点的最大距离----利用树的直径
1 #include <bits/stdc++.h> using namespace std; ; vector < vector <int> > g(N); in ...
- lnmp架构、mysql的安装、php的安装、nginx相关
1.lnmp架构 2.mysql的安装: mysql5.6自动安装脚本: yum install perl-Data-Dumper.x86_64 libaio.x86_64 libaio-devel. ...
- vim 介绍安装 复制 剪切 粘贴
1. vim 产生:对于linux 文件的编辑,最初是vi,然后对于其功能的扩展,就产生了vim vim 的安装 yum install vim 2.光标的移动 用得最多的就是方向键上的 上下左右,和 ...
- SQL-表-003
注:红色代表关键字,绿色代表解释说明,蓝色代表重点: 什么是数据表? 数据表是数据库中最重要的组成部分,可以将数据表分解成字段(列)和记录(行): 数据表的增加:约束同时创建 create table ...
- C++学习(十四)(C语言部分)之 数组
上期回顾:三大循环 for while do while (循环体至少会执行一次)四大跳转 goto continue(提前跳出当前循环 进入下一个循环) break(跳出本次循环) return(跳 ...