赞
踩
引言
在运行java的时候有时候想测试云运行时占用内存情况,这时候就需要使用测试工具查看了。在eclipse里面有 Eclipse Memory Analyzer tool(MAT)插件可以测试,而在idea中也有这么一个插件,就是JProfilerl。
常见的内存分析工具:
JConsole
JVisualVM
JProfiler
正文 : 模拟内存溢出
import lombok.Data; import java.util.Date; /** * <p>项目名称: </p> * <p>文件名称: </p> * <p>功能描述: </p> * <p>创建时间: 2022/10/24 </p> * @author Top * @version v1.0 */ @Data public class MemoryOverflow { private String lastName; private Integer age; private Boolean boss; private Date birth; }
import com.moonl.jvm.beans.MemoryOverflow; import org.springframework.boot.test.context.SpringBootTest; import java.util.ArrayList; import java.util.List; @SpringBootTest public class MemoryOverflowTest { public static void main(String[] args) { List<MemoryOverflow> list = new ArrayList<>(); while (true){ list.add(new MemoryOverflow()); } } }
这里我们设置运行时的内存为21M
现在我们开始运行程序
这时一段很简单的代码,无限循环,不断的将创建一个对象,并加入到list当中,此时我们发现报错提示,内存溢出了。
我们生产环境,系统后台的运行时内存溢出,就这样模拟出来了。
定位问题
当我们生产环境,出现内存溢出之后,面对量级比较大的系统,一般是无法通过日志进行定位内存溢出的位置,那么就需要在运行时,加上一段参数,生成运行时内存溢出的快照。
-Xms21m -Xmx21m -XX:+HeapDumpOnOutOfMemoryError
如图所示:
运行后,会出现如图所示:
在程序的工程目录报里面,我们就可以找到,刚生成的文件快照,但该文件的阅读方式,需要单独下载单独的工具进行查询。
这里我使用的是:Jprofiler 大家可以去下载,安装过程不再累述。
分析内存溢出的原因
打开Jprofiler—Session—open Snapshot
弹出对话框后,选择要进行分析的文件
就可以看到是什么原因造成内存溢出的,当然在进行生产环境的内存溢出分析时,需要排查和分析的地方更多
最大的对象很有可能是当前OOM溢出的原因,可以看到最大的对象时HeapOOM这个对象,JVM中有36W个这样的对象
找到代码出错的位置
选中当前对象,右键 -> Use selected Objects
点击OK
选中 Incoming references
点击 show more
定位到代码行号
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。