在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → GC 垃圾回收算法

GC 垃圾回收算法

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.01M
  • 下载次数:51
  • 浏览次数:1066
  • 发布时间:2012-12-16
  • 实例类别:C#语言基础
  • 发 布 人:chaogu
  • 文件格式:.rar
  • 所需积分:2
 相关标签: 垃圾回收 算法

实例介绍

【实例简介】

 

=1,2
垃圾回收算法:
    托管堆:CLR要求的资源从托管堆分配,任何对象只要没有应用程序的根引用它,都会在某个时刻被垃圾回收器回收
 基于代的机制,提高回收的性能,在程序的生命期中,新建的对象是新一代,而创建的比较早的对象是老一代,第0代是最近分配的对象,CLR 使用了0,1,2三代进行管理

=3 GC和调试
GcAndDebug.cs

=4本地资源
终结(finalization)是CLR提供的一种机制,允许对象在垃圾回收器回收其内存之前执行一些得体的清理工作,任何包装了本地资源的类型都必须支持终结操作(实现一个命名为Finalize的方法)。
GC判断一个对象是垃圾时,会调用对象的Finalize(实现的情况下),C#中使用~ClassName表示Finalize
In most cases, you do not need to write classes that derive from the CriticalFinalizerObject class. The .NET Framework class library provides two classes, SafeHandle and CriticalHandle, that provide critical finalization functionality for handle resources. Furthermore, the .NET Framework provides a set of prewritten classes derived from the SafeHandle class, and this set is located in the Microsoft.Win32.SafeHandles namespace. These classes are designed to provide common functionality for supporting file and operating system handles.

System.Runtime.ConstrainedExecution 下的 CriticalFinalizerObject 抽象对象,CLR特殊对待
 System.Runtime.InteropServices下的派生抽象类
 SafeHandle
 CriticalHandle 和SafeHandle只是引用计数的区别
Microsoft.Win32.SafeHandles
 SafeFileHandle,SafeRegistryHandle ,SafeWaitHandle...
 SafeProcessHandle SafeLibraryHandle SafeLocalMemHandle SafeThreadHandle等MSDN没有编写,但同样是处理这个问题的
 类似的实现的不同类代表不同的资源类型,这么多的类似,主要是为了类型安全
SafeHandle的作用:
1、以前的IntPtr形式不够健壮,如在IntPtr赋值前可能抛出ThreadAbortException异常,这样托管代码将造成本地资源的泄露
2、防止利用潜在的安全漏洞,一个线程访问一个本地资源,另一个线程释放该资源,通过引用计数实现

对托管资源只有在极少数情况下才使用终结器

终结器被调用的时刻:
1、第0代满:
2、显式调用GC.Collect
3、Windows报告内存不足
4、CLR卸载AppDomain
5、CLR关闭

内部实现使用终结列表保留对象,通过这个GC进行处理, freachable队列

=Dispose
终结器的调用时间由GC确定,调用者无法显式调用它
Dispose提供了显式清理资源的能力

GCHandle WeakReference

System.Runtime.CompilerServices.ConditionalWeakTable<TKey,TValue>
加入时的是对象的WeakReference,因此可能会回收,但可以确保只要key存在,value也是存在的

任何大于85000字节的对象被自动认为是大对象,大对象在大对象堆中分配

==
大量资源
GC
public static void AddMemoryPressure(Int64 bytesAllocated);  
public static void RemoveMemoryPressure(Int64 bytesAllocated);
提示GC实际需要消耗的内存,然后GC监视内存压力,压力变大时,强制回收

System.Runtime.InteropServices  HandleCollector 数量有限的本地资源

MemoryFailPoint在需要大量内存前可以先检查是否可以使用这么大的内存

GC的监视
代码形式:
 GC.GetTotalMemory
 GC.CollectionCount
PerMon.exe系统性能监视工具
CLR Profiler工具


FUSLOGVW.exe
clrver.exe
SvcTraceViewer.exe


【实例截图】


【核心代码】

private void BigObject()
        {
            ///任何大于85000字节的对象被自动认为是大对象,大对象在大对象堆中分配
            byte[] bs = new byte[85000];
            Console.WriteLine("大对象的代: {0}", GC.GetGeneration(bs));
            //GC.Collect(
        }

        public void GoWeak()
        {
            var form = new Form()
            {
                Text = "Weak Delegate Test",
                FormBorderStyle = FormBorderStyle.FixedSingle
            };

            var btnTest = new Button()
            {
                Text = "Click me",
                Width = form.Width / 2
            };

            var btnGC = new Button()
            {
                Text = "Force GC",
                Left = btnTest.Width,
                Width = btnTest.Width
            };

            // WeakEventHandler turns an EventHandler delegate into a weak version of itself  
            btnTest.Click  = new WeakEventHandler(new DoNotLiveJustForTheEvent().Clicked)
            {
                RemoveDelegateCode = eh => btnTest.Click -= eh
            };

            btnGC.Click  = (sender, e) => { GC.Collect(); MessageBox.Show("GC complete."); };

            form.Controls.Add(btnTest);
            form.Controls.Add(btnGC);
            form.ClientSize = new Size(btnTest.Width * 2, btnTest.Height);
            form.ShowDialog();
        }
    }

标签: 垃圾回收 算法

实例下载地址

GC 垃圾回收算法

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警