美文网首页程序员
我对内存泄漏的理解

我对内存泄漏的理解

作者: 古意昌 | 来源:发表于2018-01-17 19:24 被阅读0次

CLR的垃圾回收器可以帮助我们回收资源,使得我们开发的时候不需要考虑对象回收,但是我们真的不用考虑了吗?

垃圾回收器明确说明其只会回收:

“不再使用的对象”

一、对内存泄漏的理解

我认为判断内存是否泄漏取决于你知不知情:

  • 如果你清晰的知道对象引用关系,那么就不算内存泄漏,例如撤销重做栈(里面保存了大量的历史数据)。
  • 如果你认为没有对象在引用这个对象了,而GC.Collect()执行后并没有回收这个对象,那么这就是内存泄漏。

导致内存泄漏的根本原因就是:

你以为对象已经用完了,但是仍有对象持有对它的引用

解决内存泄漏的根本措施就是:

当你的对象不需要的时候,不要让还活着的对象引用你

二、内存泄漏案例分析

下面我会列举我们开发过程中遇到的多种 “你认为没有人引用那个对象了” 的场景,场景会持续更新。

  1. DispatcherTimer
  2. Data Binding
  3. Event Handler
  4. Static Event

三、内存泄漏分析工具

分析内存泄漏的来龙去脉,不是一款工具就可以全部解决的,建议使用下面多个工具结合使用,可查源码,可调源码,可看堆栈,可看变量,非常的方便。使用教程请移步Google
![内存泄漏分析工具.png]

image.png
  1. dnSpy:附加进程调试神器,可以直接调试源码,不需要vs。
  2. windbg:调试神器,方便的看托管堆的各种数据,牛刀。
  3. dotPeek:查看托管Dll的源码,查看WPF的源码必备。
  4. dotMemory:方便的对两个快照之间产生的对象进行跟踪,查看引用关系,方便的定位到内存泄漏现象。

以上工具结合使用,足矣让你掌握导致内存泄漏的最深层次的原因。

相关文章

  • 浅析 NSTimer 和 CADisplayLink 内存泄漏

    内存泄漏原因 谈论 NSTimer & CADisplayLink 内存泄漏,要理解 NSTimer & CADi...

  • 内存泄漏理解

    1.简单理解 内存泄漏指的是堆内存泄漏,栈不会发生内存泄漏,只会发生栈溢出(StackOverFlow)。简单一个...

  • 性能优化——内存泄漏之Heap Snapshot和MAT

    1,什么是内存泄漏? 比较正常的语言描述我也不懂,按照我的理解就是GC回收不了的那些内存区域就算是内存泄漏,也就是...

  • Android性能优化之内存泄漏

    内存泄漏:内存单元使用完成后未释放,未回收。理解强弱引用和gc垃圾回收机制后,会更好的理解内存泄漏问题。 在目前的...

  • 优化

    1.内存溢出和内存泄漏有什么区别?何时会产生内存泄漏?内存优化有哪些方法? 内存溢出通俗理解就是软件(应用)运行需...

  • Handler导致内存泄漏?我觉得好像不存在这种可能性。

    首先我是Android菜鸟,这2天程序内存泄漏,查看了大量文章,以我的理解,宏观来看Handler不存在内存泄漏的...

  • Android 内存泄漏和OOM分析(一)

    这段时间在研究如何处理内存泄漏问题和防止OOM(内存溢出) 首先是内存泄漏:(这个是摘抄,加入了自己的理解) 说完...

  • 学习Java运行机制及内存回收算法

    内存泄漏,内存溢出,内存抖动 内存泄漏 由于疏忽或错误造成程序未能释放已经不再使用的内存 原因: 某些我们创建的对...

  • 转:Android内存泄漏总结

    Android内存泄漏相关的文章有很多,在此结合自己的理解进行总结。 一、简介 内存泄漏:无用的对象没有被及时释放...

  • Android内存泄漏总结

    Android内存泄漏相关的文章有很多,在此结合自己的理解进行总结。 一、简介 内存泄漏:无用的对象没有被及时释放...

网友评论

    本文标题:我对内存泄漏的理解

    本文链接:https://www.haomeiwen.com/subject/ebvuoxtx.html