那么:问题来了, 一点自己写的代码的信息没有,怎么找?相信这是大多数兄弟遇到内存问题的第一反应
错误信息是我朋友发给我的截图,我并没有他的代码,也不清楚项目的业务,更不知道为什么会OutOfMemory,懵逼中

开始搞事情
首先:理清思路
1. 发现问题
2. 分析问题
3. 解决问题
首先梳理一下思路:
- OutOfMemory,内存溢出, 是的,溢出了,什么问题导致的呢,是不是程序的内存给的不够引起的呢。
随即,我问了我的朋友程序启动指定内存没有?如果没有的话制定以下内存会不会解决问题呢
-Xms512m -Xmx2048m - 你以为到这就结束了吗?那未免也太积薄水了吧

(●’◡’●): 不行呀,兄弟, 我访问没问题了,给我们老板访问就不行了,还是java.lang.OutOfMemoryError: Java heap space,是不是我们老板有毒呀,我是不是考虑要换一个公司呀。
1. 发现问题
兄弟一看,情况不对呀,尽管分配了内存,但是内存还是会溢出 经过一下系列分析(分析详细过程):

其实很多信息都很明了了,启动程序的分配的堆内存大小、程序所占用的堆内存大小,暂时看起来是没什么毛病,内存的大小并没有什么异常的情况,而且此时并没有发声内存溢出的异常。
但是,没有问题怎么会出异常呢,表开心的太找,下面这张图片是没有为程序启动的时候分配内存,并且发起了一次请求后的内存情况。

要解决的就是你,此时,问题bug已经重现,问题发现,第一关完美通关!!!
2. 分析问题

好的女王大人

点击类后查看对象的内存占比情况如下,点击大小按钮进行内存占比大小排序

3. 解决问题
继续跟踪这个对象,看丫的到底是个什么东西,有必要搞他一搞。
右击该对象,点击在实例视图中显示按钮,跳转如下页面


问题找到了,一个request的请求头占了四百兆,后续根据这个结果发现,为这个程序分配了两个g的最大内存之后,每次请求都会生成400m的该byte数组,接下来就定位到了请求的身上。
问题找到了,接下来就该看代码了,代码是这位兄弟写的,我就不方便随便贴人家的代码了,我先让这位兄弟检查一下代码,这个接口上做没做什么特殊处理,拦截器、过滤器、所有跟request请求相关的配置,都检查一遍,最后在springboot的配置文件中发现了如下配置:

这简直就是自己挖坑给自己跳呀,具体配置说明兄弟就不再解释了

满脑子黑人问号不再多bb了,咱们在这不多讨论该兄弟为什么这么写
jvisualvm、 jprofile真的是一个内存优化、排查问题的一个好工具,java们早晚会用到它,jprofile教程网上并不少,但是讲的好的并没有几个。重要的还是要自己去熟悉,去理解。
该篇文章仅作为内存溢出的一个解决思路
另提醒各位程序朋友们,可能做不到每一行代码都能刨根问底知道底层是怎么实现、什么原理,但是尽量知道你写或copy的每一行代码什么意思,影响有多大。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/228420.html原文链接:https://javaforall.net
