ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

Java生产环境调优—模拟一次内存溢出

2020-06-07 17:08:42  阅读:327  来源: 互联网

标签:截图 Java mat Eden 调优 内存 溢出


  当我们在工作中,遇到线上问题:内存溢出,如何解决呢?除了物理扩大内存以外,还可以从软件角度去定位问题之所在。

  补充一下基础知识(这里以jdk8为例)

  Java的内存模型,也可以称之为:运行时数据区(规范)

  运行时数据区分为:堆、程序计数器、方法区、虚拟机栈、本地方法栈。

  Java内存结构(实现)分为:堆区和非堆区。堆区分为Young区和Old区。非堆区即Metaspace,可分为CCS(压缩类空间)和CodeCache(native code存放的内存空间),当然这两块空间不一定存在,要看是否添加了相应的配置。Young区又分为Eden区和Surviver区,对象分配初期都在Eden区上,随着年龄的增加,进入Survivor区和Old区。Surviver区又分为S0和S1两块。S0和S1两块区域是等大的,不同时使用。对象在这两块区域上不断交换,每换一次岁数加一。Eden区和Survivor区的大小比例默认为8:2,因为很多对象的存活时间非常短,用朝生夕死来比喻刚好恰当,所以Eden区要大一些。

  好了,我们通过代码来实机演示一下内存溢出的定位过程。

  1、环境介绍:

  springboot 2.1.3.RELEASE,添加Web依赖、IDEA开发工具、MemoryAnalyzerTool工具

  2、实现思路:这里我们通过指定内存大小,然后不断的new对象到集合中,最终实现内存溢出的效果。

  3、代码截图:

  

 

 

 

  3、添加一些配置参数,见截图:

 

 

4、启动程序,通过浏览器的127.0.0.1:9090/heap来访问,这里的9090为我设置的项目启动占用端口。控制台会输出内存溢出的日志,见截图:

    

 

 

5、因为我们配置导出的镜像文件在./目录下,所以打开项目路径,可以看到如下文件,pid为运行该boot项目的进程号:

 

6、打开mat工具,导入java_pid10393.hprof文件,在Getting Started的时候选择Leak Suspects Report,点击Finish,查看mat为我们生成的分析报告。见截图:

 

 7、mat已经很只能的为我们分析到出现问题的类了,当然这里是因为我们以结果为导向定义的一个简单Demo,实际生产环境中可能要更为复杂,需要耐心分析。

 8、点开Details,继续查看类的个数及占用的内存大小。

 

 9、从以上截图我们可以得出大小为13M的User对象,及对象个数为65789。综上分析,可以定位到是在做userList.add()的时候,出现了死循环,导致的内存被撑爆。

 10、补充一点,mbp机器上,mat软件无法打开的解决方法,参照博客:https://www.jianshu.com/p/68a657ed2286

 结束语:

  勤学如春起之苗,不见其增,日有所长。

标签:截图,Java,mat,Eden,调优,内存,溢出
来源: https://www.cnblogs.com/cecWork/p/13061071.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有