问题与分析

今天发现服务器上的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执行install命令出现Exception in thread “main” java.lang.StackOverflowError

Maven - StackOverflowError相关推荐

  1. 【maven】idea maven slf4j : StackOverflowError

    文章目录 1.背景 2.解决思路 2.背景2 3.场景3 1.背景 log4j-over-slf4j和slf4j-log4j12是跟java日志系统相关的两个jar包,当它们同时出现在classpat ...

  2. Maven编译Scala报错StackOverflowError

    Maven 编译时出现 error: java.lang.StackOverflowError 前言 看这个错误大部分就是因为java线程栈出现的问题,但是现在说的这个不是这个原因导致的,不知道有没有 ...

  3. Maven 打包报“java.lang.StackOverflowError”错解决办法

    Maven 打包报"java.lang.StackOverflowError"错解决办法 1.在命令行执行 2.在IDEA集成开发工具中执行 1.在命令行执行 平台:windows ...

  4. maven打包报错java.lang.StackOverflowError解决方法

    在maven项目打包的时候报错,java.lang.StackOverflowError 解决方法在setting->maven->runner->VM Options中添加 -Xs ...

  5. axis2 jar包冲突_一个jar包冲突引起的StackOverflowError

    项目运行中错误信息:java.lang.IllegalStateException: Unable to complete the scan for annotations for web appli ...

  6. Maven 高级玩法

    实用技巧 Maven 提速 多线程 # 用 4 个线程构建,以及根据 CPU 核数每个核分配 1 个线程进行构建 $ mvn -T 4 clean install $ mvn -T 1C clean ...

  7. 一个jar包冲突引起的StackOverflowError

    项目启动错误信息:java.lang.IllegalStateException: Unable to complete the scan for annotations for web applic ...

  8. Java项目编译特别慢或者出现Exception in thread “main“ java.lang.StackOverflowError

    Maven install 编译特别慢出错: Exception in thread "main" java.lang.StackOverflowError at org.code ...

  9. Maven Jar冲突解决方案

    MavenJar冲突解决方案 记一次在做项目过程中 遇到的jar冲突问题 话不多说 先报出错异常 //异常在这 SLF4J: Detected both log4j-over-slf4j.jar AN ...

最新文章

  1. 关于python中的dict和defaultdict
  2. 支持向量机器—SMO算法
  3. java httpclient 关闭_【Java系列007】HttpClient调用:你考虑过关闭连接、并发了吗?...
  4. JAVA描述算法和数据结构(01):稀疏数组和二维数组转换
  5. PHP memory_get_usage()管理内存
  6. 亚马逊开源模型设计神器:AutoGluon,三行代码自动生成SOTA模型!
  7. html之CSS设计(CSS伪类、优先级、字体属性、背景属性)
  8. 3x3矩阵怎么求逆矩阵_矩阵型组织结构,郭士纳与任正非都是怎么说的?
  9. 学习java软件开发大概要多久?
  10. 解决魅族手机不能Toast提示的方法
  11. C语言中sprintf()函数的用法
  12. 用CSS3画出一个正方体
  13. c语言头文件有哪些intr,有没有大神帮帮忙
  14. 留学生交流互动论坛网站
  15. 腾讯 TAPD DevOps 开放生态最佳实践
  16. IJPay微信退款协议不正确 No appropriate protocol
  17. 双循环链表(C++)
  18. 语言环境设置命令locale 命令(linux,对应于window 7(win叫什么命令?)控制面板-区域和语言里的设置)
  19. docker磁盘空间不足解决办法
  20. 完美世界怎么修改服务器经验,完美世界升级经验明细表分享 有什么升级技巧...

热门文章

  1. Response status code does not indicate success: 401 (Unauthorized).
  2. 程序员该如何过好他的整个职业生涯?
  3. 数据库同步软件-多种数据库主从复制
  4. pycharm注释语法
  5. linux网络编程函数解析之——setsockopt / getsockopt用法
  6. 如何在触摸和鼠标模式之间切换Outlook
  7. 品牌耳机值得拥有 双通道入耳检测+压力传感器
  8. 【windows】如何全部关闭360安全的弹出guang告?(已解决)
  9. c语言中函数static变量,[转]C语言中的 static变量、static函数
  10. Python异常:AttributeError: module ‘xxxx‘ has no attribute ‘open‘ 解决办法