Memory Analyzer

面试之Java虚拟机专题

我们两清 提交于 2020-04-10 07:52:23
说下对象的创建方法?对象的内存布局?对象的访问定位? 四种不同的方法创建对象 1、用new语句创建对象,这是最常用的创建对象的方式; 2、调用对象的clone方法。   MyObject obj =new MyObject();   MyObject objs= obj.clone(); 使用clone方法克隆一个对象的步骤:   1)被克隆的类要实现Cloneable接口;   2)被克隆的类要重写clone方法; 1 class Obj implements Cloneable{ 2 private Date birth = new Date(); 3 public Date getBirth(){ 4 return birth; 5 } 6 public void setBirth(){ 7 this .birth= birth; 8 } 9 public void changeDate(){ 10 this .birth.setMonth(4 ); 11 } 12 public Object clone(){ 13 Obj o = null ; // o指向了复制后的新对象 14 try { 15 o=(Obj) super .clone(); // 实现浅复制 16 } catch (CloneNotSupportedException e){ 17 e

内存分析诊断系列-理解heap dump

北城以北 提交于 2020-03-07 19:47:24
01Heap Dump是什么? ​ Heap Dump也叫堆转储文件,是一个Java进程在某个时间点上的内存快照。Heap Dump是有着多种类型的。不过总体上heap dump在触发快照的时候都保存了java对象和类的信息。通常在写heap dump文件前会触发一次FullGC,所以heap dump文件中保存的是FullGC后留下的对象信息。 02 Heap Dump里面有什么? 一般在Heap Dump文件中可以获取到(这仍然取决于heap dump文件的类型)如下信息: 对象信息:类、成员变量、直接量以及引用值; 类信息:类加载器、名称、超类、静态成员; Garbage Collections Roots:JVM可达的对象; 线程栈以及本地变量:获取快照时的线程栈信息,以及局部变量的详细信息。 也就是说我们可以对上面这些内容进行分析。通常可以基于Heap Dump分析如下类型的问题: 找出内存泄漏的原因; 找出重复引用的jar或类; 分析集合的使用; 分析类加载器。 总而言之我们对Heap Dump的分析就是对应用的内存使用进行分析,从而更加合理地使用内存。 03怎样获取Heap Dump ? 获取heap dump有多种方式,可以通过参数配置在特定的条件下触发堆转储,也可以通过工具来获取。 通过OutOfMemoryError获取heap dump

JVM之压缩指针(CompressedOops)

心不动则不痛 提交于 2020-02-28 04:21:09
对于32位机器,进程能使用的最大内存是4G。如果进程需要使用更多的内存,需要使用64位机器。 对于Java进程,在oop只有32位时,只能引用4G内存。因此,如果需要使用更大的堆内存,需要部署64位JVM。这样,oop为64位,可引用的堆内存就更大了。 注:oop(ordinary object pointer),即普通对象指针,是JVM中用于代表引用对象的句柄。 在堆中,32位的对象引用占4个字节,而64位的对象引用占8个字节。也就是说,64位的对象引用大小是32位的2倍。 64位JVM在支持更大堆的同时,由于对象引用变大却带来了性能问题: 增加了GC开销 64位对象引用需要占用更多的堆空间,留给其他数据的空间将会减少,从而加快了GC的发生,更频繁的进行GC。 降低CPU缓存命中率 64位对象引用增大了,CPU能缓存的oop将会更少,从而降低了CPU缓存的效率。 为了能够保持32位的性能,oop必须保留32位。那么,如何用32位oop来引用更大的堆内存呢? 答案是压缩指针(CompressedOops)。 JVM的实现方式是,不再保存所有引用,而是每隔8个字节保存一个引用。例如,原来保存每个引用0、1、2...,现在只保存0、8、16...。因此,指针压缩后,并不是所有引用都保存在堆中,而是以8个字节为间隔保存引用。 在实现上,堆中的引用其实还是按照0x0、0x1、0x2..

MAT使用-jvm内存溢出问题分析定位

…衆ロ難τιáo~ 提交于 2019-12-03 11:40:45
1.MAT简介: MAT 全称 Eclipse Memory Analysis Tools 是一个分析 Java堆数据的专业工具,可以计算出内存中对象的实例数量、占用空间大小、引用关系等,看看是谁阻止了垃圾收集器的回收工作,从而定位内存泄漏的原因。 2.什么时候会用到MAT? a)OutOfMemoryError的时候,触发full gc,但空间却回收不了,引发内存泄露 b)java服务器系统异常,比如load飙高,io异常,或者线程死锁等,都可能通过分析堆中的内存对象来定位原因 3.MAT安装: https://www.eclipse.org/mat/downloads.php --下载地址 http://help.eclipse.org/oxygen/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html --官网使用教程 #参数配置: 分析堆转储文件需要消耗很多的堆空间,为了保证分析的效率和性能,在有条件的情况下,建议分配给 MAT 尽可能多的内存资源。两种方式分配内存资源给 MAT: 1)修改启动参数 MemoryAnalyzer.exe -vmargs -Xmx4g 2)编辑文件 MemoryAnalyzer.ini 添加 -vmargs – Xmx4g 4.MAT分析dump堆栈: #4.1dump文件生成: a

