在最近的公司框架开发中,利用了网上某大牛的反射缓存库作为辅助。在测试的时候发现出现了巨大的内存泄露,在频繁的操作后,内存不断的产生巨大的开销,10多分钟就占有了5,6m的内存。解决问题的时,公司不能上网,没有内存分析工具,没有我钟爱的ANTS Memory Profiler帮助下,我们只能靠简单的内存输出来二分查找缩小范围,利用

System.Diagnostics命名空间下的Process的WorkingSet64属性来统计两次输出的内存增长量(WorkingSet64:描述关联的进程分配的物理内存量(以字节为单位))。花了半天终于定位到了第三方的缓存块,一看吓一跳居然缓存了2,3万的对象。看到这里我很清楚的猜测到自定义缓存key一定没有重写来自Object的Equal方法,在三两下很快解决了这次问题。哎,本不该相信第三方,刚开始还以为我数据绑定注册的一大堆客户端控件的事件引起的,但是我实现了IDisposable并取消了事件的,必究事件代理是强类型引用。

在这里我简单说说这个本是基础知识的东西。说道Equal,我们会联想到==操作符,==对于值类型表示的是值相等,除string类型(内部重写)外表示的是对象的引用,同一个引用地址才会相等。Equal描述的是对象的内容是否相等。但是在Object中默认实现是对引用reference的比较,我们要实现值的比较这必须重写Equal方法和GetHashCode方法,这两个是同时重写的。在我们的IList.Contains,IDictionary.Contains中利用对象的比较就是默认的Equal方法比较,所以我们必须重写这个方法,来达到我们实际的值比较。MSDN:Equals() 和运算符 == 的重写准则(C# 编程指南)

然而在我们3.0后的表达式linq中对于对象的比较,我们需要实现的IEqualityComparer<T>接口,如下定义:

public static bool Contains<TSource>(this IEnumerable<TSource> source, TSource value, IEqualityComparer<TSource> comparer);

在微软内部实现了5个重要的类,如下图(图来自博客园鹤冲天大牛):

在这里我不想在说很多,关于可以参见博客园鹤冲天大牛的c# 扩展方法奇思妙用基础篇八:Distinct 扩展,何止 Linq 的 Distinct 不给力文章实战。

最后给初学者提醒一句,对于IList.Contains,IDictionary.Contains注意实现Equal和GetHashCode,Linq比较IEqualityComparer<TSource>。

本不该错的,应该是大牛忘写了吧,可是害惨了我。

转载于:https://blog.51cto.com/whitewolfblog/835245

记录由Equal基础知识引起的内存泄露相关推荐

  1. 学习记录:计算机网络基础知识总结

    计算机网络(第7版)谢希仁 阿里云盘 链接:https://www.aliyundrive.com/s/eLhv9FKkeW4 学习笔记:https://note.youdao.com/s/a5HE1 ...

  2. 基础知识篇——堆内存和栈内存

    目录 一.数据结构中的堆和栈 1. 栈 2. 堆 二.内存中的栈区与堆区 1. 内存中的栈区与堆区比较 2. 计算机内存的大致划分 三.栈内存与栈溢出 四.堆内存与内存泄露 五.JAVA 1. Jav ...

  3. CTF基础知识与web信息泄露下的目录遍历、PHPINFO、备份文件下载

    文章目录 CTF基础知识 一.CTF简介 二.竞赛模式 三.比赛形式 四.题目类型 web信息泄露 一.目录遍历 二.PHPINFO 三.备份文件下载 (一)网站源码 (二)bak文件 (三)Vim缓 ...

  4. linux c语言变量地址类型,C语言基础知识:访问内存地址的方法

    汇编语言寄存器间接寻址方法 #define GPJ0CON0xE0200240 ldr r0, =GPJ0CON //把地址值赋给寄存器r0,从后面的=可以看出用的是ldr伪指令,因为需要编译器来判断 ...

  5. jvm虚拟机基础知识--、java内存区域(1)

    JAVA程序运行过程 jvm的跨平台和语言无关性 所有的java程序都需要编译成class文件的形式提交给jvm虚拟机来加载,通过图可以看到class文件经过javac编译以后进入jvm虚拟机内部首先 ...

  6. 【unity学习记录】TileMap基础知识(详细版)

  7. python学习记录1(基础知识)

    python是动态语言,使用变量时不需要定义类型,可以直接赋值 例如 a = 10 b = 'a' c = "hello world" 也不需要在结尾加上分号 # 输入 默认字符串 ...

  8. 属性加密(ABE)基础知识

    属性加密 最近在看ABE相关论文,因为本人(数学功底一般)不太能理解其中原理.所以特意记录ABE的基础知识,以便日后能快速重温. ABE常见分类 属性基加密的思想是让密文和密钥与属性集合和访问结构产生 ...

  9. 每天记录学习的新知识 :WebView介绍以及基本使用和方法

    WebView介绍以及基本使用和方法 一.简介 二.调用: 三.方法介绍 3.1 WebView状态控制 3.2 WebView销毁和清理 3.3 WebView网页切换 3.4 WebView的回调 ...

最新文章

  1. 《Photoshop Lab修色圣典(修订版)》—第1课1.7节言归正传
  2. Ubuntu修改IP地址和MAC地址
  3. vue配置文件读取_Vue+Spring Boot简单用户登录Demo实现
  4. 怎么连接屏幕_触控一体机怎么实现无线投屏功能
  5. RHEL5.4 iptables 配置详解(图)
  6. 【NLP】DataCLUE: 国内首个以数据为中心的AI测评
  7. 监控工具—Prometheus—基础介绍
  8. Docker 常见问题汇总
  9. 《On the Momentum Term in Gradient Descent Learning Algorithm》原文解读
  10. 通通玩blend美工(6)下——仿iPhone滚动选择器的ListBox(交互逻辑)
  11. Vue 2.0 v-for 响应式key, index及item.id参数对v-bind:key值造成差异研究
  12. 程序员如何让自己 Be Cloud Native - 配置篇
  13. 渗透测试入门16之渗透测试基本知识
  14. 基于JAVA+SpringMVC+Mybatis+MYSQL的眼镜店仓库管理系统
  15. 青年会会训的一些探究
  16. 树莓派 4 与英伟达 Jetson Nano 性能大比拼,谁是最佳的嵌入式“电脑”?
  17. springboot不会运行gc_SpringBoot 深度调优,让你的项目飞起来!
  18. java笔试必考知识_面试必备:常考Java基础知识总结(持续更新)
  19. Not have a lick 没有一丁点儿
  20. 区块链报错3 | truffle unbox 报错 | downloading失败 | unbox failed

热门文章

  1. 未来,AI可用于5G网络分析
  2. 梅宏院士:操作系统变迁有20年周期律,泛在计算是一片新蓝海
  3. 人工智能的发展与障碍 | 麦肯锡
  4. “CRISPR婴儿”计划疯狂重启 顶级科学家们表示无力阻止
  5. W3C 战败:无权再制定 HTML 和 DOM 标准!
  6. 50大产业链全景图(高清完整版)
  7. 工业4.0进行时:增强现实技术如何变革制造业
  8. 南云等PNAS研究论文:揭示儿童音乐学习向语言领域迁移的脑机制
  9. 智能哲学:“学习机器”与“机器学习” ——解读图灵思想中的人工智能
  10. 区块链行业报告|从交易流程到Token经济的全方位解析