.NET垃圾回收机制-代(generation)的原理分析

.NET的垃圾回收器是用一种叫代的原理,假设以下三种情况成立,则提出了代的概念。

  • 越是新的对象,他的生存周期就越短
  • 越是老得对象,它的生存周期就越长
  • 回收一部分堆对象比回收全部堆对象性能高

第一步:当声明A-E 五个对象,它们在堆栈的分配情况(垃圾回收机制没有扫描之前),稍后,C和E对象变的不可达

第二步:当CLR初始化时,它为第零代分配了256K的空间(可能不同),代越高分配的内存越多。假设A-E分配了占用完了256k的内存,当F对象又被声明时,回收器就会进行第零代回收,C和E被回收,A,B,D被提升到一代。

第三步:F-K对象被分配到第零代,稍后,B,H和J变的不可达。如图,

第四步:但是垃圾回收器会检查第一代的空间,如果还足够,就会忽略第一代的回收,只回收第0代的。

第五步:继续申请L-O,同时,随着应用程序的运行G,L,M不可达,如图:

第六步:如果再继续申请P,此时如果第0代空间不足但是第1代的空间足,此时继续只回收第0代,忽略第1代,垃圾回收器回收以后:

第七步:并且继续分配P到S对象的空间:

第八步:当在分配T对象时,垃圾回收期扫描第一代和第零代,发现空间不足,此时,会启动垃圾回收第一代和第零代的空间:此时第0代的对象升至第1代,第1代的对象升至第2代。

垃圾回收机制仅有3代,当CLR初始化时,为第0代分配大约256K空间,第1代大约2M,第2代大约10M,基于这种假设才能提高应用程序的性能,要知道垃圾回收机制很影响性能的。

internal static class GCMethods
{
    public static void Go()
    {
        Console.WriteLine("Maximum generations: " + GC.MaxGeneration);

        // Create a new GenObj in the heap.
        Object o = new GenObj();

        // Because this object is newly created, it is in generation 0.
        Console.WriteLine("Gen " + GC.GetGeneration(o)); // 0

        // Performing a garbage collection promotes the object's generation.
        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 (max)


        o = null; // Destroy the strong reference to this object.

        Console.WriteLine("Collecting Gen 0");
        GC.Collect(0);                    // Collect generation 0.
        GC.WaitForPendingFinalizers();    // Finalize is NOT called.

        Console.WriteLine("Collecting Gen 1");
        GC.Collect(1);                    // Collect generation 1.
        GC.WaitForPendingFinalizers();    // Finalize is NOT called.

        Console.WriteLine("Collecting Gen 2");
        GC.Collect(2);                    // Same as Collect()
        GC.WaitForPendingFinalizers();    // Finalize IS called.
    }

    internal sealed class GenObj
    {
        ~GenObj()
        {
            Console.WriteLine("In Finalize method");
        }
    }
}

结果:


操作系统知识点汇总(王道) 操作系统不论是就业还是升学都是核心的一门课程,对于大部分工科更是必修课程。本文章是对《王道操作系统》所有知识点的总结笔记,以供大家学习以及在备考期间复习使用。让我们一起把知识往脑子里旋好吗!!!...... 阅读详情

相关推荐

Code generation.zip

表对象与表结构码生成器Demo。可部署至IIS,方便使用。仅供参考,如有额外需求请自行添加!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

垃圾回收机制(GC)总结报告()

1、Finalize方法     Finalize方法要做的事情通常是回收垃圾回收器不能回收的资源,例如文件句柄,数据库连接(非托管资源的释放) (1)第一次垃圾回收     对象B、E、G、H、I和J被标记为垃圾--->添加到Freachable队列: (1)没有Finalize方法,直接回收 (2)有Finalize方法,一个独立的线程finalizer thread异步进行...

yuewei19的专栏 790

column generation

