一次StackOverFlow问题的排查记录

起因

做为公司的基础架构,要负责给其他的项目组搭建内网的项目,今天在给一个项目搭建内网测试环境的时候,项目无法正常启动,报StackOverflow的问题,问项目负责的开发,他说本地可以正常启动的,但是需要加一个特殊的jvm启动参数 -Xss2m

排查

项目下载下来以后,首先编译就是一个问题,有报了OutOfMemoryError,然后按文档处理配置了内存以后,继续排查。

IDEA编译报错:java.lang.OutOfMemoryError: Java heap space和java.lang.StackOverflowError
https://blog.csdn.net/ForeverAnt/article/details/90209554

既然已经知道了结果了,所以就想从结果查起,想知道-Xss这个参数到底有什么用户,就查了一下 xss到底是什么,大意就是

-Xss 参数为设置单个线程栈的大小,不同系统(linux,win,mac)以及不同的架构 64位及32位,默认的设置都不一样,mac和Linux默认的的是1024k`

Each thread in a Java application has its own stack. The stack is used to hold return addresses, function/method call arguments, etc. So if a thread tends to process large structures via recursive algorithms, it may need a large stack for all those return addresses and such. With the Sun JVM, you can set that size via that parameter.
Java应用程序中的每个线程都有其自己的堆栈。 堆栈用于保存返回地址,函数/方法调用参数等。因此,如果线程倾向于通过递归算法处理大型结构,则所有这些返回地址等都需要大型堆栈。 使用Sun JVM,可以通过该参数设置该大小

JVM option -Xss - What does it do exactly?
https://stackoverflow.com/questions/4967885/jvm-option-xss-what-does-it-do-exactly

JVM常用基础参数栈内存Xss讲解
https://blog.csdn.net/qq_33229669/article/details/103937083

知道了大概的意思以后,我就想,既然是内存的问题,那是不是就得分析一下,用MAT(Eclipse Memory Analyzer) dump一下分析了看看,idea装了visualvm插件后配置了一下jdk的visualvm的地址,以后, 在idea的启动栏里面就有了启动并分析的按钮了,点了这个启动以后,就能有应用内存和线程的监控视图了,然后点击堆dump按钮,还能dump出当前的应用的内存进行分析,将dump出的.hprof 文件导入到 MAT 软件里面,就能进行另一项目分析了(MAT的有内存泄漏检查的提示,比visualvm的提示更详细一些)
在这里插入图片描述
在这里插入图片描述
然后就看到了,内存对象中最大的竟然是superssedExceptions的一个map
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然后我就进行不下去了,因为在程序启动以后,会出这个异常,我不知道这个异常是起因还是结果,我猜测的是结果,因为StackOverflow了,所以导致出了非常非常多的BeanCreationException,导致内存也不断的涨啊涨啊涨的,这个问题排查了两天,还是从结果出发进行排查的,结果还是没排查出来。后面研究虚拟机的时候,看看能不能回头再想想这个问题。

结论:如果出现了StackOverFlow的问题,可以尝试增加-Xss的参数。

另外:在排查过程中,我使用了一个之前排查别的问题中发现的方法,如果别的包中的类,需要进行调试,或者加输出,在当前的项目中,增加一个与该类相同的包的目录,然后将该类的源码拷到这个目录中,然后在里面增加日志输出或者是打断点,因为类加载是有先后顺序的,同包同类的情况下后面加载的会覆先加载的,而且项目本身的类是最后加载的,所以这是一个小技巧,在排查问题的时候可以使用。

就这样吧,遇到不好解决的问题,就算查到了解决方法的文档,也要自己写一遍或者拷到自己的收藏中一份,人生没有白走的路。

与错误相关文章
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=8061621	
mac java visualvm_IDEA安装 VisualVM 及使用
https://blog.csdn.net/sinat_24230393/article/details/93596359
VisualVM 使用
https://www.cnblogs.com/happy-rabbit/p/6232581.html
使用 VisualVM 和 JProfiler 进行性能分析及调优
https://cloud.tencent.com/developer/article/1648995
JVM heap dump分析
https://www.jianshu.com/p/c34af977ade1
eclipse-memory-analyzer使用说明
https://eclipsesource.com/blogs/2013/01/21/10-tips-for-using-the-eclipse-memory-analyzer/
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值