首页 > 系统相关 >记一次老商家端应用内存突然飚高原因分析

记一次老商家端应用内存突然飚高原因分析

时间:2023-10-31 09:46:16浏览次数:35  
标签:分析 功能 商家 明确 导出 内存 应用 数据

一、排查过程

问题发现是因为当时接到了内存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 转载请注明来源

标签:分析,功能,商家,明确,导出,内存,应用,数据
From: https://www.cnblogs.com/Jcloud/p/17799559.html

相关文章

  • 深入浅出Docker应用(阿里云实验)
    (Docker安装和配置)一、docker安装yuminstall-yyum-utilsdevice-mapper-persistent-datalvm2yuminstall-yjqyum-config-manager--add-repohttps://download.docker.com/linux/centos/docker-ce.repoyuminstalldocker-ce.x86_64yuminstall-ydocker-ce.x86_643:......
  • 实验3 C语言函数应用编程
    实验任务11#include<stdio.h>2#include<math.h>3#include<stdlib.h>4#include<time.h>5#include<windows.h>6#defineN807voidprint_text(intline,intcol,chartext[]);8voidprint_spaces(intn);9voidpr......
  • 每日博客——使用Maven对Java独立应用程序进行编译打包
    使用Maven对Java独立应用程序进行编译打包1.安装Maven网盘下载 apache-maven-3.9.2-bin.zip链接为:https://pan.baidu.com/s/181shkgg-i0WEytQMqeeqxA(提取码:9ekc)sudounzip/export/server/apache-maven-3.9.2-bin.zip-d/export/server/cd/export/server/sudomvapac......
  • 钡铼技术ARM工控机在物联网领域的应用
    ARM工控机是一种基于ARM架构的工业控制计算机,用于在工业自动化领域中进行数据采集、监控、控制和通信等应用。ARM(AdvancedRISCMachine)架构是一种低功耗、高性能的处理器架构,广泛应用于移动设备、嵌入式系统和物联网等领域。ARM工控机通常具有以下特点:低功耗和高效性能:ARM处理......
  • 【Azure Function App】如何修改Azure函数应用的默认页面呢?
    问题描述当在Azure中创建了一个函数应用(FunctionApp)后,访问默认URL会得到一个默认的页面。是否有办法修改这个默认页面呢?  问题解答在之前的博文中,介绍了修改AppService的默认页面。1:【Azure应用服务】AppService默认页面暴露Tomcat版本信息,存在安全风险 :https://www.cnbl......
  • 实验3 C语言函数应用编程
    一、实验目的能正确使用c语法规则定义、声明、调用函数能正确编写递归函数针对具体问题场景,能合理抽象出独立的功能模块,正确定义函数并使用,使得代码更具可读性、可维护性针对具体问题场景,能正确、合理使用全局变量和局部static变量,解决实际问题二、实验准备函数定义、声......
  • 实验3_C语言函数应用编程
    1.task_11#include<stdio.h>2#include<stdlib.h>3#include<time.h>4#include<windows.h>5#defineN8067voidprint_text(intline,intcol,chartext[]);8voidprint_spaces(intn);9voidprint_blank_lines(intn)......
  • 智安网络|保护您的应用程序免受攻击:重要的安全强化措施
    在今天的数字化时代,应用程序安全成为了企业和个人必须重视的重要领域。应用程序普遍存在的安全漏洞成为黑客们进行攻击的一个突破口。为了保护敏感数据和个人隐私,我们必须了解并实施一系列的关键措施来加固应用程序的安全性。首先,一个关键的措施是进行全面的代码审查。应用程序中的......
  • 嵌入式Linux中内存管理详解分析
    Linux中内存管理内存管理的主要工作就是对物理内存进行组织,然后对物理内存的分配和回收。但是Linux引入了虚拟地址的概念。虚拟地址的作用如果用户进程直接操作物理地址会有以下的坏处:1、用户进程可以直接操作内核对应的内存,破坏内核运行。2、用户进程也会破坏其他进程的运行CPU......
  • 实验3 C语言函数应用编程
    实验任务1源代码task1.c1#include<stdio.h>2#include<stdlib.h>3#include<time.h>4#include<windows.h>5#defineN8067voidprint_text(intline,intcol,chartext[]);8voidprint_spaces(intn);9voidprint_blank_lines(......