column generation is an insightful overview of the state-of-the-art in integer programming column generation and its many applications. The volume begins with "A Primer in Column Generation" which outlines the theory and ideas necessary to solve large-scale practical problems, illustrated with a variety of examples. Other chapters follow this introduction on "Shortest Path Problems with Resource Constraints," "Vehicle Routing Problem with Time Window," "Branch-and-Price Heuristics," "Cutting Stock Problems," each dealing with methodological aspects of the field. Three chapters deal with transportation applications: "Large-scale Models in the Airline Industry," "Robust Inventory Ship Routing by Column Generation," and "Ship Scheduling with Recurring Visits and Visit Separation Requirements." Production is the focus of another three chapters: "Combining Column Generation and Lagrangian Relaxation," "Dantzig-Wolfe Decomposition for Job Shop Scheduling," and "Applying Column Generation to Machine Scheduling." The final chapter by François Vanderbeck, "Implementing Mixed Integer Column Generation," reviews how to set-up the Dantzig-Wolfe reformulation, adapt standard MIP techniques to the column generation context (branching, preprocessing, primal heuristics), and deal with specific column generation issues (initialization, stabilization, column management strategies).

.NET GC 精要()

本文讲述了 .NET GC 的一些细节知识,内容大部分来自于书籍 Under the Hood of .NET Memory Management (注:本文假设你了解 .NET 的基础知识,譬如值类型,引用类型等) 进阶 之前我们讲述 SOH(Small Object Heap) 时提过其会执行内存压缩过程,但如果程序中存在大量的()对象的话,在 SOH 中完整执行一遍内存压缩也会消耗不少...

tkokof1的专栏 1908

笔记:.NET的框架梳理及相关概念了解(“.NET Core“ “.NET“ “.NET Framework“)

语言层有语法标准,中间层有中间语言标准,但是实现层并没有统一的标准,导致编译时必须选择具体的实现层,.NET实现层的不同类似于C/C++下的CPU架构不同。实现层的每种实现都按照自己的版本规划对标准进行实现,即:每种实现除支持.NET Standard外,还具有自己的一些特性,是.NET Standard的超集。:若程序的实现层选择.NET Standard,那么就可以在所有支持.NET Standard的实现中运行,无需再为不同的实现生成不同的库。):C/C++程序的运行码称为“非托管码”。

weixin_46691179的博客 1955

记一次 .NET医疗布草API程序 内存暴涨分析

一:背景 1. 讲故事 我在年前写过一篇关于CPU爆高的分析文章 再记一次 应用服务器 CPU 暴高事故分析 ,当时是给同济做项目升级,看过那篇文章的朋友应该知道,最后的结论是运维人员错误的将 IIS 应用程序池设成 32bit 导致了事故的发生,这篇算是后续????????????,拖了好久才续上哈。 犹记得那些天老板天天找我们几个人开会,大概老板是在传导甲方给过来的压力,人倒霉就是这样,你说 CPU 爆高可怕吧,我硬是给摁下去了,好了,Memory 又爆高了,尼玛我又给摁下去了,接着数据库死锁又来了,你

一线码农的专栏 292

深入.NET托管堆(managed heap)(上) - 坡南街的杰 - 博客园

深入.NET托管堆(managed heap)(上)Posted on 2005-11-19 09:21 Paker Liu 阅读(78) 评论(0) 编辑 收藏 所属分类: Code Snippet 、Windows Mobile 在.NET的所有技术中,最具争议的恐怕是垃圾收集(Garbage Collection,GC)了。作为.NET框架中一个重要的部分,托管堆和垃圾收集机制对我们...

weixin_30550081的博客 258

.net 对象引用对于非静态的_Net平台GC VS JVM垃圾回收

前言不知道你平时是否关注程序内存使用情况,我是关注的比较少,正好借着优化本地一个程序的空对比了一下.Net平台垃圾回收和jvm垃圾回收,顺便用dotMemory看了程序运行后的内存快照,生成内存快照后,妈妈再也不担心我优化程序找不到方向了。.Net平台垃圾回收内存优化凭空想象这些概念多少会索然无味,下图是我我基于本地的一个程序生成的内存快照,使用jetbrains推出的dotMemory工具生成。...

