Java 8 内存管理原理解析及内存故障排查实践( 八 )


文章插图

  • All classes including platform:列举应用程序中所有类的信息 , 并快速定位内存问题 。
  • Show all members of the rootset:显示堆内存中所有根对象的信息 , 包括系统对象、静态对象、本地对象等 。
  • Show instance counts for all classes (including platform):显示所有类的实例数量 。
  • Show heap histogram:显示程序堆内存的直方图 , 可以知道每个类的实例数量和占用内存大小等信息 , 快速知道内存泄漏原因 。
(2)jvisualvm也是Java 开发工具包里自带的一款图形化工具 , 可以用于监控和诊断Java应用程序的性能问题 。使用它可以实时查看Java 应用程序的内存使用情况、CPU使用情况、线程情况等,并可以进行内存分析、CPU分析、线程分析等内容 。
以Java_pid2680.hprof为例,进行内存分析内存泄漏原因:
Java 8 内存管理原理解析及内存故障排查实践

文章插图
(3)MAT 是基于Eclipse的内存分析工具,是一个快速、功能丰富的Java内存分析工具,能够快速的分析出dump文件中各项结果,快速给出内存泄漏原因报告 。
还是以Java_pid2680.hprof文件进行分析,比原生的jhat方便很多,功能也比原生的更加丰富:
Java 8 内存管理原理解析及内存故障排查实践

文章插图
MAT的一些常用功能点介绍(如图所示):
  • Overview 标签内容有比较多块内容 , 其中details末块介绍总共使用内存大小,类的数量,实例的数量 , 类的加载器,以及实例的内存直方图;
     
  • Biggest Objects by Retained Size模块,使用了饼状图列出了当前内存中占用最大的几个对象,按照百分比划分,点击不同的饼状块能够看到具体对象及其对象属性等信息;
  • actions模块,这里拥有不同的分析功能 , Histogram生成视图列出每个类所对应的对象个数以及占用内存大?。?Dominator Tree生成视图寻找出大对象,每个实例对象的内存占比比重;
  • Reports模块是生成报告,其中Leak Suspects可以自动分析内存泄漏主要原因报告,可以通过报告准确定位泄漏原因或者可能造成泄漏的原因 , 并且可以定位到具体累积实例,线程stack等信息 。
例子中:leak Suspects报告给出“0xfe3be480” 非常多内存,Gc root Thread 所引用,在发生gc时,不是可回收对象 , 无法回收内存,导致内存溢出 。
Java 8 内存管理原理解析及内存故障排查实践

文章插图
四、总结本文介绍了Java程序中的内存模型,内存模型划分多份内存区域,不同区域的作用介绍及不同区域的线程之间的内存共享范围 , 可以帮助开发人员更加理解Java 中内存管理的机制和原理 。
堆是内存模型中最大的一块内存区域,以堆的空间划分详细的介绍了内存分代,部分垃圾收集器即是物理分代和逻辑分代,G1收集器则物理不分代逻辑保留了以前分代,讲述了不同收集器的原理实现和优缺点 , 可以根据项目的业务属性 , 机器配置等因素选择最优的收集器,帮助程序使用最优的收集器可以使得程序的吞吐量和响应速度达到最佳状态 。还讲述了不同的参数调优收集器,并且当发生了程序内存溢出崩溃,如何进行内存分析,介绍不同工具的使用,快速定位内存溢出的罪魁祸首,从而在代码层面上根本解决这类问题 。




推荐阅读