之前公司内部项目出现了一个非常奇怪的内存泄露问题:环境上完全相同的几个项目,其中一个在跑了50个左右的并发接口时会直接报java heap space,本来以为是接口逻辑有问题。但是即使是查询单条数据这样的简单的接口也会报错,排除了代码逻辑的可能性。请教了下周围同事也没得出一个准确的结论,后来尝试将出问题的项目中的单个接口拿到其他环境中,发现不会出现问题。于是将问题锁定在了项目内。
在加了几个启动配置之后将内存泄露的hprof文件拿了下来
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/home/path/
用jdk自带jvisualvm打开文件进行排查:
很明显byte数组占了90%+将程序跑挂了。
不过到了这虽然定位到了问题,但是进一步往下怎么走就不清楚了,只能先进入数组里看下具体是什么情况,于是点进去进入到实例数菜单里。根据大小排序完,没有发现什么有用的线索,但是看得出大部分的字段类型都和http请求相关。其他的类型都比较常见,但是有个http11inputBuffer比较特殊,这时就想着先百度一下有什么相关的报错看一看,结果一下就发现别人也出过完全一致的问题。
直接从这篇文章里找到了答案:
https://blog.csdn.net/aileitianshi/article/details/90147109
作者有比较深入的分析,总结来说问题出在这
server.max-http-header-size=10000000
这个配置项导致了请求头过大,正常只有4k大小,更改完配置后立竿见影,问题修复完毕了。
原文:https://www.cnblogs.com/mijwqs/p/14136944.html