springboot_jar包Linux环境下部署启动报错OutOfMemoryError排查解决

问题描述:

springboot打包成jar包部署到linux服务器,部署报错如下所示:

问题排查:

  • 排查一
    分析:idea启动正常,本地jar包启动也正常,初步断定可能是JVM初始化内存不足导致的内存溢出。
    1) free -m
    在这里插入图片描述
    发现free空闲空间只有349M,可交换空间137M。
    2)top
    springboot_jar包Linux环境下部署启动报错OutOfMemoryError排查解决_第1张图片

  • VIRT:virtual memory usage 虚拟内存。假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量。

  • RES:resident memory usage 常驻内存。进程当前使用的内存大小,但不包括swap out,包含其他进程的共享
    ,如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反,关于库占用内存的情况,它只统计加载的库文件所占内存大小。

  • SHR:shared memory 共享内存。除了自身进程的共享内存,也包括其他进程的共享内存,虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小,计算某个进程所占的物理内存大小公式:RES – SHR
    ,swap out后,它将会降下来。

推测:idea启动正常,本地jar启动也正常,服务器空闲内存空间过小,初步推测可能由于内存过小的原因。

验证
1)部署另外一台内存空间较大的服务器,启动测试,java -jar test.jar 启动正常无问题。
2)java -Xms1024m -Xmx1024m -jar app.jar & 设置jvm参数
建议初始化堆的大小和最大堆的大小设置一致,减少GC。

排查二
分析:将内存溢出问题稍微放下,看上面的抛出异常的地方。推测可能跟注入的依赖有关联。据网上资料尝试下面的解决方法:
将maven中mysql-connector-java的版本指定为5.1.42.


   mysql
   mysql-connector-java
   5.1.42

SpringBoot的Maven依赖中不需要自己添加版本号,这是因为SpringBoot的父项目的父项目已经帮我们配置好了。
如何查看默认的版本号?在pom.xml里找到spring-boot-starter-parent,按CTRL加鼠标左键进入其父项目
springboot_jar包Linux环境下部署启动报错OutOfMemoryError排查解决_第2张图片
可以在父项目文件找到这个配置,按相同的方式查看。
springboot_jar包Linux环境下部署启动报错OutOfMemoryError排查解决_第3张图片
后我们可以看到一大串的版本号:
springboot_jar包Linux环境下部署启动报错OutOfMemoryError排查解决_第4张图片
分别找下hibernate和mysql连接驱动的默认版本号:
在这里插入图片描述
这个错误产生的原因是mysql驱动的版本太高,hibernate版本兼容性问题。重新打包部署,未解决,排除此种可能。

排查三
分析通过比较之前的jar包后发现,jar包大小变为98M,之前48M,增加了两倍,后对比发现,resoureces下面放了sql大文件,打包时一起打包进去了,删除后打包测试,正常。

推测:打包的大小导致了内存空间小时启动异常。

结论:

1)服务器内存空间太小导致
2)jar包打包没排除不需要的大文件,导致启动时所占内存空间过大所导致

你可能感兴趣的:(JAVA工程师)