首页 > 其他分享 >Maven - StackOverflowError

Maven - StackOverflowError

时间:2023-02-02 11:35:47浏览次数:47  
标签:调用 StackOverflowError Maven api Jenkins 方法 代码


问题与分析

今天发现服务器上的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​​


标签:调用,StackOverflowError,Maven,api,Jenkins,方法,代码
From: https://blog.51cto.com/u_15951177/6033414

相关文章

  • Maven - settings.xml简易配置Demo
    前言这里贴一下settings.xml的一个简易配置demo,就是简单配置了:本地的仓库地址、阿里云镜像、指定使用jdk1.8进行编译。这里使用的Maven是3.5.0版本的。配置文件demo<?xmlve......
  • maven 配置先拉取私服仓库再拉取阿里云
    1、参考Maven中阿里云私服配置设置maven阿里云镜像和公司私服并存maven-settings.zip下载<?xmlversion="1.0"encoding="UTF-8"?><settingsxmlns="http://maven.ap......
  • Idea Maven 建本地仓库-导入本地JAR包
    需求IDEA很方便集成了Maven,但是也有相应的问题,比如使用Maven仓没有包的时候不太方便,这时我们需要建立自已的本地仓库来实现实现找到Idea的安装目录下面的Maven......
  • Spring Native打包本地镜像,无需通过Graal的maven插件buildtools
    简介在文章《GraalVM和SpringNative尝鲜,一步步让Springboot启动飞起来,66ms完成启动》中,我们介绍了如何使用SpringNative和buildtools插件,打包出本地镜像,也打包成Docker......
  • maven的依赖管理dependencyManagement标签
    依赖管理(dependencyManagement)此标签仅针对依赖管理,但是实际不引入,避免子项目中引入过多 maven提供的dependencyManagement元素既能让子项目继承到父项目的依赖配置,......
  • Maven项目编译级别
    方式一:pom.xml文件中配置属性: <properties><maven.compiler.source>1.8</maven.compiler.source>       <maven.compiler.target>1.8</maven.compiler.target......
  • 今日工作心得之maven
    从gitlab上把项目拉下来之后,到idea里面用maven编译了下,结果就是提示有一些jar包下载不下来。根据提示,我去到自己的mavensetting.xml文件看了自己的mirror。然后得知这是......
  • Maven统一依赖版本管理
    对同一个项目组jar包最好使用相同的版本,为了方便升级框架,可以将jar包的版本信息统一提取出来统一声明版本号<properties><jgs.spring.version>4.3.20.RELEASE</s<jgs.sp......
  • Maven依赖调解
    实际开发中可能存在这种情况,A->B->C->X(1.0),A->D->X(2.0),此时X出现了2个版本1.0和2.0,此时A项目会选择X的哪个版本?解决这种问题,maven有2个原则:路径最近原则上面A->B->C->......
  • 关于Maven-常用依赖
    1.使用parent父类引用,解决依赖版本号不确定时自动匹配的问题<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</arti......