jackson-ObjectMapper 初始化导致的问题优化【案例小记】

  在做性能测试时,最常见的问题即为CPU资源消耗高,那今天的,就发现了一个这样的问题,放这里当个性能问题资料吧,文中用到的工具和产品均已授权使用,对敏感信息都做了模糊处理,无意泄漏敏感信息。

一、问题现象

  在一次压测时,发现不管并发怎么增加,系统的处理能力也就这样,以为是达到了系统的上限就放过了。
  后来突然想到,忘记看资源消耗了(有点大意),瞅了一眼资源消耗,才看到应用资源消耗已经满载了,哈哈找到了问题就好办(做压测不发现点问题,都觉做的多余)。
jackson-ObjectMapper 初始化导致的问题优化【案例小记】_第1张图片
jackson-ObjectMapper 初始化导致的问题优化【案例小记】_第2张图片

二、排查过程

  问题很明显,就是服务CPU消耗满载了,既然满载了,那就按照惯例祭出我们的分析工具和APM探针组合来排查问题了。

  发现其实是动态类加载class.forName占用的资源最高,那就逐一排查问题下来发现是jackson中间件导致的,然后逐一找到业务代码(业务代码的截图丢失了,现场的数据也没了,方正就是通过工具定位到了动态类加载并且找到了业务代码,哈哈哈,此处只能说工具的好用,这点不得不说还可以)
jackson-ObjectMapper 初始化导致的问题优化【案例小记】_第3张图片

  定位到了问题,那就看看怎么优化了,根据找到的业务代码,看看哪里用到了jackson的方法,发现其实这个业务逻辑是对redis中拿到的数据对他做反序列化转为字符串时,用到了com.fasterxml.jackson.databind.ObjectMapper 这个东西,也是第一次遇到,哈哈,那就去官网看看吧,官网怎么用的(遇到问题先去官网,别去乱七八糟的地方找,如果官网也没有只能通过 plan B 了 哈哈哈!)
jackson-ObjectMapper 初始化导致的问题优化【案例小记】_第4张图片

  瞅一瞅官网的介绍,【can use static singleton, inject: just make sure to reuse!】(可以使用静态单例,注入:只需确保复用即可!) -> 官网都推荐说用单例或者复用的形式去用,那这里就尝试着改改吧,把这段改成静态公共对象,让他复用试试;

ObjectMapper om = new ObjectMapper();  

jackson-ObjectMapper 初始化导致的问题优化【案例小记】_第5张图片

三、解决方案

  改成了介个样子,那就压测跑跑看看

public static final ObjectMapper om = new ObjectMapper();

jackson-ObjectMapper 初始化导致的问题优化【案例小记】_第6张图片

四、优化后的结果

jackson-ObjectMapper 初始化导致的问题优化【案例小记】_第7张图片
jackson-ObjectMapper 初始化导致的问题优化【案例小记】_第8张图片

   接口TPS从147.57提升到了311.71,提升了接近50%,资源使用情况降低了50%,哎呀呀,真开心

五、小结

   性能优化是无限的,服务的性能是可以无限制的提升的,软件不行加硬件,硬件不行加缓存,缓存不行改架构,所以每次项目都是有目标的,只要目标达到了就可以了,不然无限制的搞下去劳命伤财。好了这次的性能优化分享就这样了,后面如果还有别的案例可以一起看看,欢迎评论交流!

你可能感兴趣的:(java性能优化)