CLR Profile解决内存占用过高
CLR Profile解决内存占用过高的问题
炮哥:"嘿,哥们,忙啥呢,电脑卡成这逼样。"
勇哥:"在用CLR Profile工具分析下FlexiPrint的内存占用情况。"
炮哥:“哎哟,不错啊,玩高级的了。”
勇哥:“也没有啊,就是发现点击查询按钮查询数据时,如果数据量一大的话,内存上上升了好几个M,所以第一感觉就不太正常。正好以前也了解过CLR Profile,但一直没怎么具休的用过,这次正好拿来研究研究。”
炮哥:“Nice job,要向你学习,能够主动发现问题并研究解决方法。对了,有什么发现么?”
勇哥:“通过工具发现dgMain_CellFormatting方法占用内存过多。”

炮哥:“这个方法干嘛用的,要这么多的内存?”
勇哥:“其实做的事情很简单,根据每行订单的不同状态,显示不同的图标,以便让客户能够很直白的了解订单的状态。”
炮哥:“噢,是这样,那确实没什么,让我看下代码。”

namespace IPP_PCL.HomeViewUserControl
{
public partial class PrintOrderInformationUserControl : UserControl, IHomePrintOrderInformationView
{
#region Field private readonly PrintCellLiteServiceClient _serviceClient = new PrintCellLiteServiceClient(); #endregion #region Event Handler /// <summary>
/// 此事件主要用于图片按钮的显示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void dgMain_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
if (dgMain.Columns[e.ColumnIndex].Name.Equals("dgMain_PrintIcon"))
{
int row = e.RowIndex;
//获取展示图片按钮的单元格
string status = dgMain.Rows[row].Cells["dgMain_statusKey"].Value.ToString(); switch (status)
{
case "Print in Progress":
string erpSoNumber = this.dgMain.Rows[row].Cells["dgMain_ErpSoNumber"].Value.ToString(); //从DB中查找erp_so_number的记录
IEnumerable<FileIndexModel> fileIndexes = _serviceClient.GetFileIndex(erpSoNumber); //如果在FileIndex表中存在pro的记录
if (fileIndexes == null || !fileIndexes.Any()) { break; } FileIndexModel fileIndex = fileIndexes.First(); if (FileStatus.PRINTED != fileIndex.PrintedStatus && FileStatus.PARTIAL_PRINTED != fileIndex.PrintedStatus)
{
e.Value = Properties.Resources.picYellow;
}
else
{
e.Value = Properties.Resources.picGreen;
} break; case "Printed": e.Value = Properties.Resources.picGreen;
break; case "Partial Printed": e.Value = Properties.Resources.picGreen;
break; default: e.Value = Properties.Resources.picYellow;
break;
}
}
} #endregion }
}

勇哥:“......”
炮哥:“很简单,写得很明白,这方法没什么问题吧,会不会搞错了。”
勇哥:“应该不会,通过CLR Profile分析发现,在这个方法中创建了非常多的对象。”
炮哥:“你是说BitMap对象?”
勇哥:“是的。”
炮哥:“噢,明白了,每次访问Properties.Resources.picGreen类似的属性时,都会创建一个新的对象。但其实图标就那么几类,完全可以先保存在内存中,要用时直接引用就行了。”
勇哥:“说得对,让我修改下代码 ,看看情况。”
炮哥:“让我看下你怎么修改的?”
勇哥:“......”

