.net 4.0 中的特性总结(三):垃圾回收
2021-07-19 22:08
标签:这一 成功 条件 碎片 决定 前台 根据 ref 设置 1.内存基础知识 可用。 该内存块没有引用关系,可用于分配。 保留。 内存块可供您使用,并且不能用于任何其他分配请求。 但是,在该内存块提交之前,您无法将数据存储到其中。 提交。 内存块已指派给物理存储。 2.垃圾回收的条件 当满足以下条件之一时将发生垃圾回收: 3.托管堆 在垃圾回收器由 CLR 初始化之后,它会分配一段内存用于存储和管理对象。 此内存称为托管堆(与操作系统中的本机堆相对)。 每个托管进程都有一个托管堆。 进程中的所有线程都在同一堆上分配对象。 当触发垃圾回收时,垃圾回收器将回收由死对象占用的内存。 回收进程会对活动对象进行压缩,以便将它们一起移动,并移除死空间,从而使堆更小一些。 这将确保一起分配的对象全都位于托管堆上,从而保留它们的局部性。 垃圾回收的侵入性(频率和持续时间)是由分配的数量和托管堆上保留的内存数量决定的。 此堆可视为两个堆的累计:大对象堆和小对象堆。 大对象堆包含其大小为 85,000 个字节和更多字节的对象。大对象堆上的特大对象通常是数组。 非常大的实例对象是很少见的。 4.代数 堆上的对象有三代: 当条件得到满足时,垃圾回收将在特定代上发生。 回收某个代意味着回收此代中的对象及其所有更年轻的代。 第 2 代垃圾回收也称为完整垃圾回收,因为它回收所有代上的所有对象(即,托管堆中的所有对象)。 幸存和提升:垃圾回收中未回收的对象也称为幸存者,并会被提升到下一代。 在第 0 代垃圾回收中幸存的对象将被提升到第 1 代;在第 1 代垃圾回收中幸存的对象将被提升到第 2 代;而在第 2 代垃圾回收中幸存的对象将仍为第 2 代。 当垃圾回收器检测到某个代中的幸存率很高时,它会增加该代的分配阈值,因此下一次回收将会获取一个非常大的回收内存。 CLR 会在以下两个优先级别之前进行平衡:不允许应用程序的工作集获取太大内存以及不允许垃圾回收花费太多时间。 5.垃圾回收过程中发生的情况 垃圾回收分为以下几个阶段: 因为第 2 代回收可以占用多个段,所以可以将已提升到第 2 代中的对象移动到时间较早的段中。 可以将第 1 代幸存者和第 2 代幸存者都移动到不同的段,因为它们已被提升到第 2 代。 将不会压缩大对象堆,因为这会在一个不可接受的时间长度内增加内存使用量。 垃圾回收器使用以下信息来确定对象是否为活动对象: 在垃圾回收启动之前,除了触发垃圾回收的线程以外的所有托管线程均会挂起。 下图演示了触发垃圾回收并导致其他线程挂起的线程。 6.后台垃圾回收 在后台垃圾回收中,在进行第 2 代回收的过程中,将会根据需要收集暂时代(第 0 代和第 1 代)。 后台垃圾回收无法设置;它会自动运行并启用并发垃圾回收。 后台垃圾回收是对并发垃圾回收的替代。 与并发垃圾回收一样,后台垃圾回收是在一个专用线程上执行的并且只适用于第 2 代回收。 后台垃圾回收期间对暂时代的回收称为前台垃圾回收。 发生前台垃圾回收时,所有托管线程都将被挂起。 当后台垃圾回收正在进行并且您已在第 0 代中分配了足够的对象时,CLR 将执行第 0 代或第 1 代前台垃圾回收。 专用的后台垃圾回收线程将在常见的安全点上进行检查以确定是否存在对前台垃圾回收的请求。 如果存在,则后台回收将挂起自身以便前台垃圾回收可以发生。 在前台垃圾回收完成之后,专用的后台垃圾回收线程和用户线程将继续。 后台垃圾回收可以消除并发垃圾回收所带来的分配限制,因为在后台垃圾回收期间,可发生暂时垃圾回收。 这意味着,后台垃圾回收可以移除暂时代中的死对象,而且还可以在第 1 代垃圾回收期间根据需要展开堆。 后台垃圾回收当前不可用于服务器垃圾回收 .net 4.0 中的特性总结(三):垃圾回收 标签:这一 成功 条件 碎片 决定 前台 根据 ref 设置 原文地址:http://www.cnblogs.com/vveiliang/p/7057746.html
上一篇:js技术分享