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依赖管理中,唯一标识一个依赖项是由该依赖项的三个 ...
随机推荐
- Contiki 2.7 Makefile 文件(五)
4.第四部分 (1) oname = ${patsubst %.c,%.o,${patsubst %.S,%.o,$(1)}} 自定义函数,$(1)表示调用oname这个函数的第一个参数,patsub ...
- Java里的阻塞队列
JDK7提供了7个阻塞队列,如下: ArrayBlockingQueue : 一个数组结构组成的有界阻塞队列. LinkedBlockingQueue : 一个由链表结构组成的有界阻塞队列 . Pr ...
- utf8_general_ci和utf8_unicode_ci的比较
看到很多数据库的设计对于中文字符都是选择选用utf8_general_ci而非utf8_unicode_ci utf8_general_ci和utf8_unicode_ci的区别并不大:utf8_un ...
- laravel基础课程---12、lavarel的ajax操作2(lavarel的ajax使用总结)
laravel基础课程---12.lavarel的ajax操作2(lavarel的ajax使用总结) 一.总结 一句话总结: 比较简单:就是js请求ajax,然后控制器获取请求参数,返回数据即可 1. ...
- 分享知识-快乐自己:初始 Struts2 (基本概念)及 搭建第一个Demo
1):struts2 的基本概念: 1-1):Struts2 是什么? 1.Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2 ...
- python3 - 商品管理的程序,商品信息都存在一个json串里面
商品管理的程序,商品信息都存在一个json串里面 1.查询商品信息 #校验商品是否存在 2.新增商品 # #校验商品是否存在 #校验价格是否合法 3.修改商品信息 ##校验商品是否存在 if chic ...
- google IO大会
怎么参加一次 Google I/O?大概要多少预算? Google I/O(参加Goole I/O 是我的一个梦想,因为我是Google死忠,想亲自去Google总部看看,所以想知道这些) 费用构成: ...
- 【HDU 6126】Give out candies 最小割
题意 有$n$个小朋友,给每个人分$1~m$个糖果,有k个限制 限制形如$(x,y,z)$ 表示第$x$个人分到的糖数减去第$y$个人分到的糖数不大于$z$,给第$i$个人$j$颗糖获 ...
- ACM学习历程—Hihocoder 1164 随机斐波那契(数学递推)
时间限制:5000ms 单点时限:1000ms 内存限制:256MB 描述 大家对斐波那契数列想必都很熟悉: a0 = 1, a1 = 1, ai = ai-1 + ai-2,(i > 1). ...
- js中变量声明提前
demo1: var a=10; function b(){alert(a); var a=20; alert(a)} b()//undefined 20 因为:js编译器在执行b这个函数时,会把函数 ...