Maven - StackOverflowError
问题与分析
今天发现服务器上的Jenkins在集成项目时报错,报错原因如下:
error compiling: java.lang.StackOverflowError -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
还是头回遇到这种错误,由于Jenkins每天晚上都会自动集成当天提交的代码。之前一直编译正常,而今天编译报错,正好昨天我提交了代码上去。
很显然,这是由于我提交的代码造成的。一开始以为是项目代码有问题,比如无限递归之类的导致的堆栈溢出。但是在本地发现可以正常运行该Maven项目,无论是编译还是打包都一切正常。难道是Jenkins抽风了?于是重启了Jenkins任务去重新编译一次项目,结果再次挂了,报了同样的错误。
百度之后发现挺多人都遇到这种问题,原因也基本一样,都是因为jvm内存不足导致的堆栈溢出。仔细想想,确实很有可能,因为我在本地是通过eclipse来运行项目的,我在本地配置了足够的jvm参数;而服务器上则可能由于Jenkins同时运行多个任务,又或者配置的内存不够,所以就编译报错了。
再一次审视我昨晚提交的代码,发现在一个测试类里,有个方法调用了非常多的api,这个方法的方法体里大概调用了四百多个api。之所以会方法体这么长,是因为该方法用来测试某个pojo类里的字段是否和数据库里的字段能否匹配上。因为pojo里的字段有四百多个,所以就导致该方法体如此之冗长了。
也就是说,很有可能是该方法导致Jenkins在运行该测试类的该方法时调用api过多导致堆栈溢出了。于是重新修改了代码,将该方法里调用的api分别放到了另外两个方法里,大概一个方法里调用两百个api,然后测试类原来的方法则调用这两个新添加的方法。
之后提交代码,重新让Jenkins集成代码,发现不再报错。
解决方法
和老大讨论之后,决定采用修改代码的方式去fix这个问题。可能是处于服务器内存紧张的考虑,又或者是别的什么因素,不采用网友博文里说的加大jvm参数的方案。
这里还是总结下这两个方案:
方案一
在项目的启动脚本里加大jvm参数,如下:
set MAVEN_OPTS=-Xss4096k
也可以不用设置得那么大,比如设置成下面这样:
set MAVEN_OPTS=-Xss2m
方案二
修改代码内某个调用了过多api的方法,可以将其一分为二,拆分成多个子方法,各自调用一部分的api,最后由原来的方法来call这几个拆分开来的子方法。总之,应当避免在一个方法内调用过多api。
其他
这里顺便贴一下公司项目设置的参数:
echo off
setlocal
set MAVEN_DEBUG_OPTS=-Duser.timezone=GMT+8 -Xdebug -Xmx4096M -XX:PermSize=128M -XX:MaxPermSize=512M -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=8088,server=y,suspend=n
mvn spring-boot:run
endlocal
参考链接
Maven - StackOverflowError的更多相关文章
- Java学习-051-Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError
错误信息:Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class path, preempting St ...
- 一个jar包冲突引起的StackOverflowError
项目运行中错误信息:java.lang.IllegalStateException: Unable to complete the scan for annotations for web appli ...
- spring boot 1.x完整学习指南(含各种常见问题servlet、web.xml、maven打包,spring mvc差别及解决方法)
spring boot 入门 关于版本的选择,spring boot 2.0开始依赖于 Spring Framework 5.1.0,而spring 5.x和之前的版本差距比较大,而且应该来说还没有广 ...
- maven tomcat plugin 踩坑记
今天在自己家里的电脑上改一个项目,安装的是社区版的 IntelliJ Idea, 没有办法安装 Tomcat 插件来启动项目.尝试用 jettry runer 启动,结果报 java.lang.Inc ...
- 【maven】排除maven中jar包依赖的解决过程 例子:spring cloud启动zipkin,报错maven依赖jar包冲突 Class path contains multiple SLF4J bindings.
一直对于maven中解决jar包依赖问题的解决方法纠结不清: 下面这个例子可以说明一个很简单的解决方法: 项目启动报错: Connected to the target VM, address: '1 ...
- Tomcat启动报StackOverflowError
近期工程部署到Tomcat时,出现以下异常: 16-May-2018 09:35:25.590 严重 [localhost-startStop-1] org.apache.catalina.core. ...
- maven 高级玩法
maven 高级玩法 标签(空格分隔): maven 实用技巧 Maven 提速 多线程 # 用 4 个线程构建,以及根据 CPU 核数每个核分配 1 个线程进行构建 $ mvn -T 4 clean ...
- 【分享】标准springMVC+mybatis项目maven搭建最精简教程
文章由来:公司有个实习同学需要做毕业设计,不会搭建环境,我就代劳了,顺便分享给刚入门的小伙伴,我是自学的JAVA,所以我懂的.... (大图直接观看显示很模糊,请在图片上点击右键然后在新窗口打开看) ...
- 理解Maven中的SNAPSHOT版本和正式版本
Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制.在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个 ...
随机推荐
- 安装wampserver 计算机丢失msvcr100.dll
刚刚重新安装了Windows 7 64位系统,再安装Wampserver 2时却提示系统错误,如下图所示: 在网上下载了MSVCR100.dll放到system32文件夹下依然没有用. 百度搜索了一下 ...
- Hadoop- MapReduce在实际应用中常见的调优
1.Reduce Task Number 通常来说一个block就对应一个map任务进行处理,reduce任务如果人工不去设置干预的话就一个reduce.reduce任务的个数可以通过在程序中设置 ...
- RQNOJ 569 Milking Time:dp & 线段问题
题目链接:https://www.rqnoj.cn/problem/569 题意: 在一个数轴上可以摆M个线段,每个线段的起始终止端点给定(为整数),且每个线段有一个分值,问如何从中选取一些线段使得任 ...
- 一些rtsp实现的开源代码
* live.com C/S C++ http://www.live555.com * darwin S C++ http://www.opensource.a ...
- 勤于思考:jQuery Validation 在IE7(兼容模式)下出现“找不到成员”的脚本错误
今天在调试IE10下使用IE6判断脚本出现错误,处理后说IE7也不行,调试后则会出现以下错误: SCRIPT3: 找不到成员. jquery171.js, 行2582 字符4 其实开始我认为是jque ...
- python后台架构Django教程——manage.py命令
一.manage.py命令选项 manage.py是每个Django项目中自动生成的一个用于管理项目的脚本文件,需要通过python命令执行.manage.py接受的是Django提供的内置命令. 内 ...
- BZOJ1568:[JSOI2008]Blue Mary开公司
浅谈标记永久化:https://www.cnblogs.com/AKMer/p/10137227.html 题目传送门:https://www.lydsy.com/JudgeOnline/proble ...
- UDK更改启动画面及载入动画
转自:http://www.unrealchina.org/forum.php?mod=viewthread&tid=246&extra=page%3D1 方法很简单: 1.更改启动画 ...
- webapi 跨域 (MVC-Web API: 405 method not allowed问题 )
使用webapi cors 1.安装包:Install-Package Microsoft.AspNet.WebApi.Cors –IncludePrerelease 2.在webapiconfig. ...
- 微软 codeplex 团队
http://www.codeplex.com/site/users/view/Microsoft