JVM项目优化之旅

前言

说到jvm优化实在令我惭愧,因为我对他的了解仅限于我在面试题里背的那些。但公司有个项目在现场机器上运行,内存吃到了8G,这点让客户很不满意,因为他们的机器也会跑其他项目,32G的机器光我们的项目就占了四分之一,让他们不能接受。于是要求我们对项目进行优化,要求内存常规态不能超过1.5G。
其实客户的想法是允许项目在进行一些操作的时候内存上升,但是希望在功能使用完,对软件没有操作时,使用内存能够下降!

项目环境

该项目是基于Oracle jdk 8开发,springboot版本为2.0.3,运行在银河麒麟上

奇怪的问题

项目在麒麟上刚启动的时候,占用内存约1.2G,但是打开前端之后,内存骤然上升至2.5G,仅仅只是打开前端页面,如果再做一些操作的话,内存还会继续上升!

摸石头过河

因为我也是第一次做项目内存问题的定位,我看了他们带的现场的启动脚本,发现他们只设置了xmx 4G,然后就什么都没有配置了!我问他们为什么只配了最大堆内存,他们的回复是这个项目占用内存非常严重,而且限制的太小还会出现内存溢出的问题!

我使用jdk自带的jconsole想看下堆的情况,就遇到了第一个问题,一个Java进程都看不到,当然使用jps肯定也看不到Java进程,解决方法:https://www.jianshu.com/p/34cba8076588 在启动参数上配置远程连接属性,就可以看到了。

这个时候我发现老年代的占用十分的高,而且我手动GC居然也无法清除,老年代居然占了1.9个G,我的堆 xmx最大就给了2个G。 我当时的第一反应就是,内存泄漏了!!!

使用工具排查

我在排查内存泄漏的过程中,学习使用了两个新工具,一个是随总推荐的阿里开源的arthas, 常用的几个命令比如dashboard,jvm 等等。第二是mat 下载时请注意与jdk版本相对应!

首先使用arthas,将堆文件dump出来

[arthas@58205]$ heapdump --live /tmp/dump.hprof
Dumping heap to /tmp/dump.hprof...
Heap dump file created

导出之后,使用mat打开
在这里插入图片描述
在这里插入图片描述
(因为内网项目,但是不要在意这些细节,因为这个是通病,看谁的图都一样)
发现byte[] 占用很大,我搜了下那个类是哪里的类,发现网上说是springboot配置了max-http-header-size导致内存溢出,很多人都掉进这个坑了。之后我把这里改成了-1,再用jconsole看,发现老年代占用过大的问题不存在了,手动GC也可以回收掉。

心得

各位看我在上面轻描淡写,最后还是直接百度解决的。但实际上,这个排查过程比较久的,因为我并不是一开始就知道是内存泄漏,第一次做这种事完全没有经验。而且排查的过程中,对jvm的一些常见配置参数了解更多,对cms g1等垃圾回收器有了更多的了解。而且也熟悉了内存排查工具,所以关于内存优化的文章我不打算只写此一篇,后面打算再写一到两篇,这次收获的知识还有排查过程中我用的一些命令!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值