java内存溢出排查工具是什么?为什么会java内存溢出?

在进行java开发的过程中,如果垃圾回收不能及时释放内存,最终堆内存被耗尽,新对象创建时由于内存不足,申请空间失败,这样就会导致内存溢出,那java内存溢出排查工具是什么?下面来我们就来给大家讲解一下。

java有内存泄漏分析工具——Eclipse Memory Analyzer(简称MAT),是一个功能丰富且操作简单的JVM Heap Dump分析工具,可以用来辅助发现内存泄漏减少内存占用。

使用 Memory Analyzer 来分析生产环境的 Java 堆转储文件,可以从数以百万计的对象中快速计算出对象的 Retained Size,查看是谁在阻止垃圾回收,并自动生成一个 Leak Suspect(内存泄露可疑点)报表。

下载与安装:

Eclipse Memory Analyzer(MAT)支持两种安装方式,一是Eclipse插件的方式,另外一个就是独立运行的方式,建议使用独立运行的方式。

在 http://www.eclipse.org/mat/downloads.php 下载安装MAT,启动之后打开 File - Open Heap Dump... 菜单,然后选择生成的Heap DUmp文件,选择 "Leak Suspects Report",然后点击 "Finish" 按钮。

java内存溢出排查工具是什么?为什么会java内存溢出?.png

主界面:

第一次打开因为需要分析dump文件,所以需要等待一段时间进行分析,分析完成之后dump文件目录下面的文件信息如下:

1.png

上图中 heap-27311.bin 文件是原始的Heap Dump文件,zip文件是生成的html形式的报告文件。

打开之后,主界面如下所示:

2.png

为什么会java内存溢出?

一.堆内存溢出

java.lang.OutOfMemoryError: Java heap space

1.当堆内存不足,并且已经达到JVM设置的最大值,无法继续申请新的内存,存活的对象在堆内存中无法被回收,那么就会抛出该异常,表示堆内存溢出。

2.当一次从数据库查询大量数据,堆内存没有足够的内存可以存放大量的数据

3.大量的强引用对象在堆内存中存活,GC无法回收这些对象,新创建的对象在新生代无法进行分配,Full GC仍然无法进行回收

解决方案:

1.查看当前JVM的堆内存配置是否太小,可以考虑增加堆内存大小

JAVA_OPTS="-server -Xms1024m -Xmx1024m"

表示将堆内存的初始值和最大值都设置为1024m

-Xms设置堆内存的初始值

-Xmx设置堆内存的最大值

-Xms和-Xmx最好设置相同的内存大小,可以防止因为JVM频繁进行内存的调整影响稳定性和使用

2.查看代码中是否有从数据库中一次加载大量数据的情况,或者代码中有大量强引用无法进行回收

通过JVM参数:-XX:+HeapDumpOnOutOfMemoryError可以让虚拟机在出现内存溢出的时候Dump出当前的堆内存快照,便于保留快照分析

二.元空间内存溢出

Metaspace

Jdk8 之后使用元空间(metaspace)代替永久代,元空间和永久代最大的区别是元空间的内存使用的是本地内存,而永久代使用的是JVM的内存

永久代、元空间都是方法区的实现,方法区是规范

原因:

元空间中存储的是类信息、常量池、方法描述等信息,直接使用本地内存,当本地内存不足的时候,会抛出OutOfMemoryError:Metaspace异常

解决方案:

虽然元空间的内存不是由JVM控制,不过可以通过JVM参数来设置分配的内存空间的大小-XX:MaxMetaspaceSize配置参数

Java内存溢出的原因有很多,并且每种内存溢出都会给大家提示不同的异常信息和解决方式,我们只要排查出原因,那么解决问题就会很容易了!最后大家如果想要了解更多java常见问答知识,敬请关注奇Q工具网。

推荐阅读:

git客户端怎么下载?git如何进行配置?

springboot怎么加载配置文件?springboot加载配置文件的实现方式

springmvc怎么和ajax相互调用?springmvc如何进行错误处理?