C#资源回收总结

目前项目使用C#开发移动平台项目,温故而知新。

资源类型,总体分为三类:堆栈、托管堆、非托管资源

堆栈:内存原理先进后出,包含值类型和引用类型部分内容。

   值类型-》它在释放资源的顺序上与定义变量时分配内存的顺序相反.值变量一旦出了作用域就会从堆栈中删除对象.

   堆:引用类型

   引用类型则存储在堆中.,当new一个类时,此时就会为对象分配内存存入托管堆中,它可以在方法退出很长的时间后仍然可以使用.我以一句常用的实例类的语句来说明下.

    classA a=new classA();

    这句非常平常的语句其实可以分成两部分来看:

    第一:classA a;声明一个classA的引用a,在堆栈上给这个引用分配存储空间.它只是个引用,并不是真正的对象.它包含存储对象的地址.

    第二:a=new classA();分配堆上的内存,以存储真正的对象.然后修改a的值为新对象的内存地址.

    当引用出了作用域后,就会从堆栈上删除引用,但引用对象的数据仍然存储在托管堆中,一直到程序停止,或者是GC删除.

         第三:Dispose

    如果classA继承了IDispose,在调用Dispose方法后,程序仍然可以访问对象的原因了.Dispose对托管资源不起作用。

  非托管资源:COM/COM++组件,ActiveX控件,API函数,WIN32,指针运算,自制的资源文件...这些的非托管的,其它就是托管的.

  总结:C#非托管资源使用IDispose接口,托管资源不需要使用IDispose接口系统GC自动回收或者使用GC.Collect();

参考文章:

http://blog.sina.com.cn/s/blog_8abeac5b01019u19.html

http://bbs.csdn.net/topics/270000476

时间: 2024-10-21 15:27:42

C#资源回收总结的相关文章

JAVA线程池资源回收的问题

最近项目中为了提高用户体验度,前台创建任务后台任务,用多线程来跑. 现在的场景:后台定时任务管理这两个线程池,一个最大线程数10个,一个最大线程数15.应用部署之后,不超过5个小时,服务器负载高,内存使用过多. 分析原因:因为这个功能是excel导入功能,如果前台有大量的导入任务时,那么后台的负载就会很高. 我的实现原理:定时任务读取任务,放到任务队列表中,然后使用线程池消费任务队列中的任务,每个线程时一直循环取任务. 我的定时任务周期是 1 分钟,线程池从初始化时,空闲线程存活的时间为 1 分

Kubernetes1.3新特性:新的资源回收控制器

(一)  核心概念 在kubernetes1.3中新增了一个资源回收控制器GarbaseCollector,用这个控制器来替代kubernetes1.3中的资源回收控制器GC. 如下为kubernetes1.2中的资源回收控制器结构体: 如下为kubernetes1.3中的资源回收控制器结构体: 在kubernetes1.2中,如果要实现对资源级联回收功能,需要通过客户端进行资源级联回收调用的方式实现,比如存在一个replica set类型的资源,在这个资源下面存在多个POD资源,如果我们使用命

python的multiprocessing模块进程创建、资源回收-Process,Pool

python的multiprocessing有两种创建进程的方式,每种创建方式和进程资源的回收都不太相同,下面分别针对Process,Pool及系统自带的fork三种进程分析. 1.方式一:fork() 举例: 1 import os 2 pid = os.fork() # 创建一个子进程 3 os.wait() # 等待子进程结束释放资源 4 pid为0的代表子进程. 缺点:1.兼容性差,只能在类linux系统下使用,windows系统不可使用:2.扩展性差,当需要多条进程的时候,进程管理变得

linux线程资源回收

from:http://blog.csdn.net/skyflying2012/article/details/24655751及相关论坛 http://blog.chinaunix.net/uid-29783732-id-4485673.html 在写网络服务器程序时可能需要实现多线程接收多个客户端的数据,我实现方式比较傻,死循环等待client的connect,connect之后创建thread,这样其实有一个问题,服务器程序需要长期运行,长时间线程的创建,线程资源的回收就是一个问题. Li

bitmap资源回收

这个问题哎,困扰本宫一天! bitmap不完全解决method: http://blog.csdn.net/hahahacff/article/details/8540942 http://blog.csdn.net/hahahacff/article/details/8524093 http://smallwoniu.blog.51cto.com/3911954/1248875(这里面各种强.弱.软引用讲的很详细) http://mzh3344258.blog.51cto.com/182353

资源回收 left

select DISTINCT human.tid,log_pv_change.systafftid from human left join human_user on human.tid=human_user.hid left join human_house on human.tid = human_house.hid left join human_tickets on human.tid=human_tickets.hid left join human_call on human.t

finally回收资源

Java中的垃圾回收机制,也就是GC不会回收任何物理资源,垃圾回收机制只回收堆内存中对象所占用的内存,所以其他的物理资源需要用finally来回收. 如果try块中的某条语句引起了异常,该异常就会被catch块捕获,但是try块异常语句后面的其他语句通常不会获得执行机会,这将会导致该语句后的资源回收语句得不到执行,所以为了保证一定能回收try块中打开的物理资源,就要用到finally块. 不管哪一个catch块被执行,甚至在try块中有continue/break/return连,finally

如何处理android程序变为后台程序,系统回收资源,再次打开时,程序因为null指针等崩溃

home键等原因,程序会变为后台程序,系统会更具需要,可能回收资源,再打开时候,就会因为资源回收,再调用oncreate,没有Intent参数而导致程序崩溃.   这种情况,我们可以处理的方式有两种,一是用: @Override     protected void onSaveInstanceState(Bundle outState) {      // TODO Auto-generated method stub      super.onSaveInstanceState(outSta

说说非托管资源的回收

释放未托管的资源有两种方法 1.析构函数 2.实现System.IDisposable接口 一.析构函数 构造函数可以指定必须在创建类的实例时进行的某些操作,在垃圾收集器删除对象时,也可以调用析构函数.析构函数初看起来似乎是放置释放未托管资源.执行一般清理操作的代码的最佳地方.但是,事情并不是如此简单.由于垃圾回收器的运行规则决定了,不能在析构函数中放置需要在某一时刻运行的代码,如果对象占用了宝贵而重要的资源,应尽可能快地释放这些资源,此时就不能等待垃圾收集器来释放了. 实例 C# 代码   复