打印大对象日志导致GC问题的解决

news/2024/12/22 19:58:39/

内容:

  • rpc调用外部服务时,需要将req和resp的信息打印出来,以便于排查问题。
  • 但是有的rpc服务的resp信息过于庞大,比如resp中有List<>信息,list很大很大时
  • 会导致log.info打印信息时,产生GC,影响业务

通过将大对象拆分为小对象,解决GC耗时过长问题,进而解决GC过长对业务的影响(TP999过长导致超时、慢sql)等

1、背景

正常情况下,2M、3M就为大对象。会直接被分配至old region。如果此大对象为日志对象,被频繁的加入老年代,会引起Full Gc,影响接口性能或db性能。

2、解决

将大对象,part拆分为小对象再打印,这样young gc更快,影响更小

3、code实现(以List的拆分为例)

@Slf4j
@Component
public class PartLogUtils {public <V> void partLog(List<V> info,int count,Logger logger,String format) {List<List<V>> result = splitInfo(info, count);logInfo(result, logger, format);}private <V> List<List<V>> splitInfo(List<V> info, int count) {List<List<V>> result = Lists.newArrayList();if (CollectionUtils.isEmpty(info) || info.size() < count) {result.add(info);return result;}List<V> temp = Lists.newArrayList();int index = 0;for (V item : info) {index++;temp.add(item);if (index % count == 0) {result.add(temp);temp = Lists.newArrayList();}}if (temp.size() > 0) {result.add(temp);}return result;}private <V> void logInfo(List<V> infoList, Logger logger, String format) {for (V item : infoList) {logger.info(format, GsonUtils.toJsonStr(item));}}}

类A中使用

private  final  static Logger logger = LoggerFactory.getLogger(A.class);PartLogUtils.partLog(resp, 2000, logger,"queryUserInfo:[{}]");

4、打印Map对象的优化同理


http://www.ppmy.cn/news/1124780.html

相关文章

爬虫异常处理实战:应对请求频率限制和数据格式异常

作为一名资深的爬虫程序员&#xff0c;今天我要和大家分享一些实战经验&#xff0c;教你如何处理爬虫中的异常情况&#xff0c;包括请求频率限制和数据格式异常。如果你是一个正在进行网络爬虫开发的开发者&#xff0c;或者对异常处理感兴趣&#xff0c;那么这篇文章将帮助你更…

DAZ To UMA⭐三.导入Blender的配置, 及Blender快捷键

文章目录 🟥 Blender快捷键1️⃣ 3D视图快捷键2️⃣ 视角快捷键3️⃣ 编辑快捷键4️⃣ 对物体的操作🟧 Blender导入FBX的配置🟩 设置脸部骨骼大小1️⃣ 切换视角2️⃣ 缩小脸部骨骼3️⃣ 本节效果预览🟦 设置眼角膜透明度🟥 Blender快捷键 1️⃣ 3D视图快捷键 快捷键…

Go语言中的自定义函数类型

函数类型的基本概念 在Go语言中&#xff0c;函数类型是一种将函数作为值的数据类型。与其他类型一样&#xff0c;函数类型可以被声明、赋值给变量&#xff0c;作为参数传递和作为返回值返回。通过函数类型&#xff0c;我们可以将函数看作一种可执行的对象&#xff0c;对其进行…

HTML计时事件(JavaScript)网页电子钟+网页计时器

setTimeout("函数","未来指定毫秒后调用函数"); clearTimeout(setTimeout("函数","未来指定毫秒后调用函数")); <!DOCTYPE html> <html><head><meta charset"utf-8"><title></title>…

常用工具使用

ubuntu 1.1 ubuntu与windows 互相复制问题 方法一、 打开虚拟机 &#xff0c;点击上方导航栏 ‘虚拟机’ 查看VMware Tools是否安装&#xff0c;安装即可 方法二、 apt-get autoremove open-vm-tools apt-get install open-vm-tools apt-get install open-vm-tools-desktop…

使用 PyTorch 的计算机视觉简介 (1/6)

一、说明 Computer Vision&#xff08;CV&#xff09;是一个研究计算机如何从数字图像和/或视频中获得一定程度的理解的领域。理解这个定义具有相当广泛的含义 - 它可以从能够区分图片上的猫和狗&#xff0c;到更复杂的任务&#xff0c;例如用自然语言描述图像。 二、CV常见的问…

Tomcat 开启远程调试

Tomcat 部署的 war包工程开启远程调试 Linux服务器下&#xff0c;编辑Tomcat bin 目录下的 startup.sh 文件 vim startup.sh在第一行加入&#xff1a;(不换行&#xff0c;在同一行) declare -x CATALINA_OPTS"-server -Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:…

【从0学习Solidity】45. 时间锁

【从0学习Solidity】45. 时间锁 博主简介&#xff1a;不写代码没饭吃&#xff0c;一名全栈领域的创作者&#xff0c;专注于研究互联网产品的解决方案和技术。熟悉云原生、微服务架构&#xff0c;分享一些项目实战经验以及前沿技术的见解。关注我们的主页&#xff0c;探索全栈开…