做内存优化前,需要了解当前应用的内存使用现状,通过现状去分析哪些数据类型有问题,各种类型的分布情况,以及在发现是哪些具体对象导致的,这就需要相关工具来帮助我们进行分析。以下介绍常用的几种内存分析工具
Memory Monitor
Memory Monitor 是一款使用简单的图形化工具,可以很好地监控系统或应用的内存使用情况
主要提供以下功能:
(1).显示可用和已用内存,并且以时间为维度,实时反应内存分配和回收情况。
(2).快速判断应用程序的运行缓慢是否由于过度的内存回收导致。
(3).快速判断应用是否由于内存不足导致程序崩溃。
Heap Viewer
Heap Viewer 的主要功能是查看不同数据类型在内存中的使用情况,可以看到当前进程中的 Heap Size 的情况,包含有哪些类型的数据,以及各种类型的数据占比情况。通过分析这些数据来找到大的内存对象,再进一步分析这些大对象,进而通过优化减少内存开销,也可以通过数据的变化发现内存泄漏
主要有以下功能:
(1)实时查看App分配的内存大小和空闲内存大小
(2)发现Memory Leaks
Heap Viewer不光可以用来检测是否有内存泄漏,对于内存抖动,也可以用该工具检测,因为内存抖动的时候,会频繁发生GC,这个时候我们只要开启Heap Viewer,就可以观察数据的变化。如果发生内存抖动,会观察到数据在一段时间内频繁更新
Allocation Tracker
Memory Monitor 和 Heap Viewer 都可以很直观且实时地监控内存的使用情况,还能发现内存问题,但发现内存问题后不能再进一步找到原因,或者发现一块异常内存但不能区分是否正常,不能定位到具体的类和方法。这时可以使用另一个内存分析工具 Allocation Tracker,进行更详细的分析, Allocation Tracker 可以分配跟踪记录应用程序的内存分配,并列出了它们的调用堆栈,可以查看所有对象内存分配的周期
Memory Analyzer Tool(MAT)
MAT 是一个功能丰富的 Java Heap 分析工具,通过分析 Java 进程的内存快照 HPROF 分析,从众多的对象中分析,快速计算出在内存中对象占用的大小,查看哪些对象不能被垃圾收集器回收,并可以通过视图直观地查看可能造成这种结果的对象