【转】.net框架读书笔记---CLR内存管理\垃圾收集(七)
编程控制垃圾收集器
System.GC类型为应用程序提供了直接控制垃圾收集器的一些方法,可以通过GC.MaxGeneration来查询托管堆支持的最大代龄,目前为2。
通过下面方法执行垃圾收集器
- GC.Collect(int);传递代龄,传递0,收集0代,传递1,收集0,1代,传递2,收集0.1.2代;
- GC.Collect();无参强制对所有代龄的对象执行垃圾收集;
GC.WaitForPendingFinalizers方法会挂起调用线程,直到处理终止化队列的线程清空了该队列,并完成每个对象的Finalize方法调用为止。下面代码:
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
上面代码首先强制执行一次垃圾收集。当第一轮垃圾收集完成后,不需要终止化的那些对象内存将被回收。但是终止化对象的内存还没有被回收。在第一次Collect调用返回后,一个特殊的、专门用于终止化的线程将采用异步的方式来调用所有终止化对象的Finalize方法。WaitForPendingFinalizers方法将使应用程序处于睡眠状态,直到所有的Finalize方法调用完成为止。当WaitForPendingFinalizers方法返回,所有的终止化对象将成为真正的可收集垃圾。这时第二次Collect调用将强制执行第二轮垃圾收集,所有终止化对象的内存将在这一轮垃圾收集中完全被回收。
通过编程继续了解垃圾收集:
namespace ControlGC
{
class Program
{
static void Main( string [] args)
{
Console.WriteLine( " Maximum generations: " + GC.MaxGeneration);
// 在托管堆上创建一个新的GenObj对象
Object o = new GenObj();
// 刚刚创建,代龄为0
Console.WriteLine( " Gen " + GC.GetGeneration(o)); // 0
// 执行垃圾收集器,提高对象代龄
GC.Collect();
Console.WriteLine( " Gen " + GC.GetGeneration(o)); // 1
GC.Collect();
Console.WriteLine( " Gen " + GC.GetGeneration(o)); // 2
GC.Collect();
Console.WriteLine( " Gen " + GC.GetGeneration(o)); // 2(最大值)
o = null ; // 销毁对象,此时对象的代龄为2
Console.WriteLine( " Collect Gen 0 " );
GC.Collect( 0 ); // 收集第0代对象,其实没有0代对象
GC.WaitForFullGCApproach(); // 不会调用Finalize
Console.WriteLine( " Collect Gen 0 " );
GC.Collect( 1 ); // 收集第0代对象,其实没有1代对象
GC.WaitForFullGCApproach(); // 不会调用Finalize
Console.WriteLine( " Collect Gen 0 " );
GC.Collect( 2 ); // 收集第2代对象,对象真正被收集
GC.WaitForFullGCApproach(); // 调用Finalize
}
}
class GenObj
{
~ GenObj()
{
Console.WriteLine( " In Finalize method " );
}
}
}
执行结果
深刻的了解代龄
大尺寸对象
任何占用内存大于等于85000字节的对象都被认为是大尺寸对象(large object)。大尺寸对象是从一个特殊的大尺寸对象托管堆中分配的。该托管堆中对象的终止化和内存释放行为与前面描述的小尺寸对象相同。但是大尺寸对象不会被压缩,因为在托管堆中移动大尺寸对象会浪费CPU比较多的时间。
大尺寸对象总是被认为是2代的。
【转】.net框架读书笔记---CLR内存管理\垃圾收集(七)相关推荐
- 【转】.net框架读书笔记---CLR内存管理\垃圾收集(四)
弱引用 当一个根指向一个对象时,该对象不可能被垃圾收集器收集,在这种情况下,通常说存在一个该对象的强引用(strong reference).垃圾收集器还支持弱引用(weak reference)的概 ...
- 【转】.net框架读书笔记---CLR内存管理\垃圾收集(三)
接上一篇.net框架读书笔记---CLR内存管理\垃圾收集(二),主要学习了终止化对象(实现了Finalize方法的对象),了解了终止化对象的弊端,学习了通过实现IDisposable接口,通过Dis ...
- 【转】.net框架读书笔记---CLR内存管理\垃圾收集(一)
一.垃圾收集平台基本原理解析 在C#中程序访问一个资源需要以下步骤: 调用中间语言(IL)中的newobj指令,为表示某个特定资源的类型实例分配一定的内存空间. 初始化上一步所得的内存,设置资源的初始 ...
- 【转】.net框架读书笔记---CLR内存管理\垃圾收集(六)
对象代龄 代龄是旨在提高垃圾收集器性能的一种机制.有以下几点: 对象越新,其生存期越短: 对象越老,其生存期越长: 对托管堆的一部分执行垃圾收集要比对整个托管堆执行垃圾收集速度要快. 在托管堆初始化时 ...
- 【转】.net框架读书笔记---CLR内存管理\垃圾收集(五)
对象复苏 当一个终止化对象被认为死亡时,垃圾收集器可以强制使该对象获得重生(进入终止化可达队列),因为这样才能调用对象的Finalize方法.在Finalize方法被调用之后,它才算真正的死亡 ...
- 【转】.net框架读书笔记---CLR内存管理\垃圾收集(二)
前几天学习了CLR垃圾收集原理和基本算法,但是那些是仅仅相对于托管堆而言的,任何非托管资源的类型,例如文件.网络资源等,都必须支持一种称为终止化(finalization)的操作. 终止化 终止化操作 ...
- .net框架读书笔记---CLR内存管理\垃圾收集(二)
前几天学习了CLR垃圾收集原理和基本算法,但是那些是仅仅相对于托管堆而言的,任何非托管资源的类型,例如文件.网络资源等,都必须支持一种称为终止化(finalization)的操作. 终止化 终止化操作 ...
- 《代码的未来》读书笔记:内存管理与GC那点事儿
一.内存是有限的 近年来,我们的电脑内存都有好几个GB,也许你的电脑是4G,他的电脑是8G,公司服务器内存是32G或者64G.但是,无论内存容量有多大,总归不是无限的.实际上,随着内存容量的增加,软件 ...
- 《Linux内核设计与实现》读书笔记(12)--- 内存管理(2)
6.slab层 为了便于数据的频繁分配和回收,Linux内核提供了slab层(也就是所谓的slab分配器).slab分配器扮演了通用数据结构缓存层的角色. slab层把不同的对象划分为所谓高速缓存(c ...
最新文章
- Linux中iptables的用法
- 一个历史遗留问题,引发的linux内存管理的‘血案’
- Nacos注册服务都注册在public空间下
- 新电子书:解决生产中Java应用程序错误的完整指南
- [Leedcode][JAVA][第139题][单词拆分][递归][记忆优化][动态规划]
- 初学Struts遇到的坑爹问题
- windows下配置caffe-matlab接口
- C语言第一节 C语言程序与开发工具
- nacis服务注册原理_HwServiceManager篇Android10.0 HwBinder通信原理(五)
- python机器学习案例系列教程——决策树(ID3、C4.5、CART)
- 对于根目录磁盘满的了问题
- 修改服务器控件的ID和Name
- Unix和Windows比较
- 一个根据用户名生成头像的库——@multiavatar/multiavatar在react中的使用
- 《SEM长尾搜索营销策略解密》一一2.8 长尾虽好,但核心不可或缺
- 谷歌SRE运维模式解读
- Windows Update 无法启用 拒绝访问
- 做数学建模不得不会的数据特征分析---对比分析
- fastapi+tortoise单元测试
- 北京理工大学计算机面试题,北京理工大学自主招生面试试题综合素质答案技巧.doc...
热门文章
- java锁以及双重检查
- [NLP-CNN] Convolutional Neural Networks for Sentence Classification -2014-EMNLP
- Python_自定义关键字的使用
- Bootstrap table后端分页(ssm版)
- dropify,不错的图片上传预览插件
- [转+整理]十道海量数据处理面试题与十个方法大总结
- [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第28篇]什么是公钥密码学的IND-CCA安全定义?
- resin php extensions sockets,linux 有关笔记
- 分类器交叉验证java_使用交叉验证的KNN分类器
- win10切第二屏幕_Win10特有的31个快捷键,装逼利器,赶快收藏吧!学习电脑知识...