工具:

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

8: 59193 7588736

9: 6105 7139824

10: 39329 6230272 [Ljava.util.HashMap$Entry;

11: 255466 6131184 java.lang.String

12: 182746 5847872 [Lorg.wltea.analyzer.dic.DictSegment;

13: 6097 4220448

14: 5064 3900032

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进制,后面需要用到。

[[email protected] bin]$ printf "%x\n" 10831

2a4f

使用jstack进行分析

[[email protected] 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

原文:http://www.cnblogs.com/huangfox/p/4354991.html

java oom分析_记录一次OOM分析过程相关推荐

  1. 分布分析和分组分析_如何通过群组分析对用户进行分组并获得可行的见解

    分布分析和分组分析 数据分析 (DATA ANALYSIS) Being a regular at a restaurant is great. 乙 eing定期在餐厅是伟大的. When I sta ...

  2. 哈工大威海算法设计与分析_计算机算法设计与分析第一章 算法概述

    晓强Deep Learning的读书分享会,先从这里开始,从大学开始.大家好,我是晓强,计算机科学与技术专业研究生在读.我会不定时的更新我的文章,内容可能包括深度学习入门知识,具体包括CV,NLP方向 ...

  3. 单调谐回路谐振放大器等效电路分析_手把手教你如何分析三极管电路

    三极管有静态和动态两种工作状态.未加信号时三极管的直流工作状态称为静态,此时各极电流称为静态电流.给三极管加入交流信号之后的工作电流称为动态工作电流,这时三极管是交流工作状态,即动态. 一个完整的三极 ...

  4. Java 性能优化实战记录(3)--JVM OOM的分析和原因追查

    前言: C/C++的程序员渴望Java的自由, Java程序员期许C/C++的约束. 其实那里都是围城, 外面的人想进来, 里面的人想出去. 背景: 作为Java程序员, 除了享受垃圾回收机制带来的便 ...

  5. java学习里程碑_记录您的里程和社区运行情况:Java EE 7真实体验

    java学习里程碑 miles2run.org是跟踪跑步活动并与亲朋好友共享的简便方法. 可以创建然后跟踪基于天或基于距离的目标. 它还允许创建社区运行目标,并使多个跑步者参与并跟踪他们朝着该目标的活 ...

  6. java gis项目_记录:GIS常用开发工具

    一.GIS软件 ArcGIS Erdas Envi QGIS:开源 国产:超图.中地MapGIS 二.二次开发编程语言 页面前端:html.css.JavaScript .JQuery.Bootstr ...

  7. Java 性能优化实战记录(1)---定位并分析耗cpu最多的线程

    1) jps     列出相关的java进程, 以及对应的pid     也可以使用如下命令来尝试     ps aux | grep java --color 2) top -Hp <pid& ...

  8. java jps监控_记录java虚拟机性能监控工具(jps与jstat)的使用

    (1) jps(Java Virtual Machine Process Status) 虚拟机进程状况工具; 1.1 显示运行的Java应该程序的进程ID jps -q #86589 #77567 ...

  9. protobuf在java中使用_记录:Protocol Buffers(protobuf)在Java开发中使用

    1.编写一个.proto文件命名为:addressbook.proto,该文件内容来自protocal-buffers官网 2.使用protoc-2.6.0-win32.zip解压后的protoc.e ...

  10. java gps轨迹_记录 GPS 轨迹 LogGPS

    模板以行为单位,行中从'//'开始,之后的都是注释部分,不会输出 一个轨迹文件由头信息和多个轨迹组成,一个轨迹由多个位置组成,模板描述如何输出这些部分. 从模板的第一行开始输出,注释不输出,命令是无输 ...

最新文章

  1. 用小神经网络和光谱仪优化关键词识别
  2. java.util.date_关于java中java.util.Date(急)
  3. 红帽技术开放日:参与开源社区不只有贡献代码这一种方式
  4. Python函数默认参数陷阱
  5. Django框架(10.Django中的模型类的定义以及模型类字段属性和选项)
  6. Linux网络编程 | 定时事件 :Linux常见定时方法、定时器链表、空闲断开
  7. xshell安装mysql步骤_xshell怎么搭建mysql
  8. j2me怎么运行java_Eclipse开发J2ME环境安装及配置
  9. 使用foobar2000将cue文件分割wav、ape、flac无损音乐
  10. DDOS攻击工具有哪些?怎么防御DDOS攻击?
  11. 北斗卫星广播星历计算卫星位置
  12. 【微积分的本质|笔记】隐函数求导的意义与理解
  13. js判断时间是否在某一时间段内
  14. TP4333TPOWER应急灯同步充放移动电源IC解决方案
  15. 抢鞋软件bot服务器系统,抢鞋机器人bot app
  16. 微信公众号--根据用户opneId获取用户信息
  17. linux服务器抓包实例
  18. Python换钱的最少货币数
  19. CSS3美化字体样式
  20. 经济学计算机考什么,计算机专业考人大经济学复习经验谈

热门文章

  1. ZStack CMP多云管理平台有何不同?
  2. 【回归预测】基于matlab Tent混沌映射改进的麻雀搜索算法SSA优化BP神经网络回归预测【含Matlab源码 1707期】
  3. 【TSP】基于matlab免疫算法求解31城市旅行商问题【含Matlab源码 1149期】
  4. 坦克位置伺服系统分析与设计_伺服电机噪音及不稳定分析
  5. 日本初创公司Elix正在使用AI研究COVID-19药物
  6. 用于小儿肺炎检测的无代码AI
  7. 如何查询远程计算机的名称,如何解析远程计算机名称以获取它在java中的IP地址...
  8. 那些年我们看不懂的论文
  9. wpf 引用的图片文件打包后找不到_PyQT5打包:用PyInstaller遇到的坑
  10. oracle池式连接超时,c# – Oracle Data Provider for .NET:连接请求超时