weixin_35744163的博客 203

.NET垃圾回收机制的初略理解

程序员首先是人,不是所有人都是细心的,更何况细心的人也会有粗心的时候,因此经常会出现忘了释放已经使用完的资源,导致资源紧张。有时候是不愿去做这些扫尾的事情,因为觉得他的时间应该是用在更伟大更崇高的事业上面,至于清理垃圾这些鸡毛蒜皮的事实在不值得他一屑。于是就有了垃圾回收机制,既减轻了程序员的负担,也避免了资源的泄漏,一举两得。首先了解一下对象的整个生命过程:1.给对象分配...

weixin_33749242的博客 87

.NET 垃圾回收机制要点整理

1. .NET资源分托管资源和非托管资源,对于托管资源,.NET GC可以很好的回收无用的垃圾,而对于非托管(例如文件访问,网络访问等)需要手动清理垃圾(显式释放)。 2. 非托管资源的释放,.NET提供了两种方式: 1).Finalizer:写法貌似C++的析构函数,本质上却相差甚远。Finalizer是对象被GC回收之前调用的终结器,初衷是在这里释放非托管资源,但由于GC运行时机的不确定性...

weixin_30677617的博客 64

.NET垃圾回收机制GC

一、GC的必要性   1、应用程序对资源操作,通常简单分为以下几个步骤:为对应的资源分配内存 → 初始化内存 → 使用资源 → 清理资源 → 释放内存。   2、应用程序对资源(内存使用)管理的方式,常见的一般有如下几种:   [1] 手动管理:C,C++   [2] 计数管理:COM   [3] 自动管理:.NET,Java,PHP,GO…   3、但是,手动管理和计数管理的复杂性很...

weixin_33806914的博客 188

c#垃圾回收

C#的Garbage Collector(GC,垃圾回收器)往往让很多程序员产生了对于程序中使用的内存撒手不管的态度。他们会认为既然已经有GC在后台运行了,码中就不需要多加注意了。事实上GC可以是最好的朋友,也可以是最坏的敌人,完全取决于码。 ★垃圾回收器的基本假定★:1.被分配内存空间的对象最有可能被释放。在方法执行时,就需要为该方法的对象分配内存空间,搜索最近分配的对象集合有助于花费最

howard的技术之路 1213

c#内存管理,用空间换时间

  在32位的Windows操作系统中,每个进程都可以使用4GB的内存,这得益于虚拟寻址技术,在这4GB的内存中存储着可执行码、码加载的DLL和程序运行的所有变量,在C#中,虚拟内存中有个两个存储变量的区域,一个称为堆栈,一个称为托管堆,托管堆的出现是.net不同于其他语言的地方,堆栈存储值类型数据,而托管堆存储引用类型如类、对象,并受垃圾收集器的控制和管理。在堆栈中,一旦变量超出使用范围,其

kexijun20014的专栏 1818

深入.NET托管堆(managed heap)

来源:Internet 作者:Mickey Williams版权:本文版权归原作者所有。在.NET的所有技术中,最具争议的恐怕是垃圾收集(Garbage Collection,GC)了。作为.NET框架中一个重要的部分,托管堆和垃圾收集机制对我们中的大部分人来说是陌生的概念。在这篇文章中将要讨论托管堆,和你将从中得到怎样的好处。 为什么要托管堆? .NET框架包含一个托管堆,所有的.N

小有的专栏 1676

AB studio编程软件下载

包含PLC编程软件,studio 5000 V33,V34,V35,V36,V36,V38,触摸屏编程软件,FT view,stuio V16.0.(含授权)

上一篇: 弱引用与弱委托
下一篇: .NET垃圾回收机制-代(generation)的原理分析
iteye_4515
博客等级 码龄8年 175粉丝 0原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值