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

勇哥:"在用CLR Profile工具分析下FlexiPrint的内存占用情况。"

炮哥:“哎哟,不错啊,玩高级的了。”

勇哥:“也没有啊,就是发现点击查询按钮查询数据时,如果数据量一大的话,内存上上升了好几个M,所以第一感觉就不太正常。正好以前也了解过CLR Profile,但一直没怎么具休的用过,这次正好拿来研究研究。”

炮哥:“Nice job,要向你学习,能够主动发现问题并研究解决方法。对了,有什么发现么?”

勇哥:“通过工具发现dgMain_CellFormatting方法占用内存过多。”

炮哥:“这个方法干嘛用的,要这么多的内存?”

勇哥:“其实做的事情很简单,根据每行订单的不同状态,显示不同的图标,以便让客户能够很直白的了解订单的状态。”

炮哥:“噢,是这样,那确实没什么,让我看下代码。”

  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. #endregion
  10.  
  11. #region Event Handler
  12.  
  13. /// <summary>
  14. /// 此事件主要用于图片按钮的显示
  15. /// </summary>
  16. /// <param name="sender"></param>
  17. /// <param name="e"></param>
  18. private void dgMain_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
  19. {
  20. if (dgMain.Columns[e.ColumnIndex].Name.Equals("dgMain_PrintIcon"))
  21. {
  22. int row = e.RowIndex;
  23. //获取展示图片按钮的单元格
  24. string status = dgMain.Rows[row].Cells["dgMain_statusKey"].Value.ToString();
  25.  
  26. switch (status)
  27. {
  28. case "Print in Progress":
  29. string erpSoNumber = this.dgMain.Rows[row].Cells["dgMain_ErpSoNumber"].Value.ToString();
  30.  
  31. //从DB中查找erp_so_number的记录
  32. IEnumerable<FileIndexModel> fileIndexes = _serviceClient.GetFileIndex(erpSoNumber);
  33.  
  34. //如果在FileIndex表中存在pro的记录
  35. if (fileIndexes == null || !fileIndexes.Any()) { break; }
  36.  
  37. FileIndexModel fileIndex = fileIndexes.First();
  38.  
  39. if (FileStatus.PRINTED != fileIndex.PrintedStatus && FileStatus.PARTIAL_PRINTED != fileIndex.PrintedStatus)
  40. {
  41. e.Value = Properties.Resources.picYellow;
  42. }
  43. else
  44. {
  45. e.Value = Properties.Resources.picGreen;
  46. }
  47.  
  48. break;
  49.  
  50. case "Printed":
  51.  
  52. e.Value = Properties.Resources.picGreen;
  53. break;
  54.  
  55. case "Partial Printed":
  56.  
  57. e.Value = Properties.Resources.picGreen;
  58. break;
  59.  
  60. default:
  61.  
  62. e.Value = Properties.Resources.picYellow;
  63. break;
  64. }
  65. }
  66. }
  67.  
  68. #endregion
  69.  
  70. }
  71. }

勇哥:“......”

炮哥:“很简单,写得很明白,这方法没什么问题吧,会不会搞错了。”

勇哥:“应该不会,通过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 == ) { 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解决内存占用过高的问题的更多相关文章

  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. linux 下安装 Cisco Packet Tracer 7.11以及一些注意

    https://blog.csdn.net/qq_35882901/article/details/77652571 https://linux.cn/article-5576-1.html 开启登录 ...

  2. Lambda实战(多练习)

    import org.junit.Test; import java.math.BigDecimal; import java.time.LocalDate; import java.util.*; ...

  3. python--模块之re正则表达式

    简介: 正则表达式本身是一个小型的.高度专业化的编程语言,而在python中,通过内嵌集成re模块,我们可以通过直接调用来实现正则匹配. 正则表达式基础知识: --普通字符匹配自身 abc ----a ...

  4. 线上CPU飚高(死循环,死锁...)

    之前排除服务器内存暴增的问题,在此看到一篇类似的文章,做个类似的记录. 1.top基本使用 top 命令运行图: 第一行:基本信息 第二行:任务信息 第三行:CPU使用情况 第四行:物理内存使用情况 ...

  5. BZOJ1066_蜥蜴_KEY

    题目传送门 经过长时间的旅行,很长时间没写过博客了,这次把上次WA的题目过了. 由于每次蜥蜴从石柱上跳下时,石柱的高度会-1,可以看做占了一格的流量. 建图: 1.建超级源和超级汇,设超级源连到每只蜥 ...

  6. 北京Uber优步司机奖励政策(1月25日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  7. 南京Uber优步司机奖励政策(1月4日~1月10日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  8. 宁波Uber优步司机奖励政策(8月24日到8月30日)

    本周奖励: 8月24日-8月30日: 滴滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http:// ...

  9. Java String源码解析

    public final class String implements java.io.Serializable, Comparable<String>, CharSequence { ...

  10. Eclipse - 配置优化

    去除不需要的启动加载项 Window --> Preferences -->General --> Startup and Shutdown 关闭自动更新 Window --> ...