在使用OpenExpressApp进行WPF应用开发过程中遇到多个内存泄漏的地方,昨天在WPF不明内存泄露已解决,白头发也没了中讲到了如何解决由于属性跟踪事件强引用导致的内存泄漏问题,本篇介绍一下由于CollectionViewSource.GetDefaultView导致的内存泄漏问题。

发现问题

  还是昨天 WPF不明内存泄露已解决,白头发也没了中说的场景,关闭模块后仍旧保留了对象的引用,ANTS Memory Profiler 5查看对象引用图如下

分析问题

  使用Scitech memory profiler查看对象引用路径,

查看ViewRecord对象的调用堆栈,如下:

查看后发现调用了一个CacheView方法,估计是把这个对象缓存起来了,使用Reflector查看源码,

CollectionViewSource.GetDefaultView:

internal static CollectionView GetDefaultCollectionView(object source, bool createView)
{
ViewRecord record = DataBindEngine.CurrentDataBindEngine.GetViewRecord(source, DefaultSource, null, createView);
return (CollectionView) record.View;
}

其中DataBindEngine.CurrentDataBindEngine是一个静态单例对象

internal static DataBindEngine CurrentDataBindEngine
{
get
{
if (_currentEngine == null)
{
_currentEngine = new DataBindEngine();
}
return _currentEngine;
}
}

内部调用了CacheView把对象缓存在单例DataBindEngine的ViewManager对象中。看了一下代码,没有看到如何清除缓存的地方(不知道有谁知道如何在程序中清除这个缓存?)

解决问题

查看GetDefaultCollectionView代码可以发现,其实内部它是根据传入对象的类型来决定生成一个什么CollectionView对象,由于我这边传入的肯定是IList,所以我修改GetDefaultView代码为直接使用ListCollectionView对象,修改代码如下:

//var collectionView = CollectionViewSource.GetDefaultView(viewData);  //inter call CacheView make memory leak
            ListCollectionView collectionView = new ListCollectionView(viewData);

修改后再使用内存泄漏工具查找对象,这时你就再也找不到对象了:)

另:以上是我的一个分析以及解决办法,虽然有事最好的解决办法就是不用它,但是总感觉使用CollectionViewSource.GetDefaultView不应该产生这个问题,否则谁还敢用,可能是我其它原因导致但我还为发现,上网搜索了也没有查到什么有用资料,不知道谁有更好的办法,请多指教!

欢迎转载,转载请注明:转载自周金根 [ http://zhoujg.cnblogs.com/ ]

转载于:https://blog.51cto.com/zhoujg/517969

WPF内存泄露:CollectionViewSource.GetDefaultView导致Cache对象相关推荐

  1. 抓到Netty一个隐藏很深的内存泄露Bug | 详解Recycler对象池的精妙设计与实现

    本系列Netty源码解析文章基于 4.1.56.Final版本 最近在 Review Netty 代码的时候,不小心用我的肉眼抓到了一个隐藏很深很深的内存泄露 Bug. 于是笔者将这个故事-哦不 -事 ...

  2. linux pmap 内存泄露,一个驱动导致的内存泄漏问题的分析过程(meminfo-pmap-slabtop-alloc_calls)...

    关键词:sqllite.meminfo.slabinfo.alloc_calls.nand.SUnreclaim等等. 下面记录一个由于驱动导致的内存泄漏问题分析过程. 首先介绍问题背景,在一款嵌入式 ...

  3. android如何避免内存泄露,Android开发中应该避免的内存泄露

    一.背景和目的: 目前许多开发人员在Android开发过程中,较少关注实现细节和内存使用,容易会造成内存泄露,导致程序OOM. 本文会通过代码向大家介绍在Android开发过程中常见的内存泄露. 二. ...

  4. java 内存溢出 内存泄露_java 内存泄露、内存溢出、内存不足

    内存泄露 什么是内存泄露? 在维基百科上的定义如图: 中文意思就是一个对象在内存中,而程序无法获取此对象,于是不能释放该对象所占用的内存. 百度百科上的定义如图: OWASP上的定义: 开发者无法释放 ...

  5. android oom 检测工具,Android中UI检测、内存泄露、OOM、等优化处理

    对Android整个优化分析,非常棒,下面是自己的积累笔记.可直接看原文. 界面检测工具: Fps: GPU检测, 使用Lint进行资源及冗余UI布局等优化 (很强大,布局的冗余) Memory检测G ...

  6. JAVA 内存泄露详解(原因、例子及解决)

    Java的一个重要特性就是通过垃圾收集器(GC)自动管理内存的回收,而不需要程序员自己来释放内存.理论上Java中所有不会再被利用的对象所占用的内存,都可以被GC回收,但是Java也存在内存泄露,但它 ...

  7. leaks Android内存泄露,Android LeakCanary 检测内存泄露

    内存泄漏: 指程序在申请内存后 ,无法释放已经申请的内存空间,一次内存泄漏可以忽略,但内存泄漏堆积后果很严重,无论多少内存,都会被占光 内存泄露危害: 1.内存泄露最终会导致内存溢出(OOM) 2.导 ...

  8. JAVA 内存泄露的理解

    1 什么是内存泄露? 内存泄露是指没用的对象持续占有内存空间,造成内存空间浪费.所以说JAVA是有内存泄露的. 2 内存泄露的原因是什么? 较长生命周期对象持有短生命周期对象的引用,导致短生命周期对象 ...

  9. 关于Android 的内存泄露及分析

    博客园 首页 新随笔 联系 管理 订阅 随笔- 137  文章- 6  评论- 145  关于Android 的内存泄露及分析 一. Android的内存机制 Android的程序由Java语言编写, ...

最新文章

  1. org.apache.ibatis.binding.BindingException: Type interface XXX is not known to the MapperRegistry.
  2. 不插即用!配备微信网页授权模块的CodeIgniter应用脚手架
  3. osgEarth3.0 加载天地图
  4. JavaScript之Style属性学习
  5. yolo_model to output理解
  6. UGUI_UGUI组件属性
  7. 已经windows如何在安装linux,如何在已经安装linux情况下安装windows
  8. MogDB如何配置IPv6?
  9. python返回上一条指令必须包括_python基础(10)--模块
  10. id 和 class 选择器
  11. 用最简单的例子告诉你kafka是怎么用的
  12. 计算机室nb代码,NB-iot SDK源码(Linux版)
  13. 20211104 为什么相似矩阵的迹相同
  14. 论文阅读:In the Eye of the Beholder: A Survey of Models for Eyes and Gaze
  15. 大学的计算机证书,大学必拿的几个证书是什么?
  16. 计算机操作系统期末复习,《计算机操作系统》期末复习课稿.docx
  17. 2016年第三季度中国无线AP市场研究报告
  18. Spark之核心架构
  19. Mac安装软件时提示“文件已损坏,您应该将它移到废纸篓”解决办法
  20. 用wifi直连(p2p)实现遥控照相

热门文章

  1. vue mui html不解析,记下Vue中使用Mui.js踩到的坑
  2. php memcached windows,php memcached windows安装
  3. java拳皇地下城_拳皇(Java简单的小程序)代码实例
  4. geoserver和openlayers学习网站
  5. 企业参加HVV的防守思路总结
  6. nginx上搭建https服务
  7. React学习:事件绑定、组件定义、for、map循环-学习笔记
  8. 关于LBS坐标系与精度的问题
  9. Redis cluster集群扩容缩容原理
  10. MapReduce Job本地提交过程源码跟踪及分析