coco笔记:如何管好.net的内存

转载 2014年03月28日 17:02:41

.net的性能瓶颈,毫无疑问是在内存管理上面。自动内存回收解决不了所有的问题,反而会制造性能问题。所以大批c++专家都不赞同在c++内部添加类似.net的内存管理机制,只是有保留的通过程序库来支持相关技术。

java老爱说c/c++管不好内存,容易泄露。但是其实本质上还不是将本来该由终端程序员自己处理的事情,交给了框架开发人员来处理了。

既然都是程序员,凭什么说你这些框架开发者就不会出现人为错误?

他们是专家,对大部分菜鸟级别的程序员来说,这个策略有点帮助,这是当然。但是从根本上,交给框架开发人员处理是有局限性的。他们无法预料到最终的应用程序有怎样的需求,脱离了具体的开发环境,也就无法做出最体贴的解决方案出来。

因此,也不要认为.net之类的内存管理必然就很先进,有这么大的局限性存在,还敢号称什么“无泄漏”?

内存泄漏是怎样的概念?我想说说我的看法。

我认为内存如果不在它该释放的那一刻,到需要再度利用这段时间,做到平滑,就不能算是优秀的内存管理。

.net的管理机制是惰性的,非到迫不得已,都不会释放掉,结果就把内存无端端的占用掉了,系统可用内存无端端就少了一大截。

这种和泄漏也差不了多少,某种程度上甚至还更糟糕。比如你泄漏一整天,就几兆,无伤大雅,但是你却无端端占用几百兆的内存,这个对系统的性能影响更大。所谓的泄漏不泄漏,不是本质,本质是对系统的负担有多大,内存管理机制有多高效。

有没有办法,让我们对.net的内存管理更加主动?这就是这篇文章要探讨的内容。

 

在开发过程中,性能问题往往出现在滥用框架功能上面。比如string不适合拼接字符串,程序员却滥用了。诸如此类的,解决方案就是我们有能力去理解框架提供的内容和重新设计一个更加有效率的编码。为什么说我们不能忘掉算法这些,原因就在此,框架的功能并不能适用在特定需求上面的,如果离开框架我们就无法工作,那样做出来的产品往往就只是二三流水准。这些内容不需要很多,却又必不可少。

这就是控制力的问题,如何做到更加细致的控制,是关键时刻解决问题的制胜之道。在直路,赛车手和平民的区别也许相对来说不是很大,但是拐弯就体现真功夫。我们可能要花90%的力气去做这10%的工作,才能保证软件的品质。

如何提高我们对.net托管内存的控制?

一、理解.net的内存管理机制。

二、了解框架要求程序员负责的任务。

三、了解手动控制的手段。

 

以c#语言为例。

析构函数如: ~类名() 默认是不自动生成的,也不能继承。但是析构函数并不管理内存,.net把内存作为资源的独立部分来管理,内存自动管理,其余资源依赖程序员自己通过析构函数等手段来管理。

因为内存是自动管理的,程序员只需要了解第三点:手动控制的手段。

System.GC.Collect() 强制启动内存垃圾回收程序。

第二个问题是除内存之外的其余资源如何管理。

.net 把任何实现了析构函数的对象,加入一个待清理队列中,这个队列会去调用析构函数,这个时候就能释放资源了。

因此,只要实现了析构函数,然后把释放资源的代码放在析构函数内部,就能交由.net处理余下事项,你也不需要担心自己忘了清理。

如果我们想要他在立即执行这个操作,可以调用System.GC.Collect()来启动。

问题是,.net实现这个机制的代价是很高的,如果我们又要释放资源,又不想影响效率,而且又担心我们会忘了释放资源,可以采取以下设计模式:

1.实现一个释放资源的函数。方便我们手工调用。

2.在析构函数中调用这个函数。

3.释放资源的函数中调用System.GC.SupressFinalize(),就会把对象从.net的待清理队列中释放出来,这样.net就不会启动释放机制了。

4.必须有一个标志来判断是否已经把资源释放了,避免重复释放资源。

