排查订单导出内存占用率逐步增大的问题

症状

每次导出,导出的内存利用率都会小幅或大幅增长。一次VIP导出后,导出的内存利用率会较大增长。

十次较小导出的结果,从 15:30 有一个小步的内存利用率攀升。

一次VIP大流量导出的结果,从 14:04 有一个大幅的陡峭的攀升。

基本步骤

STEP1:
运行一次比较大的导出后,使用 jmap 工具从服务器生成内存文件 mem.bin。使用 top -c M 拿到占用内存最高的 pid;然后

sudo su app
jmap -dump:live,format=b,file=/tmp/mem.bin pid
chmod 777 /tmp/mem.bin

STEP2:
将 mem.dat scp 到本地

scp [email protected]:/tmp/mem.bin /tmp/mem.bin
scp [email protected]:/tmp/mem.bin /tmp/mem.bin

STEP3:
在 http://www.eclipse.org/mat/downloads.php 下载 MAT 工具,解压安装即可。
打开 mem.dat

STEP4: 分析内存文件,定位原因和修复问题。

第一轮优化

概览

Overview: 内存全貌,找到最大内存占用对象;

点击TopConsumers, 概览所有占用内存比较较大的对象集合。

点击 DominatorTree (支配树) ,可以看到所有占用内存比较多的对象的引用链

内存占用明细分析

点击 Leak Suspects ,查看内存泄露的最大嫌疑。可以看到 export-execute-thread1 占用了一个大对象列表 List。

线程栈引用

分析和定位原因

为什么这些对象被导出任务线程持有? 原因很可能是:导出线程是 Context 持有者,Context 在导出结束时没有清理, 而线程因为某种原因没有退出和被回收,导致 Context 依然在内存里。 做了个 Context 清理之后,再部署并 dump 文件,发现之前的List大对象已经没有了。

第二轮优化

清理 Context 之后,重新运行发现内存占用依然逐增。 重新 dump, 发现貌似 groovy 脚本导致。原因可能是: 在每次导出前,都会把字段配置的groovy脚本加载到单个线程中,而导出结束时这些脚本没有清理。再做一层脚本引用的清理:

fieldConfig.getCacheScript().setBinding(null);
fieldConfig.setCacheScript(null);

发现不再有 Groovy 脚本占用内存的嫌疑。

第二轮优化后,虽然 groovy 的嫌疑有所减轻,可是还是没有完全消除。这下,从代码上确实看不出什么了。

第三轮优化

原来的策略是每次导出,都从数据库的配置克隆一份配置,创建一个缓存的Script对象,导出结束时清除(可能没真正清除掉);现在的策略是,做一个Script对象的缓存池。如果没有Script对象的执行,那么也不会创建多余的Script占用空间。从30天内存占用率图来看,在最后一次发布后,尽管有多次大流量导出,内存占用保持平稳。

参考文章

https://eclipsesource.com/blogs/2013/01/21/10-tips-for-using-the-eclipse-memory-analyzer/
http://www.lightskystreet.com/2015/09/01/mat_usage/
https://blog.csdn.net/wanghuiqi2008/article/details/50724676
https://www.jianshu.com/p/efec4c77e265
https://www.ibm.com/developerworks/cn/opensource/os-cn-ecl-ma/index.html?ca=drs-
https://blog.csdn.net/dashuniuniu/article/details/52224882

原文地址:https://www.cnblogs.com/lovesqcc/p/9521047.html

时间: 2024-11-05 12:06:58

排查订单导出内存占用率逐步增大的问题的相关文章

[转帖]Java性能检测工具-记录一次通过jstack排查Linux服务器CPU占用率很高的实践

Java性能检测工具-记录一次通过jstack排查Linux服务器CPU占用率很高的实践 https://www.jianshu.com/p/d4e31301ba2e 一.问题描述 Linux服务器的配置是4核16G,将war包部署到tomcat后,启动tomcat,发现内存占用率不高,但是CPU一直高达100%:浏览器输入相关url也无法访问该项目,且tomcat的进程一直存在,程序的配置什么的都没问题啊,一头雾水......通过top命令查看服务器的性能状况如下: [[email prote

linux ps命令,查看某进程cpu和内存占用率情况, linux ps命令,查看进程cpu和内存占用率排序。 不指定

背景:有时需要单看某个进程的CPU及占用情况,有时需要看整体进程的一个占用情况.一. linux ps命令,查看某进程cpu和内存占用率情况[[email protected] vhost]# ps auxUSER       PID  %CPU    %MEM    VSZ   RSS TTY      STAT    START   TIME COMMAND解释:linux 下的ps命令USER 进程运行用户PID    进程编号%CPU 进程的cpu占用率%MEM 进程的内存占用率VSZ

解决服务器上 w3wp.exe 和 sqlservr.exe 的内存占用率居高不下的方案

SQL Server是如何使用内存 最大的开销一般是用于数据缓存,如果内存足够,它会把用过的数据和觉得你会用到的数据统统扔到内存中,直到内存不足的时候,才把命中率低的数据给清掉.所以一般我们在看statistics io的时候,看到的physics read都是0.其次就是查询的开销,一般地说,hash join是会带来比较大的内存开销的,而merge join和nested loop的开销比较小,还有排序和中间表.游标也是会有比较大的开销.最后我们来看查询的开销,这个开销显然是越低越好,因为我

Linux shell 脚本 实现查询出进程的名字,cup内存占用率,启动时间在线状态等格式化输出

目的是查询出进程的名字,cup内存占用率,启动时间在线状态等格式化输出 脚本实现的结果:[[email protected] ~]# sh /app/shell/app_status.shProcessName---------GroupName-------Status-----PID----CPU----MEMORY----StarTime---nginx WEB STOPED NULL NULL NULL NULLhttpd WEB STOPED NULL NULL NULL NULLmy

监控系统 内存占用率并记录于本地文件中

vs2008  windows平台 监控内存性能(磁盘 网络流量 远程数据库记录待添加) 使用方法 vs2008 编译完成后 使用"WinPerforMonitor.exe -mem -log" 执行即可 -log命令行会在文件目录下新建一个文件记录内存使用率变化 目前仅仅支持内存记录 后继将添加cpu使用率 磁盘分区占用率及网络流量可以本地远程进行文件记录及数据库记录 以供查询分析 代码地址 http://www.oschina.net/code/snippet_614253_460

IIS解决CPU和内存占用率过高的问题

发现进程中的w3wp占用率过高. 经过查询,发现如下: w3wp.exe是在IIS(因特网信息服务器)与应用程序池相关联的一个进程,如果你有多个应用程序池,就会有对应的多个w3wp.exe的进程实例运行.这个进程用来分配大量的系统资源.这个进程对于系统的稳定和安全具有重要的意义,不能轻易的结束掉这个进程. 找到解决办法:(Windows2008中可以通过:服务器管理器->角色\web服务器\iis管理器 找到网站下的应用程序池,直接在程序池项的右键中修改) 解决CPU占用过多: 1.在IIS中对

Linux 下用管道执行 ps aux | grep 进程ID 来获取CPU与内存占用率

#include <stdio.h> #include <unistd.h>   int main() {     char caStdOutLine[1024]; // ps 命令的标准输出中的一行信息     char* pcTmp = NULL;      // 指向以空格拆分后的字符串       char caSelfPID[10];      // 自身进程的PID字符串     char caPSCmd[24];        // "ps aux | gr

压测过程中,CPU和内存占用率很高,案例简单分析

Q:  最近公司测试一个接口,数据库采用Mongo    并发策略:并发400个用户,每3秒加载5个用户,持续运行30分钟    数据量:8000条左右 压测结果发现:    TPS始终在5左右    而CPU高达99%,内存使用情况也高达1.7G    网卡流量145K 请问这种情况,是哪里的性能出现问题? A:你这个CPU和内存监控的得是web服务器 就是部署程序的机器.    1.尝试查看出现这类情况时候数据库process,看看是否是当时进程到达了所设置的进程数上限.如果是则调整数据库进

解决新装 Win 7 SP1 系统更新高CPU及内存占用率方法

最近重新安装了win7 sp1,系统更新始终无法工作,开始怀疑是驱动安装出现问题.但反复安装新旧驱动也解决不了问题,出现update服务cpu(Svchost.exe)占用居高不下的情况.网上也找了不少办法,什么重启服务,修复Windows更新服务等一系列不靠谱的方法,都是无济于事.几乎翻遍了整个互联网终于功夫不负有心人,找到了最终解决方法,就是需要提前安装一个补丁,但经过反复实验,事实证明需要安装两个补丁. 1.KB3102810 该补丁可以解决更新时CPU满载及大内存占用的情况 2.KB94