前言

Arthas 是Alibaba开源的Java诊断工具

官方文档: https://arthas.aliyun.com/doc/

一、问题背景

本人负责的一个服务中有一个数据导出的功能,在数据量为5w条,大小约为120M时,导出时间约为5min,时间太慢,无法接受。

二、定位过程

1、梳理代码,寻找是否有可以优化的地方;

通过梳理代码,对代码中的分页查询进行了优化,但是提升不明显。

2、使用Arthas工具查看每个方法的耗时,查看是否有异常耗时;

因为我们的服务都是通过k8s托管,每个服务是一个pod,因此先将Arthas下载,复制进pod容器内,另外Athas运行还需要安装jdk,我们的环境只安装了jre。

准备工作就绪后,按照Arthas官方文档的步骤:

1、安装Arthas

sh install-local.sh

请添加图片描述

2、启动

java -jar arthas-boot.jar

选择需要诊断的java进程

3、使用 trace 命令打印方法耗时

trace 使用方法 : https://arthas.aliyun.com/doc/trace.html

请添加图片描述

如图所示(涉及敏感信息需要打码),初始化PropertiesUtil耗时较长,结合代码得出结论:

导出数据中有几个字段在数据库中是枚举字段,在代码中需要根据前台语言转化成对应的国际化语言,PropertiesUtil就是干这个事的,但是代码中在转化时每次都会去new一个PropertiesUtil对象,导致在导出5w条数据时代码会new 5w个PropertiesUtil对象,这导致了性能的极大浪费。

三、代码优化

通过第二步知道了问题所在,就可以有的放矢,我将PropertiesUtil这个类的实例化方式修改为单例模式,通过再次验证,导出时长优化到10s内,性能得到极大提升。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