前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >性能优化-jmap的使用以及内存溢出分析

性能优化-jmap的使用以及内存溢出分析

作者头像
cwl_java
发布2020-02-13 10:00:25
8750
发布2020-02-13 10:00:25
举报
文章被收录于专栏:cwl_Javacwl_Java

4、jmap的使用以及内存溢出分析

前面通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容, 如:内存使用情况的汇总、对内存溢出的定位与分析。

4.1、查看内存使用情况

代码语言:javascript
复制
[root@node01 ~]# jmap ‐heap 6219
Attaching to process ID 6219, please wait... Debugger attached successfully.
Server compiler detected.
JVM version is 25.141‐b15

using thread‐local object allocation. Parallel GC with 2 thread(s)

Heap Configuration: #堆内存配置信息MinHeapFreeRatio	= 0
MaxHeapFreeRatio	= 100
MaxHeapSize	= 488636416 (466.0MB)
NewSize	= 10485760 (10.0MB)
MaxNewSize	= 162529280 (155.0MB)
OldSize	= 20971520 (20.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 = 123731968 (118.0MB)
used	= 1384736 (1.320587158203125MB) free	= 122347232 (116.67941284179688MB) 1.1191416594941737% used
From Space:
capacity = 9437184 (9.0MB) used	= 0 (0.0MB)
free	= 9437184 (9.0MB)
0.0% used To Space:
capacity = 9437184 (9.0MB) used	= 0 (0.0MB)
free	= 9437184 (9.0MB)

0.0% used
PS Old Generation #年老代
capacity = 28311552 (27.0MB)
used = 13698672 (13.064071655273438MB) 
free = 14612880 (13.935928344726562MB) 48.38545057508681% used
13648 interned Strings occupying 1866368 bytes.

4.2、查看内存中对象数量及大小

代码语言:javascript
复制
#查看所有对象,包括活跃以及非活跃的jmap ‐histo <pid> | more

#查看活跃对象
jmap ‐histo:live <pid> | more
[root@node01 ~]# jmap ‐histo:live 6219 | more num	#instances	#bytes	class name
‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐‐ 1:	37437	7914608	[C
2:	34916	837984	java.lang.String
3:	884	654848	[B
4:	17188	550016	java.util.HashMap$Node
5:	3674	424968	java.lang.Class
6:	6322	395512	[Ljava.lang.Object;
7:	3738	328944	java.lang.reflect.Method
8:	1028	208048	[Ljava.util.HashMap$Node;
9:	2247	144264	[I
10:	4305	137760
java.util.concurrent.ConcurrentHashMap$Node
11:	1270	109080	[Ljava.lang.String;
12:	64	84128
[Ljava.util.concurrent.ConcurrentHashMap$Node;
13:	1714	82272	java.util.HashMap
14:	3285	70072	[Ljava.lang.Class;
15:	2888	69312	java.util.ArrayList
16:	3983	63728	java.lang.Object
17:	1271	61008
org.apache.tomcat.util.digester.CallMethodRule
18:	1518	60720	java.util.LinkedHashMap$Entry
19:	1671	53472
com.sun.org.apache.xerces.internal.xni.QName
20:	88	50880	[Ljava.util.WeakHashMap$Entry;
21:	618	49440	java.lang.reflect.Constructor
22:	1545	49440	java.util.Hashtable$Entry
23:	1027	41080	java.util.TreeMap$Entry
24:	846	40608
org.apache.tomcat.util.modeler.AttributeInfo 25:	142	38032	[S
26:	946	37840	java.lang.ref.SoftReference
27:	226	36816	[[C


#对象说明
B  byte
C  char
D  double
F	float
I   int
J  long
Z	boolean
[	数组,如[I表示int[] [L+类名 其他对象

4.3、将内存使用情况dump到文件中

有些时候我们需要将jvm当前内存中的情况dump到文件中,然后对它进行分析,jmap也是支持dump到文件中的。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看到已经在/tmp下生成了dump.dat的文件。

4.4、通过jhat对dump文件进行分析

在上一小节中,我们将jvm的内存dump到文件中,这个文件是一个二进制的文件,不方便查看,这时我们可以借助于jhat工具进行查看。

代码语言:javascript
复制
#用法:
jhat ‐port <port> <file>

# 示例:
[root@node01 tmp]# jhat ‐port 9999 /tmp/dump.dat Reading from /tmp/dump.dat...
Dump file created Mon Sep 10 01:04:21 CST 2018 Snapshot read, resolving...
Resolving 204094 objects...
Chasing references, expect 40 dots........................................
Eliminating duplicate references........................................
Snapshot resolved.
Started HTTP server on port 9999 Server is ready.

打开浏览器进行访问:http://192.168.40.133:9999/

在这里插入图片描述
在这里插入图片描述

在最后面有OQL查询功能

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.5、通过MAT工具对dump文件进行分析

4.5.1、MAT工具介绍

MAT(Memory Analyzer Tool),一个基于Eclipse的内存分析工具,是一个快速、功能丰富的JAVA heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗。使用内存分析工具从众多的对象中进行分析,快速的计算出在内存中对象的占用大小,看看是谁阻止 了垃圾收集器的回收工作,并可以通过报表直观的查看到可能造成这种结果的对象。

官网地址:https://www.eclipse.org/mat/

在这里插入图片描述
在这里插入图片描述

4.5.2、下载安装

下载地址:https://www.eclipse.org/mat/downloads.php

在这里插入图片描述
在这里插入图片描述

将下载得到的MemoryAnalyzer-1.8.0.20180604-win32.win32.x86_64.zip进行解压:

在这里插入图片描述
在这里插入图片描述

4.5.3、使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查看对象以及它的依赖:

在这里插入图片描述
在这里插入图片描述

查看可能存在内存泄露的分析:

在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 4、jmap的使用以及内存溢出分析
    • 4.1、查看内存使用情况
      • 4.2、查看内存中对象数量及大小
        • 4.3、将内存使用情况dump到文件中
          • 4.4、通过jhat对dump文件进行分析
            • 4.5、通过MAT工具对dump文件进行分析
              • 4.5.1、MAT工具介绍
              • 4.5.2、下载安装
              • 4.5.3、使用
          相关产品与服务
          腾讯云 BI
          腾讯云 BI(Business Intelligence,BI)提供从数据源接入、数据建模到数据可视化分析全流程的BI能力,帮助经营者快速获取决策数据依据。系统采用敏捷自助式设计,使用者仅需通过简单拖拽即可完成原本复杂的报表开发过程,并支持报表的分享、推送等企业协作场景。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档