记一次jvm调优过程

  • A+
所属分类:Java

项目背景是这样,项目中用到了solr做全文检索,项目上线后,由于机器配置比较低,jvm给了300m左右给了新生代,这个项目基本上没有任何并发的场景,平常基本上没什么人用。但是今天观察gc时发现了一个很奇怪的现象,其它页面的操作还好,基本上都是正常的,但只要输入任意内容点全站检索,就必定会发生两次gc。

使用jstat -gc pid 100观察发现,只需要2-3秒新生代就会被填满发生gc,也就是在此时期在疯狂创建对象,而且占用的内存还很大!所以第一步需要找出占用内存大的是哪些对象,使用jmap导出堆的dump文件后,使用mat工具打开分析后发现有很多byte数组占用了100多M的空间,就是它们了!但是问题是光看这些byte数组也无法定位到我代码里具体是哪个对象啊。

只好分析代码了。但是看了几遍代码,都是常规的写法,也没发现有啥特别的地方。正当没有任何头绪时,随手打开F12看了下返回的结果,发现接口返回的List中每条数据中都有一个字段文字特别多!chrome中的F12工具直接显示了这个字段有4M,就是它了!

原因是返回的列表中都包括了每个词条或文章的明细字段,这个字段内容特别多,导致占用jvm的内存特别大。而列表中是不需要明细字段的,解决方法就是将代码中这个字段删除即可。然后再测试就不会发生gc了!

虽然这个问题不是特别复杂,但作为个人独立解决的一个jvm的线上问题,值得记录一下~

ZPY

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: