一、问题现象



从截图现象看,应用程序CPU和内存都上去了。并且还是导致程序崩溃了。这时我想到了在老师(一线码农)那里学到的分析办法,先抓取一个Dump。然后仔细分析。

二、分析Dump

通过Address -summary命令,查看内存确实偏高,并且都在托管堆中。

2.1 确认CPU是否真的存在跑高的的现象

通过!tp 查看CPU 确实偏高

三、分析内存泄漏问题

3.1 通过!dumpheap -stat 命令,看看内存中对象分配情况



从上图,不难看出Seismic.Core.TraceData的数量挺多的,837 546 144(8亿多个对象),有点恐怖。

3.2 查找Seismic.Core.TraceData对象的持有者

通过dumobj命令,可以看到对象的字段信息,是一个时间和一个浮点数。

3.3. 然后通过 !gcroot命令,查看对象的引用链



发现此对象被 "4B5C"线程持有,并且在做Clone处理

3.4 找到对应Dll的相关方法



发现在进行对象的深度复制。看上去代码也没什么问题。但和同事一沟通,他将传感器采集到最近25分钟数据,都进行了一个Clone。这么说一还可能就是问题了。我们传感器平均1秒钟4000条数据,25分钟有高达600W条数据,再对600W的对象进行一个深度复制,就将产生1200W的对象。可想内存开销还是可观的。由于外层逻辑也是定时分析,分析完成后也没有进行GC的清理。程序运行时长了,内存就上去了。

四、分析Cpu占用高的情况

4.1 通过!t -special 命令,查看是否存在GC加收的情况

4.2 转换到2b04线程,查看调用栈



从上述调用栈可以看出来,在进行反序列化的时候,触发的GC回收。

4.3 通过syncblk,查看是否存在锁的情况



从上述信息可以看出,当前存在一个锁。



也可以看出,正常在等等GC回收的完成。GC算是CPU密集信息操作,又回收大量数据,CPU上去也算是正常。

五、总结

1 小对象,数量多的情况下,进行深度复制,会导致内存爆高

2 GC在回收大量对象时,会导致CPU爆高

.net CPU和内存爆高的分析与处理01的更多相关文章

  1. JAVA应用程序占用CPU、内存过高分析过程

    1.查看cpu占有率 top -P 2.查看进程cpu占用率 ps -mp 3749 -o THREAD,tid,time|sort -rn|head -n 20 查看占用cpu高,且占用时间长的线程 ...

  2. cgroup 分析之CPU和内存部分

    https://ggaaooppeenngg.github.io/zh-CN/2017/05/07/cgroups-%E5%88%86%E6%9E%90%E4%B9%8B%E5%86%85%E5%AD ...

  3. 使用Java VisualVM配置Java应用程序/分析CPU或内存的使用情况(转)

    以下内容翻译自(机翻):https://baptiste-wicht.com/posts/2010/07/profile-applications-java-visualvm.html 当您需要发现应 ...

  4. perfview微软开源的cpu以及内存性能分析工具

    perfview 是一个强大的分析工具,能用来分cpu,内存,磁盘io...多种指标,使用简单,功能强大 用来分析windows应用的性能问题,是一个很不错的选择 下载地址 https://githu ...

  5. linux下分析java程序占用CPU、内存过高

    一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...

  6. Python测试进阶——(4)Python程序监控、存储、分析并可视化CPU和内存利用率

    monitor190617.py 监控cpu和内存利用率信息,组织成json格式,并写入到 record.txt 文件中: import psutil import time import json ...

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

    Q:  最近公司测试一个接口,数据库采用Mongo    并发策略:并发400个用户,每3秒加载5个用户,持续运行30分钟    数据量:8000条左右 压测结果发现:    TPS始终在5左右   ...

  8. CPU与内存的那些事

    下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...

  9. 【好书摘要】性能优化中CPU、内存、磁盘IO、网络性能的依赖

    系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...

  10. KVM 介绍(2):CPU 和内存虚拟化

    学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...

随机推荐

  1. hot100之双指针

    移动0(283) 先看代码 class Solution { public void moveZeroes(int[] nums) { int idx0 = 0; for (int idx = 0; ...

  2. [abc309 G] Ban Permutation

    G - Ban Permutation 首先看到绝对值,很烦,考虑取掉绝对值得到\(p_i\leq i-X\)或\(p_i\geq i+X\) 然后我们就自然而然有了一个暴力的想法,设\(dp[i][ ...

  3. Wondows11安装 Docker Desktop 教程

    环境准备 确保电脑BIOS里面开启了虚拟化,可以任务管理器里面查看 启用wondows虚拟化支持 控制面板-程序-启用或关闭wondows功能 这里如果是家庭版,可能没有Hyper-v,没有就不勾 或 ...

  4. matlab绘图中set函数的使用汇总

    Matlab 绘图中set函数使用汇总 % 设置标题字体大小,字型 set(get(gca,'title'),'FontSize',10,'FontName','宋体'); % 设置X坐标标题字体大小 ...

  5. 学习spring cloud记录2-在项目中使用mybatis-plus

    前言 本记录详细记录本人学习spring cloud继承mybatis plus方法,适用于初学者. 项目结构简单介绍 本系统目前新建两个dmeo服务,分别是demo-user和demo-order两 ...

  6. left join 和 where 区别

    RT https://leetcode.cn/problems/replace-employee-id-with-the-unique-identifier/solution/ select b.un ...

  7. C++ STL 六大组件的交互关系

    简介 阅读 STL源码剖析 STL6大组件的交互关系 Container 通过 Allocator 取得数据存储空间, Algorithm 通过 Iterator 存取 Container 的内容, ...

  8. C2065错误

    简介 应该是编译器出现了问题 有的时候 我加入注释就会报错.贼烦人.算了 还是用英文写注释没毛病. 其实核心解决方案 https://blog.csdn.net/weixin_43975504/art ...

  9. Vue 开源项目低代码表单设计器 FcDesigner v3.3 版本发布!兼容Element Plus/Ant Design/Vant,支持PC/移动端

    FcDesigner 是一款基于 Vue 的低代码可视化表单设计器工具,通过数据驱动表单渲染.可以通过拖拽的方式快速创建表单,提高开发者对表单的开发效率,节省开发者的时间.并广泛应用于在政务系统.OA ...

  10. AppLink让你的电商运营财务管理自动化

    电商运营财务管理的现状 在我们做电商运营管理的时候,财务管理是一个很繁琐并且对精度要求比较高的工作.通常需要花费财务管理人员很长的时间和经理进行核对.企业电商金额大,商品多.个体电商人员少,精力更多在 ...