记一次老商家端应用内存突然飚高原因分析 | 京东物流技术团队

一、排查过程

问题发现是因为当时接到了内存UMP报警信息,如下:

通过查看PFinder发现内存一直在增长,没有停止迹象,触发fullGC也并没有下降趋势:

当机立断,先立即去NP上摘除了此台机器流量,然后继续观察,发现内存依然在不断增长。

随即查看故障分析,并没有得到有效信息:

因为流量已经摘除,那么继续观察到底哪里的问题,约半小时后然后接到了机器的宕机告警如下:

由于在应用启动参数里配置了dump路径,那么就马上去把dump文件下载下来分析。

随后找到对应IP机器的目录,下载了dump文件java_pid432.hprof核对时间没有问题,随即使用MAT工具开展分析,通过泄露分析结果直接就可以看出problem1与problem2都是一个同一个问题,2个线程分别占用1.8G、1.5G:

通过查看问题对应的代码类方法,发现该方法功能是"导出WMS保质期商品数据",该方法会调用库存分页接口查询保质期商品,大致如下:

1、查询无数据直接导出空表;

2、第一页查询总量小于1000的话直接把数据写入第一个sheet并导出表格;

3、第一页查询总量大于1000则循环分页查询,每1000条数据生成一个sheet表格进行导出。

可以看到,org.apache.poi.hssf.usermodel.HSSFWorkbook对象数量已经达到702个了。

翻看具体代码部分如下:

二、解决思路

经过对该功能代码分析,本着先解决问题的原则,先将循环调用功能进行限制,通过ducc配置导出页数大小限制,来避免一直循环调用。

至此,问题初步解决完毕,调整后没有出现问题。

但是,这个功能的优化并没有结束,随后将该问题及功能逻辑反馈给产品及库存相关方,一起讨论解决商家导出的问题,一方面我们要保障商家体验,另一方面又要确保系统稳定性。后续要从这2方面入手进行功能的优化,不断为提升商家体验而努力。

三、总结分析

回过头来咱们再分析以下这个功能,通过系统日志及监控,发现该功能商家日常使用较少,并且大部分商家的保质期商品较少,极少数会存在有非常多保质期商品数据的情况。但是一旦出现这样的问题就会很致命,所以在导出功能设计之初我们就应该考虑到将来任何可能出现的情况,并做好提前的预防。另外就是要做功能的限制,例如导出次数、导出数据量的限制功能来保障商家体验及系统的安全稳定。

另外再说一下,对导出功能的理解,对于商家而已,导出需求是正常的。但是过多大批量数据的一起导出无论对哪个系统来说都是非常危险的一个功能。以下列举了一些个人总结的导出功能设计时的一些常见规则,希望大家一起参与讨论分析,拙见如下:

  • 明确导出数据的价值分析
  • 明确导出数据的使用倾向
  • 明确导出数据的安全要求
  • 明确导出数据的权限控制
  • 明确需要导出的数据量级
  • 明确导出数据的方式方法
  • 明确到仓数据的频率频次
  • 明确导出数据的性能效率
  • 明确导出数据的限制方法
  • 明确导出功能的隔离及降级方案
  • 明确导出数据的格式样式
  • 明确导出数据的下载方案
  • 明确导出数据的错误监控

以上是个人想到的一些导出设计的简单规则,需要产研测一起沟通明确,还希望大家多提提意见,一起完善导出规则。

另外我们再从商家角度来考虑一下导出的目的,个人从询问业务及相关人员,发现商家导出数据有以下一些目的:

  • 存储归档方便查历史资料
  • 利用系统业务数据进行数据分析已指导商家业务工作或给领导汇报工作
  • 导出来使用表格工具等其他商家熟悉的工具进行查看,更便捷便利
  • 对导出的数据进行加工,并用于其他非京东系统的数据输入
  • 无意识的导出并无其他作用

以上是个人总结的一些商家导出的需求目的,其实针对商家导出来说可能还有很多其他目的,我们不能全部都能了解。但是可以积极与商家沟通理解商家的真实目的。

另外,我们需要去分析商家的诉求,挖掘商家需求背后的目的。假如有个服装行业的商家需要做服务订单业务数据、库存数据分析,是否我们可以利用数智侧的系统能力,为商家打造通用的数据分析能力呢,这样既可以避免导出数据手动分析的鸡肋,同时也提升了商家对京东物流的系统使用体验。

以上仅仅代表个人观点,一点愚见,还请大家批评指正!

欢迎大家一起探讨!

作者:京东物流 刘邓忠

来源:京东云开发者社区 自猿其说Tech 转载请注明来源

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/124935.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设计模式——策略模式(Strategy Pattern)+ Spring相关源码

文章目录 一、策略模式定义二、例子1. 菜鸟教程例子(略有改动)1.1 、定义。1.2、定义加法策略类1.3、定义乘法策略类1.4、创建 Context 类1.5、使用 2、JDK awt包——BufferStrategy3、Spring源码 —— InstantiatorStrategy4、Spring源码 —— Instanti…

发布一站式反电诈工具,合合信息商业大数据技术助力银行守护群众“钱袋子”

近期,电影《孤注一掷》在社交媒体上引起了广泛的讨论,社会各界对于电信网络诈骗案件的关注度日益提升。真实世界中的电诈涉及金额之大、团伙成员之多,往往比电影更甚。为此,国家不断加大对电信诈骗的打击力度,出台《反…

