垃圾回收GC:.Net自己主动内存管理 上(三)终结器
垃圾回收GC:.Net自己主动内存管理 上(三)终结器
前言
.Net下的GC全然攻克了开发人员跟踪内存使用以及控制释放内存的窘态。然而,你或午想要理解GC是怎么工作的。此系列文章中将会解释内存资源是怎么被合理分配及管理的,并包括很具体的内在算法描写叙述。同一时候,还将讨论GC的内存清理流程及什么时清理,怎么样强制清理。
终结器
public class BaseObj {
public BaseObj() {
} protected override void Finalize() {
// 实现资源清理的代码
// 比方,关闭文件或网络连接
Console.WriteLine("In Finalize.");
}
}
如今你能够创建一个此对象的实例:
BaseObj bo = new BaseObj();
- 可被终结(Finalize)的对象会被提升到GC的更老一代中,这会增大内存压力并阻止对象内存回收即使GC觉得此对象为垃圾对象。另外,全部与此对象有直接或间接关系的对象也会被提升。GC中的代以及代的提升在兴许文章中会介绍。
- 可被终结(Finalize)的对象须要更长时间去分配。
- 强制GC运行终结(Finalize)方法会明显减少性能。因此,假设有10000个对象实现了Finalize方法,GC必须运行其10000次终结方法,非常伤性能。
- 实现终结器的对象可能引用了没有终结器的对象,导致了那些没有终结器的对象的生命周期的延长。实际上,你可能会想把一个类型分成两个不同的类型:没有引用不论什么其他对象的带终结器的轻量级类型和引用了其他对象而不带终结器的类型。
- 你无法控制终结器方法的运行时间。因此,它可能会占有一定的资源不释放直到GC的下次回收。
- 当一个程序终止时,一些对象始终可以被訪问到而且不会运行其终结器。比方,后台线程使用的对象或者程序终止(或程序域卸载)过程中创建的对象。另外,默认地,为了程序可以终止迅速,当一个程序终止时不会调用无法被訪问到的对象的终结器。当然,全部操作系统资源都会被回收利用,可是在托管堆中的对象是不可以被恰当清理的。假设你想改变这个默认行为,你可以调用System.GC的RequestFinalizeOnShutdown方法。只是,你一定要小心地使用此方法,由于调用此方法意味着你的这个类型正在控制整个应用程序的策略。
- 程序执行时无法保证终节器的执行顺序。比方,一个对象包括一个指针指向一个内部对象,GC检到这两个对象都是垃圾。更进一步说,内部对象的终结器先被调用。如今,外部对象的终结器可以訪问到内部对象而且调用其方法,可是内部对象已经被终结了。此时,结果是无法预知的。因为这个原因,强烈推荐终结器不要訪问不论什么内部成员对象。
public class BaseObj {
public BaseObj() {
}
protected override void Finalize() {
Console.WriteLine("In Finalize.");
base.Finalize(); // 调用基类终结器
}
}
class MyObject {
~MyObject() {
//其他代码
}
}
causes the compiler to generate this code:
class MyObject {
protected override void Finalize() {
//其他代码
base.Finalize();
}
}
这和C++析构器有些像,可是记住C#不支持析构器。
终结器内部
下图中堆中存放着几个对象。一些对象能够被程序根訪问到,一些不能。当对象C,E,F,I和J被创建,系统检測到这些对象实现了终结器,同一时候在终结器队列里加入了指向这些对象的指针。
Queue:终结器队列;Freachable Queue: 终结器可达队列
总结
垃圾回收GC:.Net自己主动内存管理 上(三)终结器的更多相关文章
- 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配
垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...
- 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法
垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己 ...
- 垃圾回收算法手册:自动内存管理的艺术 BOOK
垃圾回收算法手册:自动内存管理的艺术 2016-03-18 华章计算机 内容简介 PROSPECTUS 本书是自动内存管理领域的里程碑作品,汇集了这个领域里经过50多年的研究沉积下来的最佳实践,包含当 ...
- 从C#垃圾回收(GC)机制中挖掘性能优化方案
GC,Garbage Collect,中文意思就是垃圾回收,指的是系统中的内存的分配和回收管理.其对系统性能的影响是不可小觑的.今天就来说一下关于GC优化的东西,这里并不着重说概念和理论,主要说一些实 ...
- GC与显式内存管理
C++复兴的话题至今已被鼓吹两年有余,Herb Sutter和Bjarne Stroustrup等大牛们也为C++带来了大步伐的革新.然而,从这两年的效果而言,C++的复兴并没有发生.一方面随着世界经 ...
- Java 垃圾回收(GC) 泛读
Java 垃圾回收(GC) 泛读 文章地址:https://segmentfault.com/a/1190000008922319 0. 序言 带着问题去看待 垃圾回收(GC) 会比较好,一般来说主要 ...
- 类装饰器,元类,垃圾回收GC,内建属性、内建方法,集合,functools模块,常见模块
'''''''''类装饰器'''class Test(): def __init__(self,func): print('---初始化---') print('func name is %s'%fu ...
- 性能测试三十五:jvm垃圾回收-GC
垃圾回收-GC 三个问题 哪些内存需要回收? 什么时候回收? 如何回收? YoungGC和FullGC: 新生代引发的GC叫YoungGC 老年代引发的GC叫FullGC FullGC会引起整个Jvm ...
- 垃圾回收gc --翻译
原文在https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management.基本保持了平译,并在一些地方做了概念解释.(转 ...
随机推荐
- Appium_Python_API
1) find_element_by_android_uiautomator (‘new UiSelector().text(“XXXX”)’).click 正常匹配2) find_element_b ...
- [python]类与对象-下
[实例对象]可以简称为[实例] 一.类与对象的关系 [类]是[对象]的模板. [类]就像工厂的模具,以它为模板,造出来的成千上万的产品,才是被我们消费.购买.使用,真正融入我们生活的东西.这些产品,在 ...
- 【例题 7-8 UVA - 10603】Fill
[链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 三维显然可以缩短为2维. 只要知道a,b瓶中的水量,c瓶中的水量减一下就能得到. 则设dis[a][b]表示a,b瓶中水量为a,b时 ...
- 洛谷—— P1434 滑雪
https://www.luogu.org/problem/show?pid=1434#sub 题目描述 Michael喜欢滑雪.这并不奇怪,因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜 ...
- session的生命周期是怎样的
session的生命周期是怎样的 一.总结 一句话总结:Tomcat中Session的默认失效时间为20分钟.如果我们敲代码的时候把它设置成1个月,那么这一个月的数据会代替默认20分钟的数据,使ses ...
- Anaconda的安装
Windows下Anaconda的安装和简单使用 Anaconda is a completely free Python distribution (including for commercial ...
- (转)看懂类图——UML类图基础
类图 要学懂设计模式,就需要先看得懂类图,类与类之间的关系是学习设计模式的基础,而在软件工程中,类与类之间的关系是通过UML中的类图来体现. 这篇笔记包含的不会是类图的所有东西,包含的只是各个类之间的 ...
- Altium Designer如何调整鼠标形状
在 里面有一个
- cocos2d-x 一些实用的函数
1. 自己主动释放粒子内存的函数 setAutoRemoveOnFinish(bool var) 2. 解决使用tiled出现像素线的问题在代码中搜索"CC_FIX_ARTIFA ...
- MySQL的安装及使用教程
MySQL的安装及使用教程 一. MySQL的下载及安装 首先登陆MySQL的官网,选择Downloads→Windows→MySQL Installer→Windows(x86,32-bit),M ...