炮哥:"嘿,哥们,忙啥呢,电脑卡成这逼样。"

勇哥:"在用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类似的属性时,都会创建一个新的对象。但其实图标就那么几类,完全可以先保存在内存中,要用时直接引用就行了。”

勇哥:“说得对,让我修改下代码 ,看看情况。”

炮哥:“让我看下你怎么修改的?”

勇哥:“......”

 namespace IPP_PCL.HomeViewUserControl
{
public partial class PrintOrderInformationUserControl : UserControl, IHomePrintOrderInformationView
{
#region Field private readonly PrintCellLiteServiceClient _serviceClient = new PrintCellLiteServiceClient(); Bitmap picGreenBitMap = Properties.Resources.picGreen; Bitmap picYellowBitMap = Properties.Resources.picYellow; #endregion #region Ctor public PrintOrderInformationUserControl()
{
InitializeComponent();
} #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": var proDt = dgMain.DataSource as DataTable; if (proDt == null || proDt.Rows.Count == ) { break; } 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 = picYellowBitMap;
}
else
{
e.Value = picGreenBitMap;
} break; case "Printed": e.Value = picGreenBitMap;
break; case "Partial Printed": e.Value = picGreenBitMap;
break; default: e.Value = picYellowBitMap;
break;
}
}
} #endregion }
}

炮哥:“再用CLR Profile分析下修改后的内存情况。”

勇哥:“你看,内存直接从9.0M变为425kB。”

炮哥:“哈哈,看来问题已经解决了。”

勇哥:“今天我发现C#也有闭包的概念。”

炮哥:“闭包?什么玩意?”

勇哥:“我是在学习JS的时候发现有闭包这个概念,但是没想到C#也有这个。”

炮哥:“所以说当你视野放开时,你会发现更多的美好。”

勇哥:“不扯了,该下班了。噢,对了,昨晚看了一部电影<美丽人生>,有兴趣的话可以看下,很不错。”

第一次通过CLR Profile解决内存占用过高的问题的更多相关文章

  1. CLR Profile解决内存占用过高

    CLR Profile解决内存占用过高的问题 炮哥:"嘿,哥们,忙啥呢,电脑卡成这逼样." 勇哥:"在用CLR Profile工具分析下FlexiPrint的内存占用情况 ...

  2. PHPExcel解决内存占用过大问题-dw 查找memoryCacheSize把1M改为2048M

    http://blog.sina.com.cn/s/blog_4ec7952d0101fcrd.html PHPExcel解决内存占用过大问题-设置单元格对象缓存 PHPExcel是一个很强大的处理E ...

  3. Spring cloud开发内存占用过高解决方法

    https://blog.csdn.net/wanhuiguizong/article/details/79289986 版权声明:本文为博主原创文章,转载请声明文章来源和原文链接. https:// ...

  4. PHPExcel解决内存占用过大问题-设置单元格对象缓存

    PHPExcel解决内存占用过大问题-设置单元格对象缓存 PHPExcel是一个很强大的处理Excel的PHP开源类,但是很大的一个问题就是它占用内存太大,从1.7.3开始,它支持设置cell的缓存方 ...

  5. [转帖]Linux中buff/cache内存占用过高解决办法

    Linux中buff/cache内存占用过高解决办法 https://www.cnblogs.com/rocky-AGE-24/p/7629500.html /proc/sys/vm/drop_cac ...

  6. 通过修改my.ini配置文件来解决MySQL 5.6 内存占用过高的问题

    打开后台进程发现mysql占用的内存达到400+M. 修改一下my.ini这个配置文件的配置选项是可以限制MySQL5.6内存占用过高这一问题的,具体修改选项如下: performance_schem ...

  7. [2017-08-09]一则使用WinDbg工具调试iis进程调查内存占用过高的案例

    最近遇到一个奇葩内存问题,跟了三四天,把Windbg玩熟了,所以打算分享下. 症状简介 我们团队的DEV开发环境只有一台4核16G的win2012r2. 这台服务器上装了SqlServer.TFS(项 ...

  8. 【转】一则使用WinDbg工具调试iis进程调查内存占用过高的案例

    最近遇到一个奇葩内存问题,跟了三四天,把Windbg玩熟了,所以打算分享下. 症状简介 我们团队的DEV开发环境只有一台4核16G的win2012r2.这台服务器上装了SqlServer.TFS(项目 ...

  9. 一个神奇的bug:OOM?优雅终止线程?系统内存占用较高?

    摘要:该项目是DAYU平台的数据开发(DLF),数据开发中一个重要的功能就是ETL(数据清洗).ETL由源端到目的端,中间的业务逻辑一般由用户自己编写的SQL模板实现,velocity是其中涉及的一种 ...

随机推荐

  1. python函数的四种参数传递方式

    python中函数传递参数有四种形式 fun1(a,b,c) fun2(a=1,b=2,c=3) fun3(*args) fun4(**kargs) 四种中最常见是前两种,基本上一般点的教程都会涉及, ...

  2. DNS服务器的简介——2

    生成HTTP报文后,因为我们输入的是服务器的域名,但在包体的发送中需要的是服务器的IP地址,所以接下来的工作就是查找服务器的IP地址,而查询IP地址,就需要DNS服务器来帮忙了. IP地址简介: IP ...

  3. 位域 (Bit field)

    最近开始看编程之美这本书,里面有一道关于中国象棋将帅位置的简单问题,如下图所示,写一个程序输出将.帅的合法位置. 分析与解法 问题的本身并不复杂,只要把所有A.B 互相排斥的条件列举出来就可以完成本题 ...

  4. 批量改变图片的尺寸大小 python opencv

    我目标文件夹下有一大批图片,我要把它转变为指定尺寸大小的图片,用pthon和opencv实现的. 以上为原图片. import cv2 import os # 按指定图像大小调整尺寸 def resi ...

  5. 后端系统开发之gflags使用规范

    任何好用的工具如果使用不当都会带来不好的后果,gflags也是一样.我遇到过一些gflags的“坑”,还从领导和同事那里获得一些好的想法,整理成7条gflags使用规范.有意识的遵循这些规范,对项目的 ...

  6. 03以太网帧结构(链路层 IEEE802.3)

    OSI七层模型:从底往上记(研究细致时用) 物理层:单位bit,字节byte,同轴电缆,光纤,二进制,比特流 数据链路层:帧,16进制,0-9,A-FMac地址->全网唯一性     mac地址 ...

  7. Java设计模式(12)——结构型模式之门面模式(Facade)

    一.概述 概念 简要示意图(没有一个统一的UML图) 角色 门面角色:门面模式核心,它被客户端调用,并且熟悉子系统   子系统角色:子系统,子系统并不知道门面的存在,门面对它来说只不过是另外一个客户端 ...

  8. LeetCode: 54. Spiral Matrix(Medium)

    1. 原题链接 https://leetcode.com/problems/spiral-matrix/description/ 2. 题目要求 给定一个二维整型数组,返回其螺旋顺序列表,例如: 最后 ...

  9. 阅读笔记《JavaScript高级程序设计》

    0. 严格模式 "user strict" (1整个脚本顶部,2函数体顶部) 1. 数据类型 undefined -- 未定义 boolean string number obje ...

  10. 阿里云ECS下Ubuntu 16.04系统安装python3.6.5 环境并设置为默认

    一.添加python3.6安装包并安装: 二.修改系统默认python版本为3.6: 三.安装并升级pip版本: 一.添加python3.6安装包并安装: sudo apt-get install s ...