1 namespace IPP_PCL.HomeViewUserControl
2 {
3 public partial class PrintOrderInformationUserControl : UserControl, IHomePrintOrderInformationView
4 {
5 #region Field
6
7 private readonly PrintCellLiteServiceClient _serviceClient = new PrintCellLiteServiceClient();
8
9 Bitmap picGreenBitMap = Properties.Resources.picGreen;
10
11 Bitmap picYellowBitMap = Properties.Resources.picYellow;
12
13 #endregion
14
15 #region Ctor
16
17 public PrintOrderInformationUserControl()
18 {
19 InitializeComponent();
20 }
21
22 #endregion
23
24 #region Event Handler
25
26 /// <summary>
27 /// 此事件主要用于图片按钮的显示
28 /// </summary>
29 /// <param name="sender"></param>
30 /// <param name="e"></param>
31 private void dgMain_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
32 {
33 if (dgMain.Columns[e.ColumnIndex].Name.Equals("dgMain_PrintIcon"))
34 {
35 int row = e.RowIndex;
36 //获取展示图片按钮的单元格
37 string status = dgMain.Rows[row].Cells["dgMain_statusKey"].Value.ToString();
38
39 switch (status)
40 {
41 case "Print in Progress":
42
43 var proDt = dgMain.DataSource as DataTable;
44
45 if (proDt == null || proDt.Rows.Count == 0) { break; }
46
47 string erpSoNumber = this.dgMain.Rows[row].Cells["dgMain_ErpSoNumber"].Value.ToString();
48
49 //从DB中查找erp_so_number的记录
50 IEnumerable<FileIndexModel> fileIndexes = _serviceClient.GetFileIndex(erpSoNumber);
51
52 //如果在FileIndex表中存在pro的记录
53 if (fileIndexes == null || !fileIndexes.Any()) { break; }
54
55 FileIndexModel fileIndex = fileIndexes.First();
56
57 if (FileStatus.PRINTED != fileIndex.PrintedStatus && FileStatus.PARTIAL_PRINTED != fileIndex.PrintedStatus)
58 {
59 e.Value = picYellowBitMap;
60 }
61 else
62 {
63 e.Value = picGreenBitMap;
64 }
65
66 break;
67
68 case "Printed":
69
70 e.Value = picGreenBitMap;
71 break;
72
73 case "Partial Printed":
74
75 e.Value = picGreenBitMap;
76 break;
77
78 default:
79
80 e.Value = picYellowBitMap;
81 break;
82 }
83 }
84 }
85
86 #endregion
87
88 }
89 }

炮哥:“再用CLR Profile分析下修改后的内存情况。”
勇哥:“你看,内存直接从9.0M变为425kB。”

