linux java内存分析_Java内存分析利器MAT使用详解
这是一篇阅读MAT helper的笔记。Heap dump是Java进程在特定时间的一个内存快照。通常在触发heap dump之前会进行一次full gc,这样dump出来的内容就包含的是被gc后的对象。
dump文件包含的内容:
1,全部的对象:类,域,原生值和引用;
2,全部的类:classloader,类名,超类,静态域;
3,GC root:被JVM定义的可触达的对象;
4,线程栈和本地变量:线程的call stack,本地对象每帧的信息。
dump文件不包含内存的分配信息,因此无法查询谁创建了哪个对象这样的信息。
Shallow heap是一个对象占用的内存空间,一个对象需要32或者64bits。
Retained set of X是X在被jvm gc回收后被remove的一组object。
Retained heap of X是在retained set of X中的所有对象的shallow heap size的和。换句话说就是保持X活着需要的内存空间。
通俗的讲,shallow heap是一个对象在内存中的实际空间,而retained heap是一个对象被gc回收后内存释放出来的空间。
这张图可以看懂什么是leading set什么是retained set。
Dominator tree:定义一个对象x dominate 对象y,当每一条从root开始到y的路径都经过x。说白了就是只要有y对象的存活,那么一定会有一个x对象。Dominator tree就是将对象引用图转换成的树形结构。帮助发现在对象间保持alive的依赖,同时也能识别出retained内存的最大的chunk。 Immediate dominator x of y是离y最近的dominator。
Dominator tree有几个属性:
1,对象x的子树包含的对象(x dominate的对象集),代表了x的retained set;
2,如果x是y的immediate dominator,那么x的immediate dominator同样dominate y,以此类推;
3,dominate tree中的边不代表对象引用图里对应的边,并非严格的直接的对象引用。
这张图反应了一个对象引用图转换成dominator tree的示例。
Gc root:一个gc根就是一个对象,这个对象从堆外可以访问读取。以下一些方法可以使一个对象成为gc根。
1,System class:被Bootstrap或者system类加载器加载的类,比如rt.jar里的java.util.*;
2,JNI local:native代码里的local变量,比如用户定义的JNI代码和JVM的内部代码;
3,JNI global:native代码里的global变量;
4,Thread block:当前活跃的线程block中引用的对象;
5,Thread:已经启动并且没有stop的线程;
6,busy monitor:被调用了wait()或者notify()或者被synchronized同步的对象,如果是synchronized方法,那么静态方法指的类,非静态方法指的是对象;
7,java local:local变量,比如方法的入参和方法内创建的变量;
8,native stack:native代码里的出入参数,比如file/net/IO方法以及反射的参数;
9,finalizable:在一个队列里等待它的finalizer 运行的对象;
10,unfinalized:一个有finalize方法的对象,还没有被finalize,同时也没有进入finalizer队列等待finalize;
11,unreachable:不会被触碰到的对象,在MAT里被标记为root用来retain object,否则是不会在分析中出现的;
12,java stack frame:java栈帧包含了本地变量,当dump被解析时且在preferences里设置过把栈帧当做对象,这时才会产生;
13,unknown:位置的root类型。
接下来是一些获取dump的方法:
1,在oom时dump:JVM参数:-XX:+HeapDumpOnOutOfMemoryError
2,交互式环境下dump:
1)JVM参数:-XX:+HeapDumpOnCtrlBreak
2)用外部tools:jmap -dump:format=b,file=
3)用外部tools:jconsole
4)用外部工具:MAT
5)kill -3
6)jstack -l >
一些排查方法:
1,通过top consumers查找大对象,可以按照class、classloader和package进行group by;
2,通过immediate dominator找到责任对象,对于快速定位一组对象的持有者非常有用,这个操作直接解决了“谁让这些对象alive”的问题,而不是“谁有这些对象的引用”的问题,更直接高效;
3,运行classloader分析,这个重要性体现在亮点:第一,应用使用不同的classloader加载类,第二,不同 classloader加载的类存储在不同的永久代,这理论上也是可以被回收的。当有一个类被不同的classloader加载时,这时要根据各自 loader下的instance数量判断哪个loader更重要,从而要把另一个回收掉;
4,分析线程,本身heap dump里包含了thread信息,可以通过MAT来查看threads 的overview和detail,detail中有线程的堆内存信息,也有线程栈,同时还包含了操作系统本地栈。假设不做heap dump,我们检查到系统有问题,如何通过线程的角度来排查呢?首先top -H -p 以线程的模式查看java应用的运行情况,找到占用cpu或者内存大的线程,记录线程id,然后printf %x 转为16进制,再jstack -l > thread.log把java进程的thread dump出来,从里面找到tid,分析是哪个线程占用了系统资源。
5,分析java容器类,因为java的容器类是最常用来存储对象的,所以理论上发生内存泄露的风险也最高。可以从几个角度来 看:1)array填充率查询(填充率fill ratio是数组中非空元素的比例),打印非原生类型数组的填充率频率分布,从而排查系统中array的利用率;2)数组按照size分组查询,打印一个 按size分组的直方图;3)collection的填充率查询,ArrayList/HashMap/Hashtable/Properties /Vector/WeakHashMap/ConcurrentHashMap$Segment;4)collection按照size分组直方图;5) 查看一个list里的所有对象;6)查看hashmap里的所有对象;7)查看hashset里的对象;8)检查map的碰撞率;9)检查所有只有一个常 量的array。
6,分析Finalizer,1)查询finalizer正在处理的对象;2)查询finalizer准备处理的对象;3)直接查看finalizer线程;4)查看finalizer线程的thread local对象。
相关文章:

