zoukankan      html  css  js  c++  java
  • GC.Collect()简介及一般用法

    熟悉.NET的开发者们应该都知道里面有一个GC.Collect()吧,它的功能就是强制对所有代进行垃圾回收。下面介绍与之相关的几个术语:

    何谓代?

    代是指托管内存中不同的区域,对象越老位于的代越靠后,比如:第一次垃圾回收后某个对象未被回收,它可能就会从0代移动到1代,以此类推。
    何谓垃圾?

    垃圾就是只没有任何对象再和他有引用关系,专业点说就是从这个对象开始找其引用,一直找,如果找到它正在引用一个根,那么这个就是不是垃圾,如果找不到根则这个对象就是垃圾。

    何谓根?

    根就是指一个存储位置,包含指向某个引用类型的指针。比如静态变量,全局变量就是根,当前寄存器里面的对象就是根,还有当前调用栈上的参数,局部变量都是根。

    另外,垃圾回收开始的时候当前所有线程都将被挂起,开始收集托管堆上的垃圾,收集完了还要压缩内存,然后等待垃圾回收结束以后再恢复这些线程,从这个角度来说,还是少调用垃圾回收,但是不是不能调,要视情况而定。

    GC.Collect()的一般用法如下面源码如示:


    ......

    dpFormulaList.Clear();
    dpFormulaList = null;
    inputs.Clear();
    inputs = null;
    GC.Collect();

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace TestDOME
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                using(Demo de2 = new Demo())
                {
                    de2.dt();
                }
                Demo de3 = new Demo();
                de3.Dispose();
    
                Demo1 d1 = new Demo1();
                d1 = null;//设置为空时才可以手动释放
                GC.Collect();
            }
        }
    
        public class Demo : IDisposable//继承接口
        {
            public void dt()
            {
     
            }
            ~Demo()
            {
                Dispose(false);
            }
    
            #region IDisposable Members
    
            public void Dispose()
            {
                Dispose(true);
                GC.SuppressFinalize(true);
            }
            private bool _disposed = false;//资源释放标志
            protected virtual void Dispose(bool disposeManageResourse)
            {
                if (!_disposed)
                {
                    if (disposeManageResourse)
                    {
                        //释放托管资源
                        MessageBox.Show("回收资源1");
                    }
                    _disposed = true;
                }
            }
    
    
            #endregion
        }
    
        public class Demo1
        {
            ~Demo1()
            {
                MessageBox.Show("回收资源d1");
            }
        }
    }
  • 相关阅读:
    2018.7.26笔记(变量的数据类型,if语句)
    id(),is 和 ==的区别,编码和解
    2018.7.31笔记(列表的基本操作)
    阅读与感悟如何高效学习
    说说设计模式 单例模式
    简单说说Java知识点 多线程
    阅读与感悟联盟
    阅读与感悟非暴力沟通
    简单说说Java知识点 HashMap
    MySQL知识树存储引擎
  • 原文地址:https://www.cnblogs.com/stalwart/p/1918426.html
Copyright © 2011-2022 走看看