工具:

  • 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分析过程的更多相关文章

  1. 一个杀不死的小强,kill进程无效的原因 记录故障排查过程中kill进程无效的分析过程

    今天在处理一个机器异常负载(1000+)的问题,碰到了一个从未碰到过的情况,遇到了一个异常顽固的分子.我使用了所能想到的所有杀进程的方法,却始终无法干掉这个顽固分子,最后终于在谷歌大神的指引下,干掉了 ...

  2. 一个驱动导致的内存泄漏问题的分析过程(meminfo->pmap->slabtop->alloc_calls)

    关键词:sqllite.meminfo.slabinfo.alloc_calls.nand.SUnreclaim等等. 下面记录一个由于驱动导致的内存泄漏问题分析过程. 首先介绍问题背景,在一款嵌入式 ...

  3. 记一次ORACLE的UNDO表空间爆满分析过程

    这篇文章是记录一次ORACLE数据库UNDO表空间爆满的分析过程,主要整理.梳理了同事分析的思路.具体过程如下所示: 早上收到一数据库服务器的UNDO表空间的告警邮件,最早一封是7:55发出的(监控作 ...

  4. 一次数据库hang住的分析过程

    现象: 普通用户和sysdba都无法登陆,业务中断 分析过程: 1.先做hanganalyze和systemstate dump $sqlplus -prelim "/as sysdba&q ...

  5. Android开发笔记——图片缓存、手势及OOM分析

    把图片缓存.手势及OOM三个主题放在一起,是因为在Android应用开发过程中,这三个问题经常是联系在一起的.首先,预览大图需要支持手势缩放,旋转,平移等操作:其次,图片在本地需要进行缓存,避免频繁访 ...

  6. Mysql死锁如何排查:insert on duplicate死锁一次排查分析过程

    前言 遇到Mysql死锁问题,我们应该怎么排查分析呢?之前线上出现一个insert on duplicate死锁问题,本文将基于这个死锁问题,分享排查分析过程,希望对大家有帮助. 死锁案发还原 表结构 ...

  7. Lucene的分析过程

    转自:http://www.open-open.com/lib/view/open1348033848724.html Lucene的分析过程 回顾倒排索引的构建 收集待建索引的原文档(Documen ...

  8. 记录sqoop同步失败问题解决过程,过程真的是很崎岖。(1月6日解决)

    记录sqoop同步失败问题解决过程,过程真的是很崎岖.事发原因:最近突然出现sqoop export to mysql时频繁出错.看了下日志是卡在某条数据过不去了,看异常.看sqoop生成的mr并未发 ...

  9. step_by_step_记录deepin下curl安装过程

    记录 deepin 下 curl 安装过程 wget https://curl.haxx.se/download/curl-7.55.1.tar.gz .tar.gz cd curl-/ ./conf ...

随机推荐

  1. windows 下安装composer

    安装 1.在PHP目录下,打开php.ini文件,开启openssl扩展.去掉extension=php_openssl.dll前面的分号(;) 2.把php目录添加到环境变量(和php.exe同级目 ...

  2. alpha冲刺(1/10)(作废)

    前言 队名:旅法师 作业链接 队长博客 燃尽图 会议 站立式会议照片 会议内容 陈晓彬(组长) 昨日进展: 召开会议 安排任务 博客撰写 问题困扰: 没有做项目经理的经验,在沟通方面专业知识不够. 心 ...

  3. hdu4998 Rotate 计算几何

    Noting is more interesting than rotation! Your little sister likes to rotate things. To put it easie ...

  4. LA5009 Error Curves

    题意 PDF 分析 因为这些函数都可以看成下凸的,所以总函数也是下凸的(可用反证法证明). 三分答案即可,时间复杂度\(O(100)\) 代码 #include<bits/stdc++.h> ...

  5. MySQL Lock--MySQL加锁规则

    ===================================================================== 淘宝林晓斌总结 在可重复读事务隔离级别下,加锁规则如下: 原 ...

  6. VS打包项目详细解析

       使用VS打包项目,其实很多简单.微软官方文档很详尽,故不再细述,只列出相关链接 1创建安装项目 如何:创建或添加部署项目 2 添加项目输出 如何:向部署项目中添加项 3添加用户界面 部署中的用户 ...

  7. oracle-闪回技术2

    闪回版本查询,用到了附加日志 闪回事务查询 http://blog.csdn.net/laoshangxyc/article/details/12405459 这个博客的备份与恢复可以参考 ##### ...

  8. java数据类型取值范围

    1个字节:boolean, byte 2个字节:short, char 4个字节:int, float 8个字节:long, double 按照我们初学者的理解1byte=8bit,也就是说1个字节可 ...

  9. JCP与JSR

    JCP Java Community Process ,Java社区进程,Java标准指定组织JCP成立于1998年,官网,由社会各界Java组成的社区,规划和领导Java的发展,其成员可以在这里看到 ...

  10. Node 内存控制

    Node 只能使用部分内存,原因: node 基于 V8 构建,V8 的内存管理机制限制了内存的用量. 在实际的使用中,不小心触碰到这个内存界限,会造成进程退出. V8 是通过堆来进行内存分配的:在代 ...