美文网首页
GC是什么? 为什么要有GC?

GC是什么? 为什么要有GC?

作者: 张中华 | 来源:发表于2018-12-17 00:09 被阅读204次

    简单了解,学习网址:https://www.cnblogs.com/nele/p/5673215.html

    1. GC是垃圾收集器。程序员不用担心内存管理,因为垃圾收集器会自动进行管

    理.
    2 .NET的GC机制有这样两个问题:

    首先,GC并不是能释放所有的资源。它不能自动释放非托管资源。

    第二,GC并不是实时性的,这将会造成系统性能上的瓶颈和不确定性。

    System.gc静态类中包含多种方法,例如获取系统当前支持的最大代数,强制对所有代进行即时垃圾回收等, 如下:

    #region 程序集 mscorlib.dll, v4.0.0.0
    // C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\mscorlib.dll
    #endregion
    
    using System.Runtime;
    using System.Runtime.ConstrainedExecution;
    using System.Security;
    
    namespace System
    {
        // 摘要: 
        //     控制系统垃圾回收器(一种自动回收未使用内存的服务)。
        public static class GC
        {
            // 摘要: 
            //     获取系统当前支持的最大代数。
            //
            // 返回结果: 
            //     从零到所支持的最大代数间的一个值。
            public static int MaxGeneration { get; }
    
            // 摘要: 
            //     通知运行时在安排垃圾回收时应考虑分配大量的非托管内存。
            //
            // 参数: 
            //   bytesAllocated:
            //     已分配的非托管内存的增量。
            //
            // 异常: 
            //   System.ArgumentOutOfRangeException:
            //     bytesAllocated 小于或等于零。 - 或 - 在 32 位的计算机上,bytesAllocated 大于 System.Int32.MaxValue。
            [SecurityCritical]
            public static void AddMemoryPressure(long bytesAllocated);
            //
            // 摘要: 
            //     取消注册垃圾回收通知。
            //
            // 异常: 
            //   System.InvalidOperationException:
            //     此成员在启用并发垃圾回收时不可用。 有关如何禁用并发垃圾回收的信息,请参见 <gcConcurrent> 运行时设置。
            [SecurityCritical]
            public static void CancelFullGCNotification();
            //
            // 摘要: 
            //     强制对所有代进行即时垃圾回收。
            [SecuritySafeCritical]
            public static void Collect();
            //
            // 摘要: 
            //     强制对 0 代到指定代进行即时垃圾回收。
            //
            // 参数: 
            //   generation:
            //     可执行垃圾回收的最早的代的编号。
            //
            // 异常: 
            //   System.ArgumentOutOfRangeException:
            //     generation 无效。
            public static void Collect(int generation);
            //
            // 摘要: 
            //     强制在 System.GCCollectionMode 值所指定的时间对 0 代到指定代进行垃圾回收。
            //
            // 参数: 
            //   generation:
            //     可执行垃圾回收的最早的代的编号。
            //
            //   mode:
            //     一个枚举值,该值指定垃圾回收的行为。
            //
            // 异常: 
            //   System.ArgumentOutOfRangeException:
            //     generation 无效。 - 或 - mode 不是 System.GCCollectionMode 值之一。
            [SecuritySafeCritical]
            public static void Collect(int generation, GCCollectionMode mode);
            //
            // 摘要: 
            //     通过制定生成来强制从生成 0 进行垃圾回收,同时由 System.GCCollectionMode 值来指定,附加还有数值指定回收是否被阻止。
            //
            // 参数: 
            //   generation:
            //     可执行垃圾回收的最早的代的编号。
            //
            //   mode:
            //     一个枚举值指定是否强制或优化垃圾回收。
            //
            //   blocking:
            //     true 执行阻拦垃圾回收;false 在可能的情况下执行后台垃圾回收。
            //
            // 异常: 
            //   System.ArgumentOutOfRangeException:
            //     generation 无效。 - 或 - mode 不是 System.GCCollectionMode 值之一。
            [SecuritySafeCritical]
            public static void Collect(int generation, GCCollectionMode mode, bool blocking);
            //
            // 摘要: 
            //     返回已经对对象的指定代进行的垃圾回收次数。
            //
            // 参数: 
            //   generation:
            //     对象的代,将针对此代确定垃圾回收计数。
            //
            // 返回结果: 
            //     自启动进程以来已经对指定代进行的垃圾回收次数。
            //
            // 异常: 
            //   System.ArgumentOutOfRangeException:
            //     generation 小于 0。
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            [SecuritySafeCritical]
            public static int CollectionCount(int generation);
            //
            // 摘要: 
            //     返回指定对象的当前代数。
            //
            // 参数: 
            //   obj:
            //     检索其代信息的对象。
            //
            // 返回结果: 
            //     obj 的当前代数。
            [SecuritySafeCritical]
            public static int GetGeneration(object obj);
            //
            // 摘要: 
            //     返回指定弱引用的目标的当前代数。
            //
            // 参数: 
            //   wo:
            //     引用要确定其代数的目标对象的 System.WeakReference。
            //
            // 返回结果: 
            //     wo 的目标的当前代数。
            //
            // 异常: 
            //   System.ArgumentException:
            //     已经对 wo 执行了垃圾回收。
            [SecuritySafeCritical]
            public static int GetGeneration(WeakReference wo);
            //
            // 摘要: 
            //     检索当前认为要分配的字节数。 一个参数,指示此方法是否可以等待较短间隔再返回,以便系统回收垃圾和终结对象。
            //
            // 参数: 
            //   forceFullCollection:
            //     如果此方法可以在返回之前等待垃圾回收发生,则为 true;否则为 false。
            //
            // 返回结果: 
            //     一个数字,它是托管内存中当前所分配字节数的可用的最佳近似值。
            [SecuritySafeCritical]
            public static long GetTotalMemory(bool forceFullCollection);
            //
            // 摘要: 
            //     引用指定对象,使其从当前例程开始到调用此方法的那一刻为止均不符合进行垃圾回收的条件。
            //
            // 参数: 
            //   obj:
            //     要引用的对象。
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            public static void KeepAlive(object obj);
            //
            // 摘要: 
            //     指定当条件支持完整垃圾回收以及回收完成时,应引发垃圾回收通知。
            //
            // 参数: 
            //   maxGenerationThreshold:
            //     一个介于 1 和 99 之间的数字,指定根据第 2 代中保留的对象,应何时引发通知。
            //
            //   largeObjectHeapThreshold:
            //     一个介于 1 和 99 之间的数字,指定根据大对象堆中分配的对象,应何时引发通知。
            //
            // 异常: 
            //   System.ArgumentOutOfRangeException:
            //     maxGenerationThreshold  或 largeObjectHeapThreshold  不在 1 和 99 之间。
            [SecurityCritical]
            public static void RegisterForFullGCNotification(int maxGenerationThreshold, int largeObjectHeapThreshold);
            //
            // 摘要: 
            //     通知运行时已释放非托管内存,在安排垃圾回收时不需要再考虑它。
            //
            // 参数: 
            //   bytesAllocated:
            //     已释放的非托管内存量。
            //
            // 异常: 
            //   System.ArgumentOutOfRangeException:
            //     bytesAllocated 小于或等于零。 - 或 - 在 32 位的计算机上,bytesAllocated 大于 System.Int32.MaxValue。
            [SecurityCritical]
            public static void RemoveMemoryPressure(long bytesAllocated);
            //
            // 摘要: 
            //     请求系统调用指定对象的终结器,此前已为该对象调用 System.GC.SuppressFinalize(System.Object)。
            //
            // 参数: 
            //   obj:
            //     必须为其调用终结器的对象。
            //
            // 异常: 
            //   System.ArgumentNullException:
            //     obj 为 null。
            [SecuritySafeCritical]
            public static void ReRegisterForFinalize(object obj);
            //
            // 摘要: 
            //     请求系统不要调用指定对象的终结器。
            //
            // 参数: 
            //   obj:
            //     不得为其调用终结器的对象。
            //
            // 异常: 
            //   System.ArgumentNullException:
            //     obj 为 null。
            [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            [SecuritySafeCritical]
            [TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
            public static void SuppressFinalize(object obj);
            //
            // 摘要: 
            //     返回已注册通知的状态,用于确定公共语言运行时是否即将引发完整、阻塞垃圾回收。
            //
            // 返回结果: 
            //     已注册垃圾回收通知的状态。
            [SecurityCritical]
            public static GCNotificationStatus WaitForFullGCApproach();
            //
            // 摘要: 
            //     在指定的超时期限内,返回已注册通知的状态,用于确定公共语言运行时是否即将引发完整、阻碍性垃圾回收。
            //
            // 参数: 
            //   millisecondsTimeout:
            //     在获取通知状态前等待的时间长度。 指定 -1 表示无限期等待。
            //
            // 返回结果: 
            //     已注册垃圾回收通知的状态。
            //
            // 异常: 
            //   System.ArgumentOutOfRangeException:
            //     millisecondsTimeout 必须为非负数或小于或等于 System.Int32.MaxValue 或 -1。
            [SecurityCritical]
            public static GCNotificationStatus WaitForFullGCApproach(int millisecondsTimeout);
            //
            // 摘要: 
            //     返回已注册通知的状态,用于确定公共语言运行时引发的完整、阻碍性垃圾回收是否已完成。
            //
            // 返回结果: 
            //     已注册垃圾回收通知的状态。
            [SecurityCritical]
            public static GCNotificationStatus WaitForFullGCComplete();
            //
            // 摘要: 
            //     在指定的超时期限内,返回已注册通知的状态,用于确定公共语言运行时引发的完整、阻碍性垃圾回收是否已完成。
            //
            // 参数: 
            //   millisecondsTimeout:
            //     在获取通知状态前等待的时间长度。 指定 -1 表示无限期等待。
            //
            // 返回结果: 
            //     已注册垃圾回收通知的状态。
            //
            // 异常: 
            //   System.InvalidOperationException:
            //     millisecondsTimeout 必须为非负数或小于或等于 System.Int32.MaxValue 或 -1。
            [SecurityCritical]
            public static GCNotificationStatus WaitForFullGCComplete(int millisecondsTimeout);
            //
            // 摘要: 
            //     挂起当前线程,直到处理终结器队列的线程清空该队列为止。
            [SecuritySafeCritical]
            public static void WaitForPendingFinalizers();
        }
    }
    
    

    相关文章

      网友评论

          本文标题:GC是什么? 为什么要有GC?

          本文链接:https://www.haomeiwen.com/subject/zwfpcqtx.html