炮哥:“哈哈,看来问题已经解决了。”
勇哥:“今天我发现C#也有闭包的概念。”
炮哥:“闭包?什么玩意?”
勇哥:“我是在学习JS的时候发现有闭包这个概念,但是没想到C#也有这个。”
炮哥:“所以说当你视野放开时,你会发现更多的美好。”
勇哥:“不扯了,该下班了。噢,对了,昨晚看了一部电影<美丽人生>,有兴趣的话可以看下,很不错。”
CLR Profile解决内存占用过高的更多相关文章
- 第一次通过CLR Profile解决内存占用过高的问题
炮哥:"嘿,哥们,忙啥呢,电脑卡成这逼样." 勇哥:"在用CLR Profile工具分析下FlexiPrint的内存占用情况." 炮哥:“哎哟,不错啊,玩高级的 ...
- Spring cloud开发内存占用过高解决方法
https://blog.csdn.net/wanhuiguizong/article/details/79289986 版权声明:本文为博主原创文章,转载请声明文章来源和原文链接. https:// ...
- [转帖]Linux中buff/cache内存占用过高解决办法
Linux中buff/cache内存占用过高解决办法 https://www.cnblogs.com/rocky-AGE-24/p/7629500.html /proc/sys/vm/drop_cac ...
- 通过修改my.ini配置文件来解决MySQL 5.6 内存占用过高的问题
打开后台进程发现mysql占用的内存达到400+M. 修改一下my.ini这个配置文件的配置选项是可以限制MySQL5.6内存占用过高这一问题的,具体修改选项如下: performance_schem ...
- [2017-08-09]一则使用WinDbg工具调试iis进程调查内存占用过高的案例
最近遇到一个奇葩内存问题,跟了三四天,把Windbg玩熟了,所以打算分享下. 症状简介 我们团队的DEV开发环境只有一台4核16G的win2012r2. 这台服务器上装了SqlServer.TFS(项 ...
- 【转】一则使用WinDbg工具调试iis进程调查内存占用过高的案例
最近遇到一个奇葩内存问题,跟了三四天,把Windbg玩熟了,所以打算分享下. 症状简介 我们团队的DEV开发环境只有一台4核16G的win2012r2.这台服务器上装了SqlServer.TFS(项目 ...
- PHPExcel解决内存占用过大问题-dw 查找memoryCacheSize把1M改为2048M
http://blog.sina.com.cn/s/blog_4ec7952d0101fcrd.html PHPExcel解决内存占用过大问题-设置单元格对象缓存 PHPExcel是一个很强大的处理E ...
- PHPExcel解决内存占用过大问题-设置单元格对象缓存
PHPExcel解决内存占用过大问题-设置单元格对象缓存 PHPExcel是一个很强大的处理Excel的PHP开源类,但是很大的一个问题就是它占用内存太大,从1.7.3开始,它支持设置cell的缓存方 ...
- 一个神奇的bug:OOM?优雅终止线程?系统内存占用较高?
摘要:该项目是DAYU平台的数据开发(DLF),数据开发中一个重要的功能就是ETL(数据清洗).ETL由源端到目的端,中间的业务逻辑一般由用户自己编写的SQL模板实现,velocity是其中涉及的一种 ...
随机推荐
- C++编程命名规范
原地址:http://www.cnblogs.com/joinclear/archive/2013/02/21/2921422.html C++编程命名规范 0前言 根据多年工作经验和其它命名规范整理 ...
- RSD和wlwmanifest是什么
今天小博发现header.php文件里<?php wp_head(); ?>显示有以下的两句代码,因为小博的网站打开速度实在太慢了,换空间怕麻烦,那就只有优化代码了. <link r ...
- poj3206(bfs+最小生成树)
传送门:Borg Maze 题意:有一个迷宫,里面有一些外星人,外星人用字母A表示,#表示墙,不能走,空格可以走,从S点出发,在起点S和A处可以分叉走,问找到所有的外星人的最短路径是多少? 分析:分别 ...
- Codeforces 61E Enemy is weak 乞讨i<j<k && a[i]>a[j]>a[k] 对数的 树阵
主题链接:点击打开链接 意大利正在寻求称号 i<j<k && a[i]>a[j]>a[k] 的对数 假设仅仅有2元组那就是求逆序数的做法 三元组的话就用一个树状 ...
- POJ 2002 点hash
Squares Time Limit: 3500MS Memory Limit: 65536K Total Submissions: 15489 Accepted: 5864 Descript ...
- nutch搏斗之一
nutch搏斗之一 问题描述: 在用nutch1.0做generate 包括5亿url的crawldb时,它默认按照64M分块,分成777个map task,在运行的后期出现 Could not fi ...
- TP 控制器扩展_initialize方法实现原理
参考网址:http://gongwen.sinaapp.com/article-59.html 控制器扩展接口 系统Action类提供了一个初始化方法_initialize接口,可以用于扩展需要,_i ...
- HttpClient 网络优化
HttpClient 网络优化 尽管Android官网推荐在2.3及后续版本中使用HttpURLConnection作为网络开发首选类,但在连接管理和线程安全方面,HttpClient还是具有很大优势 ...
- XSS漏洞的分类
XSS漏洞依照攻击利用手法的不同,有下面三种类型: 类型A,本地利用漏洞,这样的漏洞存在于页面中client脚本自身.其攻击步骤例如以下所看到的: Alice给Bob发送一个恶意构造了Web的URL. ...
- C的xml编程文章链接
官方地址:http://www.xmlsoft.org/ http://hi.baidu.com/singyea/item/ed4d1c335a9527b8633aff82 http://os.chi ...