Eclipse Memory Analyzee Java内存分析工具安装教程和使用

匆匆过客 提交于 2019-12-01 05:13:24
这里,内存映像工具利用的是Eclipse Memory Analyzee,对Dump出来的堆转存储快照进行分析,可以分清楚到底是出现了内存泄露(Memory Leak)还是内存溢出(Memory Overflow)。 在Eclipse中离线安装MemoryAnalyzee的步骤如下(由于在线安装可能会有网络问题): (1)去官网下载离线安装包: 即下载MemoyAnalyzer-1.6.1.201611251412.zip包。 (2)下载之后解压得到如下文件内容: (3)打开Eclipse->Help->Install new Software,如下: 将干菜下载好的路径引入其中。点击Ok。 (4)点击Avaliable Software Sites 注意:将里面,所有有关http连接的去掉勾选,否则,在更新的时候可能失败,如下: 只要location是http开头的就去勾选。 (5)去掉Contact all update sites during install to findrequired software前面的勾 (6)点击next,即可成功安装 那么:Eclipse Memory Analyzer如何使用呢? 为了使用MAT,即Memory Analyzer Tool,这里我们使用的是Eclipse Memory Anaylyzer需要先明白内存分析的数据源是如何产生的

利用jmap和MAT等工具查看JVM运行时堆内存

天涯浪子 提交于 2019-12-01 05:13:01
jmap JDK自带了一些工具可以帮助我们查看JVM运行的堆内存情况,常用的是 jmap 命令 如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。 jmap -heap <pid> 打印堆的使用情况 那么,从这个输出中我们也可以大致看出堆的结构,分为Young Generation (年轻代) 和 Old Generation (老年代) Young Generation又被划分为:Eden Space , From Space 和 To Space 可以看到这里To区是干净的,还未被使用,From区已经使用了95%了 jmap -histo[:live] <pid> 打印类的实例数量、占用的内存、类的名称,通常我们并不需要看所有的,只需要看前几条即可 jmap -dump:live,format=b,file=heap.bin <pid> 以hprof二进制格式dump堆的使用情况(PS:相当于生成一个快照,后续我们可以对这个快照文件进行分析) Memory Analyzer (MAT) 文件dump下来以后,可以使用Eclipse的MAT插件进行查看 如果日常开发用的是eclipse的话

linux-buff/cache过大导致内存不足-程序异常

风流意气都作罢 提交于 2019-11-30 22:50:23
问题描述 Linux内存使用量超过阈值,使得Java应用程序无可用内存,最终导致程序崩溃。即使在程序没有挂掉时把程序停掉,系统内存也不会被释放。 找原因的过程 这个问题已经困扰我好几个月了,分析过好多次都没有找到原因,网上查了一下该问题其他人也都遇到过,不过并没有什么好的解决方案,因为项目一直没有上线,每次当内存不足时导致程序崩溃都是重启服务就好了,索性也就没花太多的时间来找问题。现在项目马上上线了,不能在出现程序崩溃的情况了,况且还是前置系统,更不能出现任何问题。 最开始一直认为是程序的原因导致内存泄漏,使用jdk自带的jmap -F -dump:live,format=b,file=/usr/local/sztFront/logs/heapdump.bin命令输出过几次dump文件,通过MemoryAnalyzer分析,应用程序没有耗内存过大的变量。后台猜测是否日志输出过多导致的,毕竟是前置系统,每天的报文量特别大,日志能到达5,6个G。所以把日志接收报文关了,日志大小马上降下来了,每天200M。程序挂掉的时间变长了,原来差不多一周就挂掉了,现在可以达到两周左右才挂掉,还是不行,没有冲根本上解决问题。经过在网上搜索各种相关的问题,问题出现在Cached的值过大,导致系统没有可以再分配的内存空间。Cached只要用来缓存文件的,经常读写的文件会被缓存到Cached中