5.必须有一个标志来判断是否需要调用System.GC.SupressFinalize()。如果程序员忘了手动清理,而是.net自身通过调用析构函数去清理的,那把对象从待清理队列中释放已经是没有意义的事情了。

可见,如果要高效,还是免不了要程序员自己记得手工释放。

 

以上是管理内存和其余资源的方式,至于如何运用,我个人的看法是,只要资源没有利用价值了,就应该尽快释放掉,而不是等缓慢的.net回收机制。


转载:http://www.cnblogs.com/Nobel/archive/2010/12/19/1910626.html

【caffe-Windows】关于LSTM的使用-coco数据集

前言 在caffe-Windows新增LSTM层以后,相信很多人和我一样很好奇如何使用这一层,使用参数都有什么。找了三四个代码,但是大部分配置都出现了问题,因为它们都是基于Linux的,然而逮着一个折...
  • zb1165048017
  • zb1165048017
  • 2017年03月01日 22:55
  • 6512

目标检测2015

本文转载自:http://blog.csdn.net/zhuiqiuk/article/details/53613879 https://handong1587.github.io/deep_l...
  • csuzhaoqinghui
  • csuzhaoqinghui
  • 2017年03月02日 20:52
  • 841

NLP+VS︱深度学习数据集标注工具、图像语料数据库、实验室搜索ing...

~~因为不太会使用OpenCV、matlab工具,所以在找一些比较简单的工具。  .  . 一、NLP标注工具BRAT BRAT是一个基于web的文本标注工具,主要用于对文本的结构化标注,...
  • oppo62258801
  • oppo62258801
  • 2017年04月10日 16:52
  • 3621

.NET Framework详解之内存机制

.NET Framework详解之内存机制:在.NET Framework中,内存中的资源(即所有二进制信息的集合)分为"托管资源"和"非托管资源".托管资源必须接受.NET Framework的CL...
  • xiaoran1985
  • xiaoran1985
  • 2014年03月11日 11:22
  • 618

tiny-yolo训练测试(coco训练集混合自己的voc训练集)--20170829

tiny-yolo训练测试(coco训练集混合自己的voc训练集)
  • jocelyn870
  • jocelyn870
  • 2017年09月06日 17:11
  • 454

如何在.net应用中发现和避免内存和资源泄露

如何在.net应用中发现和避免内存和资源泄露 By Fabrice Marguerie 尽管很多人相信在.net应用中谈及内存及资源泄露是件很轻松的事情。但GC(垃圾回收器)并不是魔法师,并不...
  • tiana0
  • tiana0
  • 2015年06月19日 17:15
  • 2225

【机器视觉】旷视研究院解读COCO2017物体检测夺冠论文

主讲人:彭超 | 旷视研究院研究员屈鑫 整理编辑量子位·吃瓜社 出品 | 公众号 AI7gua12月6日晚,量子位·吃瓜社联合Face++论文解读系列第一期开讲,本期中旷视(Megvii)研究院解读了...
  • np4rHI455vg29y2
  • np4rHI455vg29y2
  • 2017年12月25日 00:00
  • 36

MS COCO数据集目标检测评估(Detection Evaluation)(来自官网)

目标检测评估 1. Detection Evaluation 本页介绍了COCO使用的检测评估指标。此处提供的评估代码可用于在公开可用的COCO验证集上获得结果。它计算下面描述的多个指标。为了...
  • u014734886
  • u014734886
  • 2017年12月18日 12:52
  • 268

简单的MS COCO数据集下载方法

简单的MS COCO数据集下载方法 这里介绍的是一种不需要翻墙的MS COCO数据集下载方法 MS COCO数据集是当前做 instance segmentation 普遍使用的主流dataset...
  • qq_33000225
  • qq_33000225
  • 2017年12月18日 11:15
  • 161

AutoCAD二次开发之.net API学习笔记

1、用户交互
  • liupeng_qwert
  • liupeng_qwert
  • 2015年05月07日 10:07
  • 426
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:coco笔记:如何管好.net的内存
举报原因:
原因补充:

(最多只允许输入30个字)