1、jdk有基础工具
2、MAT分析杜姆
3、虚拟机实时监控
4、遇到过OOM
内存溢出有哪些1、Java堆溢出? (Java.lang.out of memory error 3360 javaheapspace ) )。
2、PermGen space
3、堆栈溢出错误(虚拟机无法提供足够的内存空间扩展堆栈) )。
4、直接崩溃
内存溢出和泄漏内存溢出内存溢出:
是指程序申请内存时,没有足够的内存空间来使用,从而产生内存输出;
内存泄漏内存leak,
指程序申请内存后,无法释放申请的内存空间。 内存泄漏的危害是可以忽略的,但是内存泄漏的堆积结果很严重,无论有多少内存,迟早都会被夺走光
一、jdk自带基础工具
1、jps (javavirtualmachineprocessstatustool )。
实际上,这是最常用的命令。 下面介绍的许多小工具都是在使用jps查找当前有哪些Java进程并获取该Java进程的id后进行处理的。 jps [options] [hostid]
-q不输出类名、Jar名或传递的main方法的参数
输出传递给main方法的参数
-l输出main类或Jar的完全限制名称
-v输出传递给JVM的参数[ root @ izbp 11 B3 erz reb 4x i5 utv ZZ/] # jps-ml
2611/usr/lib/Jenkins/Jenkins.war-- log file=/var/log/Jenkins.log-- webroot=/var/cache/cache/war 740 org.Apache.catalina.startup.bootstrapstart 19942 org.Apache.zookeeper.server.quorum.quorumpeermain/mnt zoo.CFG 20537 sun.tools.jps.jps-ml 11309 org.sonatype.nexus.bootstrap.jsw.jsw launcher./conf/jetty.xmml
2、jstack
jstack主要用于显示Java进程中的线程堆栈信息。 语法如下:
jstack [option] pid
jstack [ option ]可执行核心
JTA CK [ option ] [服务器- id @ ] remote-hostname-or-IP
PID : Java APP应用程序的进程号。 通常可以通过jps取得;
executable:是coredump的java可执行程序$JAVA_HOME/xsdtk/java;
用core:打印的core文件(从jvm崩溃生成的core文件、hs _ err _ PID log文件中查看)
emote-hostname-or-ip:远程调试服务器的名称或IP
服务器- id :的唯一id。 如果一台主机上有多个远程调试服务; 选项的说明如下。
-l,打印多余的锁定信息。 发生死锁时,可以通过jstack -l pid观察锁定的保持情况
-m不仅输出Java堆栈信息,还输出C/C堆栈信息。 例如,朴素方法
jstack -l pid
查看耗时的线程
顶级惠普PID
printf '%xn' 21226
十六进制数字,获取需要时间的线程id
52ec
获取需要时间的信息
[ root @2logs ] # jstack 21222|grep 52e c
' gctaskthread #3(parallel GC (OS _ prio=0tid=0x 00007 fee 24027000 NID=0x 52 EC runnable
3、jmap (内存映射) jmap导出堆内存,使用jhat进行分析
jmap [选项] PID
jmap [选项]可执行核心
jmap [ option ] [服务器- id @ ] remote-hostname-or-IP
参数如下: - heap :打印JVM heap时
- histo :打印JVM heap的直方图。 其输出信息包括类名、对象数和对象的占用大小。
-histo:live
:同上,但是只打印存活对象的情况-permstat:打印permanent generation heap情况(持久代)
输出 类加载器名称、对象是否存活、对象地址、父类加载器、已加载的类大小等信息
-dump: 打印 dump(内存使用) 日志文件
jmap -heap pid
查看进程堆内存使用情况:包括使用的GC算法、堆配置参数和各代中堆内存使用:
[root@iZbp11b3erzreb4xi5utvzZ ~]# jmap -heap 32326
Attaching to process ID 32326, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.161-b12
using thread-local object allocation.
Parallel GC with 4 thread(s)
Heap Configuration:
MinHeapFreeRatio = 0
MaxHeapFreeRatio = 100
MaxHeapSize = 536870912 (512.0MB)
NewSize = 201326592 (192.0MB)
MaxNewSize = 201326592 (192.0MB)
OldSize = 335544320 (320.0MB)
NewRatio = 2
SurvivorRatio = 8
MetaspaceSize = 21807104 (20.796875MB)
CompressedClassSpaceSize = 1073741824 (1024.0MB)
MaxMetaspaceSize = 17592186044415 MB
G1HeapRegionSize = 0 (0.0MB)
Heap Usage:
PS Young Generation
Eden Space:
capacity = 121634816 (116.0MB)
used = 105409240 (100.52608489990234MB)
free = 16225576 (15.473915100097656MB)
86.6604180171572% used
From Space:
capacity = 38797312 (37.0MB)
used = 6225208 (5.936820983886719MB)
free = 32572104 (31.06317901611328MB)
16.045462118612754% used
To Space:
capacity = 39845888 (38.0MB)
used = 0 (0.0MB)
free = 39845888 (38.0MB)
0.0% used
PS Old Generation
capacity = 335544320 (320.0MB)
used = 19401584 (18.502792358398438MB)
free = 316142736 (301.49720764160156MB)
5.782122611999512% used
19968 interned Strings occupying 2526840 bytes.
jmap -histo[:live] pid
查看堆内存中的对象数目、大小统计直方图,如果带上live则只统计活对象
[root@iZbp11b3erzreb4xi5utvzZ ~]# jmap -histo 32326
num #instances #bytes class name
----------------------------------------------
1: 351157 49044840 [C
2: 140145 26768472 [B
3: 30637 18927560 [I
4: 191987 4607688 java.lang.String
5: 46693 3523560 [Ljava.lang.Object;
6: 27813 2447544 java.lang.reflect.Method
7: 30591 2447048 [S
8: 58522 2340880 java.util.TreeMap$Entry
9: 81040 1683096 [Ljava.lang.Class;
10: 38542 1541680 java.util.HashMap$KeyIterator
11: 44546 1069104 java.lang.StringBuilder
12: 18696 1046976 java.util.concurrent.ConcurrentHashMap$KeyIterator
13: 37638 903312 java.util.Collections$UnmodifiableCollection$1
14: 10197 896216 [Ljava.util.HashMap$Node;
15: 7902 879416 java.lang.Class
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[root@iZbp11b3erzreb4xi5utvzZ ~]# jmap -dump:format=b,file=/mnt/d.bat 32326
Dumping heap to /mnt/d.bat ...
Heap dump file created
问题:
这些工具真靠谱吗?
大应用异常下 直接使用jmap jstack 根本无法加载内存信息或者耗时很久?
有什么可以替代吗?
gcore?
二、MAT 分析Dump
Dump 是什么Dump是反应Java堆使用情况的内存镜像,其中主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等。 一般,在内存不足、GC异常等情况下,我们就会怀疑有内存泄漏。这个时候我们就可以制作堆Dump来查看具体情况。分析原因。
Dump 文件的分析有多种方式1、命令jhat 分析(麻烦)
2、VisualVM 工具分析
3、MAT 分析
MAT分析
J2SE中提供了一个简单的命令行工具来对java程序的cpu和heap进行 profiling(剖析面),叫做HPROF
Shallow Size
对象自身占用的内存大小,不包括它引用的对象。
针对非数组类型的对象,它的大小就是对象与它所有的成员变量大小的总和。当然这里面还会包括一些java语言特性的数据存储单元。
针对数组类型的对象,它的大小是数组元素对象的大小总和。
Retained Size
Retained Size=当前对象大小+当前对象可直接或间接引用到的对象的大小总和。(间接引用的含义:A->B->C, C就是间接引用)
换句话说,Retained Size就是当前对象被GC后,从Heap上总共能释放掉的内存。
不过,释放的时候还要排除被GC Roots直接或间接引用的对象。他们暂时不会被被当做Garbage。
List objects --> with outgoing references
:查看当前对象持有的外部对象引用(在对象关系图中为从当前对象指向外的箭头)
List objects --> with incoming references
:查看当前对象被哪些外部对象所引用(在对象关系图中为指向当前对象的箭头)
三、VM 实时监控
四、遇到过OOM
1、刚开始用eclipse 开发 ,没事就本地OOM
2、DateForm oom
3、POI 导出xls 包含图片
4、万恶的死循环
5、hashmap
6、websocket 大内存长久占用
事故:
1、遇到fullgc 了,oom了?完蛋
2、抓不出来dump ?完蛋
3、jmap、jstack 都用不了?完蛋
1、记录时间点
2、抓住一切日志可用日志(应用日志)
3、慢慢分析
参考
GC:https://www.cnblogs.com/wozixiaoyao/p/5658950.html
jstack:https://www.jianshu.com/p/08b816d9b34f
executable core:https://lydawen.iteye.com/blog/2215300
内存划分:https://www.cnblogs.com/haitaofeiyang/p/8392268.html
mat:http://www.cnblogs.com/trust-freedom/p/6744948.html#histogram
oom:https://mp.weixin.qq.com/s/kJe8WScwB4XcqRNE2vM7EA?