低功耗设计-ir drop的signoff corner怎么选择?

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 相关文章链接: Multi Voltage Flow笔记 有几个方向,看公司需求吧 1.功耗最差的; 2.tt的(tt85 是比较接近芯片真实工作情况的&#xff09…

etcd问题

一、etcd警告 "应用条目耗时过长 "是什么意思? 在大多数etcd成员同意提交请求后,每个etcd服务器将请求应用于其数据存储,并将结果持久化到磁盘。即使是慢速的机械磁盘或虚拟化的网络磁盘,如亚马逊的EBS或谷歌的PD,应用一个请求的时间通常应少于50毫秒。如果平均…

C# 如何反射获取常量值

首先,常量是一个字段,所以需要从字段中获取该值。 但是需要传入的BindingFlags是什么,与其盲猜,不如直接反射所有字段值,查看其中的常量有哪些特性和bool值来判断。 ...static void Main(string[] args){var type typ…

【javaweb】学习日记Day13 - AOP 事务管理 切入点 连接点

目录 一、完善解散部门功能 二、spring 事务 (1)Transactional 事务管理 ① rollbackFor 控制异常类型 ② propagation 事务传播控制 1、定义解散部门操作日记 三、AOP基础 1、概述 2、快速入门 (1)案例:统…

RabbitMQ初入门

1、RabbitMQ是什么 RabbitMQ是“实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而集群和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均…

错误 LNK1181 无法打开输入文件“\VulkanSDK\**.lib”

这个错误消息表明在项目构建过程中,链接器无法找到名为 “.lib” 的库文件。原因通常是: 确实该路径下没有这个库文件库文件路径设置错误 以上两个原因排除后,那可能是: 项目和库文件的体系结构不同(64位&#xff0…

STM32的bootloader程序(通过串口更新STM32应用程序)

1 什么是bootloader? Bootloader,也被称为引导加载程序,是操作系统启动过程中的一个重要组成部分。它是存储在非易失性存储器中的一段小程序,负责在操作系统内核运行之前加载并启动一些必要的系统组件。 当计算机开机后&#xff0…

ICC2: 如何在显示GUI操作产生的命令

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 ICC2:自定义快捷键和菜单 VIEW -> Perference -> Global Settings 把display commands in logging console 下面几个都勾上即可。

css:button实现el-radio效果

先看最终效果&#xff1a; ​​​ 思路&#xff1a; 一、 首先准备好按钮内容&#xff1a;const a [one,two,three] 将按钮循环展示出来&#xff0c;并设置一些样式&#xff0c;将按钮背景透明&#xff1a; <button v-for"(item,index) in a" :key"in…

Python 字典(Dictionary) get() 函数返回指定键的值

Python 字典(Dictionary) get() 函数返回指定键的值。 语法 get()方法语法&#xff1a; dict.get(key[, value]) 参数 key – 字典中要查找的键。 value – 可选&#xff0c;如果指定键的值不存在时&#xff0c;返回该默认值。 返回值 返回指定键的值&#xff0c;如果键不在字…

实战之巧用header头

案例&#xff1a; 遇到过三次 一次是更改accept&#xff0c;获取到tomcat的绝对路径&#xff0c;结合其他漏洞获取到shell。 一次是更改accept&#xff0c;越权获取到管理员的MD5加密&#xff0c;最后接管超管权限。 一次是更改accept&#xff0c;结合参数获取到key。 这里以越…

C # 基础知识汇总

C# 委托和事件 非常经典 上文最初链接

计算节点上iptables安全组分析

计算节点上iptables安全组分析 之前介绍过neutron 安全组基于iptables 和 ct 实现&#xff0c;分析一下计算节点上面的neutron 安全组的iptables&#xff0c;加深一下理解iptables以及安全组的实现。&#xff08;PS: 如下基于openstack stein) 查看某计算节点上面的iptables …

如何选购适合自己的内衣洗衣机?性价比高内衣洗衣机推荐

内衣洗衣机&#xff0c;在几年前或许是个新事物&#xff0c;但近两年却是成为了很普遍的家电产品&#xff0c;由于近几年内衣洗衣机需求量的增加&#xff0c;我们在商场的电子产品区都能见到它&#xff0c;就像普通的家庭洗衣机那样&#xff0c;直接摆在展台上销售&#xff0c;…

VPS是什么?详解亚马逊云科技Amazon Lightsail(VPS)虚拟专用服务器

2006年&#xff0c;南非开普敦&#xff0c;亚马逊推出了WBS&#xff0c;以网络服务的形式向企业提供基础的IT服务。亚马逊云科技的一小步&#xff0c;在无数技术更迭&#xff0c;天才设计师和程序员的努力与基础设施建设的完善之下成为了人类科技进展的一大步。 亚马逊云科技可…

LeetCode75——Day21

文章目录 一、题目二、题解 一、题目 1207. Unique Number of Occurrences Given an array of integers arr, return true if the number of occurrences of each value in the array is unique or false otherwise. Example 1: Input: arr [1,2,2,1,1,3] Output: true Ex…

【Spring Boot 源码学习】RedisAutoConfiguration 详解

Spring Boot 源码学习系列 RedisAutoConfiguration 详解 引言往期内容主要内容1. Spring Data Redis2. RedisAutoConfiguration2.1 加载自动配置组件2.2 过滤自动配置组件2.2.1 涉及注解2.2.2 redisTemplate 方法2.2.3 stringRedisTemplate 方法 总结 引言 上篇博文&#xff0…

携手云栖,共望未来

&#x1f4a8;随着信息技术的迅猛发展&#xff0c;云计算已成为推动数字经济发展的重要驱动力之一。在这个领域中&#xff0c;云栖大会无疑是中国乃至全球最重要的盛会之一。云栖大会的历史可以追溯到2009年的地方网站峰会&#xff0c;随着时间的推移&#xff0c;它逐渐演变为阿…