记一次jvm调优过程

首先说下这次事情的背景,是有个小伙伴上午找到我,跟我说内存溢出了。

我当时有点懵,这小伙伴负责的是一个单独的项目,我问他是哪里内存溢出,他说是上传图片。

大概在他那里了解了一会也看了一下错误重现,然后小伙伴有其他事情要去忙,我就说我来弄这个。

首先关于内存调优,这部分我之前有过经验,无非是该初始默认指定运行内存,和修改永久代内存空间。这其中有些名词(新生代,伊甸区,form区to区,老年代)

由于项目不是传统的丢到tomcat的webapp下进行部署,也不是采用java -jar xxx,而是采用maven的一个发布方式,跟项目有所集成的。

项目是springboot项目,自带tomcat。

这个项目的生产和测试是同一台服务器和同一套代码,只是域名和数据库不同而已,这点是个埋笔。

现在开始过程:

1.我们先找到项目日志重现错误、使用的命令

//根据需求查找日志文件内容并获取内容前后10条数据
cat xxx.log|grep  java.lang.Out -C 10

找到了,确定是java.lang.OutOfMemoryError: Java heap space

2.然后我再看一了一下服务器的内存和cpu
 

//查看cpu占用情况
top

//查看服务器内存占用情况
free -h

可以发现一切正常,没有出现什么异常的情况。内存16g
那这样就可以排除服务器自身原因。

3.用jvm 性能调优工具 jmap查看Java堆详细信息

首先我们得找到这个服务的pid.这点很骚我都不知道这个服务的启动名称,当时打印出来一堆东西把我吓一跳

后面换了一种方式找这个服务。

//查看linux 开放正在使用的所有端口
netstat -ntpl

然后就得到了如下图所示,第一张图已经告诉我们服务的端口是什么了。这里就可以直接执行命令了 

//查看启动服务的堆栈内存分配信息。
jmap -heap pid

可以很明显的看到,最大堆空间大小是128m,详解可以看这个链接

这个程度我也不知道够不够,但是内存溢出是存在的。由于事先说到我们是通过脚本自动化构件发布的,所以我去看了一下脚本。


可以看到,脚本也是没问题的。

4.那么问题出在哪呢。这里想起那个埋笔了,测试跟生产是一样的。然后发布也是一样的。我们再来看下测试系统的内存分配情况

好家伙,最大空间分配了512m,然后永久代都达到341m了。系统没问题我就没有仔细深究这个问题了。

这里我们找到了问题所在,如果依照传统修改运行内存的方式是:增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m

但是之前说到,我们是采用maven构件脚本的,有一套自己动态部署的可执行文件。可执行文件我也看了一下,是没有问题的。唯一一个可能出现问题的就是在设置-Xms和-Xmx这个配置文件的地方了

就是这里了。

5.找到构件读取的配置文件所在地,我们就去项目中去看一下。

这是项目目录结构,可以看到上面有多个配置文件,分别对应的是开发,生产,测试。.properties是不可能有这些配置的

所以maven编译时读取的配置应该在pom.xml里。

6.这里我就打开滑到底看了一下

可以看到,果然是在这里设置的,跟服务器上的配置一模一样,但是我有一个疑问,为明明设置了2G为什么会出现内存溢出呢。

这里我问了下群里的小伙伴,有的说让我吧初始内存大小设置为1024M试试。然后我仔细对比了一下。发现一件很骚的事。

会不会是编译工具不识别2G,只能识别2048M。说干就干,我先按照我的想法改一下.(我将jvm.maxMemorySize中的值改成1024M了)。然后升级重启服务器
然后再叫小伙伴再测试那个出问题的接口试试,发现问题消失了。我再去服务器看一下

发现果然最大堆空间大小变成1024M

到这里问题的排查和解决过程就已经结束了(小问题害死人,听说小伙伴搞了一晚上没找到怎么解决)

Roger

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值