什么是内存泄漏

内存泄漏是指java应用的堆内存使用率持续升高,直至内存溢出。

内存泄漏的的缘由可能有多种html

分配给应用程序的内存自己太小。而应用的业务代码,确实须要生成大量的对象

代码bug,某些须要被回收的对象,因为代码bug,却持续的被引用,致使java虚拟机没法回收这些对象。从而撑爆内存

不管哪一种内存泄露,咱们的解决方法都是要定位到具体是什么对象,占用了大量内存,从而方便咱们基于此进行代码分析,debug,找出代码问题。

而可以帮助咱们实现这一目的的方式就是获取java应用的内存 dumpjava

如何获取内存dump

使用命令获取jcmd

首先须要获取java 进程id,获取到java进程后

使用命令eclipse

jcmd GC.heap_dump

若是执行报错socket

com.sun.tools.attach.AttachNotSupportedException: Unable to open socket file: target process not responding or HotSpot VM not loaded

通常是因为执行jcmd的用户同java应用自己不是同一个用户。解决办法是切换到应用对应的用户下再执行上述命令工具

sudo -u [userid] /jcmd GC.heap_dump

若是应用在本地

若是应用是在本地,除了用上述方法外,还能够用JVisualVM 、JConsoledebug

程序异常退出时自动dump

但更为重要的,为了准确还原应用故障的现场,最好经过指定java 执行参数,在程序出错时,自动dumpcode

java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=

如何分析内存dump

获取到dump文件后,须要使用eclipse.org 出品的 Memory Analyzer 工具。使用其中的Dominator Tree,查看各对象的内存占用状况

android json 内存溢出 java内存溢出dump文件命令_android json 内存溢出

htm

找出占用内存最多的对象及其类信息

android json 内存溢出 java内存溢出dump文件命令_java应用_02

对象