MAT使用-jvm内存溢出问题分析定位

烈酒焚心 提交于 2019-11-30 06:35:35
1.MAT简介: MAT 全称 Eclipse Memory Analysis Tools 是一个分析 Java堆数据的专业工具,可以计算出内存中对象的实例数量、占用空间大小、引用关系等,看看是谁阻止了垃圾收集器的回收工作,从而定位内存泄漏的原因。 2.什么时候会用到MAT? a)OutOfMemoryError的时候,触发full gc,但空间却回收不了,引发内存泄露 b)java服务器系统异常,比如load飙高,io异常,或者线程死锁等,都可能通过分析堆中的内存对象来定位原因 3.MAT安装: https://www.eclipse.org/mat/downloads.php --下载地址 http://help.eclipse.org/oxygen/index.jsp?topic=/org.eclipse.mat.ui.help/welcome.html --官网使用教程 #参数配置: 分析堆转储文件需要消耗很多的堆空间,为了保证分析的效率和性能,在有条件的情况下,建议分配给 MAT 尽可能多的内存资源。两种方式分配内存资源给 MAT: 1)修改启动参数 MemoryAnalyzer.exe -vmargs -Xmx4g 2)编辑文件 MemoryAnalyzer.ini 添加 -vmargs – Xmx4g 4.MAT分析dump堆栈: #4.1dump文件生成: a

JVM学习手册(X):查看堆内存使用情况以及排错

亡梦爱人 提交于 2019-11-29 23:57:07
平时出现内存溢出以及死锁,一般处理方式都是查看日志,找到抛出异常的代码行,然后本地分析代码,但是这样对于线上排查十分糟糕,这段时间在研究JVM发现了几个比较好的工具和指令. 1.针对频繁GC和内存溢出: (1).首先找到有哪些线程在执行,使用指令jps. (2).查看堆内存使用情况,使用指令jstat -gc 进程ID 刷新毫秒 刷新次数(PS: jstat -gc 1111 250 5,即对于线程1111在堆中使用情况,250毫秒刷新一次,总共刷新5次) (3).可以将堆内存使用情况生成堆转储文件,使用指令jmap -dump:format=b,file=文件名 进程ID (4).使用jhat或者Memory Analyzer分析堆转储文件,这里使用Memory Analyzer来分析. (5).首先需要安装Memory Analyzer,地址为http://archive.eclipse.org/mat/1.2/update-site/ 或者 下载插件版都可以 (6).将堆转储文件加载进Eclipse. (7).过段时间再次生成一个堆转储文件. (8).将两个文件都用Memory Analyzer加载进去, (9).选择柱状图标志(Create a histogram...),选择最后一个标志(compare to another Heap Dump),最后选择多个文件夹标志

使用Eclipse内置的MAT插件分析dump文件时报错

坚强是说给别人听的谎言 提交于 2019-11-29 23:56:23
下载下来一点dump文件很大,然后使用mat分析的时候mat本身报错 Out of Memory Error while Running the Memory Analyzer 这是因为eclipse配置的内存太小了导致的,网上查了下都是去改MemoryAnalyzer.ini的参数内容 但对于ecplise内置安装插件来说是找不到这个文件的, 去官网查看 https://wiki.eclipse.org/MemoryAnalyzer/FAQ Out of Memory Error while Running the Memory Analyzer Well, analyzing big heap dumps can also require more heap space. Give it some more memory (possible by running on a 64-bit machine): MemoryAnalyzer.exe -vmargs -Xmx4g -XX:-UseGCOverheadLimit Alternatively, edit the MemoryAnalyzer.ini to contain: -vmargs -Xmx2g -XX:-UseGCOverheadLimit As a rough guide, Memory Analyzer