.net CPU和内存爆高的分析与处理01
一、问题现象
从截图现象看,应用程序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的更多相关文章
- JAVA应用程序占用CPU、内存过高分析过程
1.查看cpu占有率 top -P 2.查看进程cpu占用率 ps -mp 3749 -o THREAD,tid,time|sort -rn|head -n 20 查看占用cpu高,且占用时间长的线程 ...
- 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 ...
- 使用Java VisualVM配置Java应用程序/分析CPU或内存的使用情况(转)
以下内容翻译自(机翻):https://baptiste-wicht.com/posts/2010/07/profile-applications-java-visualvm.html 当您需要发现应 ...
- perfview微软开源的cpu以及内存性能分析工具
perfview 是一个强大的分析工具,能用来分cpu,内存,磁盘io...多种指标,使用简单,功能强大 用来分析windows应用的性能问题,是一个很不错的选择 下载地址 https://githu ...
- linux下分析java程序占用CPU、内存过高
一.CPU过高分析 1)使用TOP命令查看CPU.内存使用状态可以发现CPU占用主要分为两部分,一部分为系统内核空间占用CPU百分比,一部分为用户空间占用CPU百分比.其中CPU状态中标示id的为空闲 ...
- Python测试进阶——(4)Python程序监控、存储、分析并可视化CPU和内存利用率
monitor190617.py 监控cpu和内存利用率信息,组织成json格式,并写入到 record.txt 文件中: import psutil import time import json ...
- 压测过程中,CPU和内存占用率很高,案例简单分析
Q: 最近公司测试一个接口,数据库采用Mongo 并发策略:并发400个用户,每3秒加载5个用户,持续运行30分钟 数据量:8000条左右 压测结果发现: TPS始终在5左右 ...
- CPU与内存的那些事
下面是网上看到的一些关于内存和CPU方面的一些很不错的文章. 整理如下: 转: CPU的等待有多久? 原文标题:What Your Computer Does While You Wait 原文地址: ...
- 【好书摘要】性能优化中CPU、内存、磁盘IO、网络性能的依赖
系统优化是一项复杂.繁琐.长期的工作,优化前需要监测.采集.测试.评估,优化后也需要测试.采集.评估.监测,而且是一个长期和持续的过程,不 是说现在优化了,测试了,以后就可以一劳永逸了,也不是说书本上 ...
- KVM 介绍(2):CPU 和内存虚拟化
学习 KVM 的系列文章: (1)介绍和安装 (2)CPU 和 内存虚拟化 (3)I/O QEMU 全虚拟化和准虚拟化(Para-virtulizaiton) (4)I/O PCI/PCIe设备直接分 ...
随机推荐
- Vertx 接入Redis (八)
项目github地址:https://github.com/fotocj007/VertxWebApi web服务器经典的mysql+redis模式,这里介绍redis的接入. 一:导入gradle ...
- ctypes学习 + GearDVFS源码分析(/src/perf_lib)
最近在尝试复现GearDVFS的代码,代码结构很复杂,由于需要获取硬件信息,作者使用ctypes实现与底层的交互,任务紧迫,开始学习吧! 1. ctypes介绍 资料的来源已经放在了后文的链接 ...
- 二、Linux基本应用工具
1.系统文件共享(网络) 通过网络文件共享协议(例如 SMB 或 NFS)来完成Ubuntu下的文件夹共享给 Windows 1.Samba 实现共享 安装samaba sudo apt update ...
- ChatGPT学习之旅 (5) 终极Prompt设计
大家好,我是Edison. 上一篇:Prompt花式用法 AI时代的处世法则,能动口,尽量不动手!通过前面4篇内容我们了解了基本的Prompt用法,今天我们来学习终极的Prompt设计方法! 前提条件 ...
- C#语法: init关键字
init关键字是C#9新增的语法,用于属性或索引器中定义访问器.使用init关键字定义的访问器具有init-only的特性,即只能在对象构造期间对属性或索引器元素进行赋值,对象构造完成后,不可以再修改 ...
- C# HttpWebRequest 请求返回 The remote server returned an error: (400) Bad Request.
可以看下他的响应Body catch (WebException ex) { if (ex.Status == WebExceptionStatus ...
- C2. Pokémon Army (hard version) CF #672
题意:给你一个序列,让你任意选出一个子序列,使得奇数位和减去偶数位和最大.同时有q个询问,输出每次交换完a[l]和a[r]后的上述最大值. 思路:首先肯定可以确定选出来的子序列长度为奇数,因为偶数位只 ...
- Win10专业版如何修改锁屏图片的问题
在雨林木风官网里面,有越来越多的小伙伴使用Windows10系统电脑来办公了,Win10系统功能也极为强大的,但是,小伙伴觉得锁屏图片太单一,想要修改自己喜欢的锁屏图片,那么要怎么做呢?下面,win1 ...
- 2025年7月份实时最新获取地图边界数据方法,省市区县街道多级联动【文末附实时geoJson数据下载】
动态生成最新行政区划 GeoJSON 数据并结合 ECharts 实现地图下钻功能 在开发基于地图的数据可视化应用时,一个常见的挑战是获取准确且最新的行政区划边界数据(GeoJSON).许多现有的在线 ...
- 关于VUE中的mapState和mapActions的使用
最近在开发一套系统,前端使用VUE开发,由于本人是后端开发,前端也会一点,但是VUE接触不多,在VUE项目开发遇到的一些坑记录一下,不是专业前端写好的不好,大家不要唝... 在VUE项目中经常会用到m ...