[js] MD5算法
js版md5算法: /** * * MD5 (Message-Digest Algorithm) * http://www.webtoolkit.info/ * **/var MD5 function (string) {function RotateLeft(lValue, iShiftBits) {return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));}function AddUn…

vue中的时间过滤器
//全局过滤器,进行时间的格式化//所谓的全局过滤器即使所有的vue实例都共享的Vue.filter(dateFormat ,function(dateStr, pattern""){//根据给定的时间字符串,得到特定的时间var dt new Date(dateStr)//yyy---mm-ddvar y dt.getFullYear() /…

windows线程同步-原子操作-Interlocked系列函数(用户模式)
Interlocked系列函数用来保证原子访问。InterlockedExchangeAdd提供保证long类型的原子操作。InterlockedExchangeAdd64提供long long 64位的原子操作。搞不懂为什么不提供int类型的,int类型转换成long类型就是2个不同内存地址的变量,再来对long类型进行…

java 比较器comparator_Java中比较器的使用Compare和Comparator
Comparable和Comparator接口都是为了对类进行比较,众所周知,诸如Integer,double等基本数据类型,java可以对他们进行比较,而对于类的比较,需要人工定义比较用到的字段比较逻辑。可以把Comparable理解为内部比…

20160127:开始学VBA:(三)、判断语句
IIF函数判断 Sub 判断4() Range("a3") IIf(Range("a1") < 0, "负数或零", "负数")End Sub Sub 判断1() 单条件判断 If Range("a1").Value > 0 Then Range("b1") "正数" Else Range(…

java jdk中的归并排序实现
在Arrays.java中的sort中public static void sort(Object[] a, int fromIndex, int toIndex) {if (LegacyMergeSort.userRequested)legacyMergeSort(a, fromIndex, toIndex);elseComparableTimSort.sort(a, fromIndex, toIndex);}/** To be removed in a future release. */pri…

LeetCode.3-最长无重复字符子串(Longest Substring Without Repeating Characters)
这是悦乐书的第341次更新,第365篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Medium级别的第2题Longest Substring Without Repeating Characters(顺位题号是3)。给定一个字符串,找到最长无重复字符子字符串的长度。例如&am…

java代码操作git_JGit--实现Git命令操作的Java API
问题来源:最近在做一个项目,其中有一块需要用户上传代码到服务器中,然后分析用户所传的代码,传代码最直接的方式就是用户打个包上传,但是后期再分析代码的时候还要代码实现解压上传的代码,操作起来比较复杂。解决方案与…

Python学习(一) 安装,环境搭建,IDE
第一篇废话太多了,我的博客最主要的是给自己看的,大家觉得还凑合也可以看看,能说自己想法的就更好了,因为一个人的思想是有局限性的。集思广益,自己的认知才不会被禁锢。 注:其他的系统没装,在W…

桑叶黑芝麻糊,从头到脚通补
人体通补手册:丹道医学中的养命之术/武国忠著. —南京:江苏人民出版社,2009.8(国医健康绝学系列)ISBN 978-7-214-05938-3 桑叶黑芝麻糊,从头到脚通补 桑叶味甘、苦,性寒,可以入肝、肺经…

CSS jQuery制作漂亮的文字模糊效果
CSS3漂亮的模糊效果 运用CSS3 和 jQuery 以及其他javascript框架,将 CSS模糊效果发挥到极致. 本文底部可提供下载以及预览,并且包含了所有需要的文件包。 1. 烟雾模糊效果: 2.彩色灯晕效果 3. 鼠标悬浮模糊效果 4, 模糊效果 5,随机…

java 三维全景_3D开发-全景技术基础
全景,英文名(Panorama),又被称为3D实景,是一种新兴的富媒体技术,其与视频,声音,图片等传统的流媒体最大的区别是“可操作,可交互”。 全景分为虚拟现实和3D实景两种。虚拟现实是利用maya等软件&…

HAProxy基础
HAProxy HAProxy是法国开发者Willy Tarreau 开发的一个开源然教案,是一款具备高并发、高性能的TCP和HTTP负载均衡器,支持基于cookie的持久性,自动故障切换,支持正则表达式及web状态统计。 HAProxy功能 HAProxy是TCP/HTTP反向代理服…

不试过你怎么知道?开博第一篇(本人菜鸟也,高手可以飘过)
我是菜鸟,一直都是,只不过以前比现在更菜而已。 注册博客园居然有5个月了。昨晚看过一位迷茫中的仁兄30岁了不知道干什么。。我跟他差不多。 既然他可以申请开博,为什么我就不试试看呢? 试试看又不会损失什么?被拒绝又…

java 类隔离_微服务架构中zuul的两种隔离机制实验
ZuulException REJECTED_SEMAPHORE_EXECUTION 是一个最近在性能测试中经常遇到的异常。查询资料发现是因为zuul默认每个路由直接用信号量做隔离,并且默认值是100,也就是当一个路由请求的信号量高于100那么就拒绝服务了,返回500。信号量隔离既…

技术网站/博客网址收藏
1、W3CHtmlDom标准 http://www.w3school.com.cn/htmldom/dom_obj_window.asp2、JavaScirpt参考教程:http://www.iselong.com/online/ebooks/javascript/3、CSS手册http://www.w3school.com.cn/css/css_positioning_floating.asp4、Lucene查询语句http://tech.ddvip.…

TableStore: 海量结构化数据分层存储方案
2019独角兽企业重金招聘Python工程师标准>>> 前言 表格存储是阿里云自研分布式存储系统,可以用来存储海量结构化、半结构化的数据。表格存储支持高性能和容量型两种实例类型。高性能使用SSD的存储介质,针对读多写多的场景都有较好的访问延时。…

计算 webView 显示内容后实际高度
两种方法,方法1可以得到内容的实际高度,方法2得到了将内容显示完整后的 webView 的尺寸(包含 UIEdgeInsets) - (void)webViewDidFinishLoad:(UIWebView *)wb{//方法1CGFloat documentWidth [[wb stringByEvaluatingJavaScriptFro…

另一个.java文件调用_java - 如何调用另一个类“写文件”的方法? - SO中文参考 - www.soinside.com...
在我的Android应用程序,我想有一类处理所有“写入/读取到文本文件”的行动。所以,我根本就调用我的readUserFile.java文件我想的方法。但我的方法将不会在该文件中工作?创建一个文件在我的MainActivity工作正常,但不会在我的readU…

编译器实现(五)
1.自底向上的分析 最普通的自底向上算法称作LR(1)分析( LR(1)parsing) ( L表示由左向右处理输入,R表示生成了最右推导,而数字1则表示使用了先行的一个符号)。 1.1自底向上分析概览 自底向上的分析程序使用了显式栈来完成分析,这与非递归的自顶…

Python字符串的修改以及传参
前两天去面试web developer,面试官提出一个问题,用JavaScript或者Python实现字符串反转,我选择了Python,然后写出了代码(错误的): 1 #!/usr/bin/env python2 #-*-coding:utf-8-*-3 __author__ …

充血模式和贫血模式
贫血模型:是指领域对象里只有get和set方法,或者包含少量的CRUD方法,所有的业务逻辑都不包含在内而是放在Business Logic层。 优点是系统的层次结构清楚,各层之间单向依赖,Client->(Business Facade)->Busin…

java 方法里面定义接口_java – 当接口A在其方法签名中定义接口B时
…如何限制A的实现在方法签名中使用B的某个实现?用例这是一个Unit接口和两个实现它的枚举:public interface Unit { ... }public enum ForceUnit implements Unit { ... }public enum MassUnit implements Unit { ... }属性界面使用哪个:publ…

ANDROID_MARS学习笔记_S01_011ProgressBar
文档是这样来设置样式 <ProgressBarandroid:layout_width"wrap_content"android:layout_height"wrap_content"style"android:style/Widget.ProgressBar.Small"android:layout_marginRight"5dp" /> 1.xml <RelativeLayout xml…

怎样使phpnow1.5.6-1支持firebird
(以下部分步骤可能不是必要,自己测试。) 环境:windows,phpnow1.5.6-1 默认支持mysql,修改配置文件,使之支持firebird。 php.ini 的位置 : php-5.2.14-Win32\php-apache2handler.ini …

php 引入其他文件中的变量
在php的开发过程中,如果所有的代码都写在同一个文件中的话,那么文件中的代码数量是否太多了,一来不便维护,二来对于编辑器也是个负担include("class0.php");在php文件的首部引入即可;转载于:https://www.cnblogs.com/wrhbk/p/10985…

java struts技术_java技术框架之:struts
一:struts的优缺点优点:1、开源:2、利用Struts提供的taglib可以大大节约开发时间。3、维护扩展比较方便。通过一个配置文件,即可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。4、表现与逻辑分离5、表…

BZOJ 2780: [Spoj]8093 Sevenk Love Oimaster( 后缀数组 + 二分 + RMQ + 树状数组 )
全部串起来做SA, 在按字典序排序的后缀中, 包含每个询问串必定是1段连续的区间, 对每个询问串s二分RMQ求出包含s的区间. 然后就是求区间的不同的数的个数(经典问题), sort queries BIT 就行了.时间复杂度O(N log N). 速度垫底了QAQ 你们都会SAM。。。。----------------------…

centos7下Gitlab+Jenkins部署持续集成CI环境
1.基本环境 主机:win10,IP:192.168.0.111;部署机器centos7,IP:192.168.0.65;内存推荐到8G,实测需要6G以上,以免出现内存不够用而报错。 2.安装gitlab需要的组件 [rootloc…

VIM7.3添加中文帮助文档
安装中文帮助文档之前首先执行下列操作:在home目录下列新建文件夹 :.vim ------------------>.vim是一个隐藏文件,不要漏了 “.”.vim/plugin ---------->.vim目录下的plugin文件夹.vim/doc ------------->.vim目录下的doc文件夹.v…