工具:

  • 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-b04using parallel threads in the new generation.
using thread-local object allocation.
Concurrent Mark-Sweep GCHeap Configuration:MinHeapFreeRatio = 40MaxHeapFreeRatio = 70MaxHeapSize      = 3145728000 (3000.0MB)NewSize          = 524288000 (500.0MB)MaxNewSize       = 524288000 (500.0MB)OldSize          = 5439488 (5.1875MB)NewRatio         = 2SurvivorRatio    = 8PermSize         = 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% used19254 interned Strings occupying 2351584 bytes.

jmap -heap 只能查看jvm各个区的详细使用情况,内存中到底有哪些数据(咬着old区不放)得用jmap -histo进行分析。

jmap -histo[:live] pid

例如:

num     #instances         #bytes  class name
----------------------------------------------1:         32727       88492856  [I2:        369677       62058808  [C3:        145200       54408968  [B4:        545638       17460416  java.util.HashMap$Entry5:        451316       14442112  org.wltea.analyzer.dic.DictSegment6:        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.String12:        182746        5847872  [Lorg.wltea.analyzer.dic.DictSegment;13:          6097        4220448  <instanceKlassKlass>14:          5064        3900032  <constantPoolCacheKlass>15:        100084        3202688  org.apache.lucene.document.LazyDocument$LazyField16:         78719        3148760  java.util.LinkedHashMap$Entry17:         11980        3120656  [S18:        122352        2936448  java.util.ArrayList19:          9747        2740192  [J20:         95649        2295576  java.util.LinkedList$Node21:         53484        2139360  org.apache.lucene.document.FieldType22:        125687        2010992  java.lang.Character23:         41021        1969008  org.apache.lucene.analysis.tokenattributes.PackedTokenAttributeImpl24:         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. 记录一次elasticsearch挂掉之后无法启动 kibana Status: Red -分析过程

    记录一次elasticsearch挂掉之后无法启动 kibana Status: Red -分析过程 现象 现象一 kibana Status: Red 现象二 elasticsearch 集群挂掉 ...

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

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

  3. 大量LAST_ACK 的分析过程

    2019独角兽企业重金招聘Python工程师标准>>> 记录一下自己的思想过程 现象:在netstat的时候发现大量处于LAST_ACK状态的TCP连接,达到在ESTABLISHED ...

  4. 生信分析过程中这些常见文件的格式以及查看方式你都知道吗?

    生信分析过程中,会与很多不同格式的文件打交道,除了原始测序数据fastq之外,还需要准备基因组文件fasta格式和基因注释文件gtf格式.在分析的过程中还会有众多中间文件的生成,如bed.bed12. ...

  5. sqlplus登录缓慢的问题分析过程及解决小记

    点击上方"蓝字" 关注我们,享更多干货! 一.问题描述 近日在某客户现场进行巡检,发现有一个系统在进行sqlplus / as sysdba登录的时候特别缓慢.多次测试,最长时间可 ...

  6. 【华为云技术分享】避坑指南:关于SPDK问题分析过程

    [前言] 这是一次充满曲折与反转的问题分析,资料很少,代码很多,经验很少,概念很多,当内核态,用户态,DIF,LBA,大页内存,SGL,RDMA,NVME和SSD一起迎面而来的时候,问题是单点的意外, ...

  7. 【编译原理笔记09】语法制导翻译:语法制导翻译方案,在非递归的预测分析过程中进行翻译

    本次笔记内容: 5-5 语法制导翻译方案 5-6 在非递归的预测分析过程中进行翻译 本节课幻灯片,见于我的 GitHub 仓库:第9讲 语法制导翻译_2 文章目录 语法制导翻译方案 语法制导翻译方案 ...

  8. 生信分析过程中这些常见文件(fastq/bed/gtf/sam/bam/wig)的格式以及查看方式你都知道吗?

    生信分析过程中,会与很多不同格式的文件打交道,除了原始测序数据fastq之外,还需要准备基因组文件fasta格式和基因注释文件gtf格式.在分析的过程中还会有众多中间文件的生成,如bed.bed12. ...

  9. 用python爬取全国和全球疫情数据,并进行可视化分析(过程详细代码可运行)

    用Python爬取最新疫情数据 这次重大疫情,每时每刻数据都有可能变化,这篇博文将为大家讲解如何爬取实时疫情数据,并且分析数据,作出数据可视化的效果. 报告梗概: 对中国疫情分析 1.1 展示各省疫情 ...

最新文章

  1. 使用split_size优化的ODPS SQL的场景
  2. 规格示例_最佳引导示例
  3. android中使用setVideoURI()播放视频
  4. WIN10完全卸载anaconda
  5. 如何在CAD中实现影像与矢量叠加套合(四参数法)
  6. 最新毕业设计参考文献大全
  7. Apparent connection leak detected
  8. java读取文件(java读取文件指定内容)
  9. 苹果手机通过iCloud导出通讯录导入到安卓手机 教程
  10. SpringBoot的优点
  11. 如何修改VMware虚拟机的配置文件.vmx
  12. 村庄规划gis基础操作详细步骤
  13. 猴子选大王 java_猴子选大王(java求解) | 学步园
  14. 去除.gif图片中的文字
  15. 全球与中国色选机行业深度研究调查分析报告
  16. EOS Contract 合约
  17. 《振动力学基础与MATLAB应用》课后练习-第一章
  18. java pdf增删改查_035、Java--MySQL的增删改查约束
  19. 为什么工厂管理那么难?
  20. SQL OR AND 优先级问题

热门文章

  1. 客户关系管理:客户关系选型
  2. window powershell 获取前后日期,格式化日期
  3. H5的学习从0到1-H5的实体(14)
  4. [log.js]一个node端带文件路径和颜色的console.log
  5. [MySQL]增加用户 授权 远程登录
  6. [Node]node.js 文件操作
  7. PHP实现将任意尺寸的图片裁剪后等比缩放到任意尺寸的透明图片上,并实现图片翻转...
  8. 爬虫必备工具,掌握它就解决了一半的问题
  9. 熟悉常用的HDFS操作
  10. Asp.net MVC验证那些事(4)-- 自定义验证特性