c#基础-6.构造、析构函数和垃圾回收机制

构造函数

基本内容不写了,学过c++或java都知道。

构造函数的特殊写法

通过this重用构造函数代码,结构为:
public 类命():this(参数1,…);

class Person
    {
        string name;
        int number;
        public Person(int number)
        {
            this.number = number;
        }
        public Person(string name,int number):this(number)
        {
            this.name = name;
        }
        static void Main(string[] args)
        {
         
            Person person = new Person("xiaomin",123);
            Console.WriteLine("{0} {1}", person.name, person.number);
            GC.Collect(1);
            Console.ReadKey();
        }
    }

析构函数(了解)

在这里插入图片描述

垃圾回收机制

垃圾回收,英文简写为GC。
垃圾回收的过程是在遍历堆(Heap)上动态分配的所有对象,所谓垃圾就是没有被任何变量,对象引用的内容。

原理:分为0代内存、1代内存、2代内存

代的概念:
代是垃圾回收机制使用的一种算法,新分配的对象都会被配置在第0代内存中

在一次内存回收过程开始时,垃圾回收器会认为堆中全是垃圾,会进行以下两步:

1.标记对象,从根(静态字段、方法参数)开始检查引用对象,标记后为可达对象,未标记为不可达对象。不可达对象就是垃圾。

2.搬运对象压缩堆 释放未标记的对象 搬运可达对象 修改引用地址

解释:比如我们new了3个对象,也就是在堆中开辟了3块空间,3个对象为我们正在使用对象,标记为可达对象,假设第0代内存满了,我们会将第0代的3个可达对象搬运到第1代内存,而且刚搬运过来不是连续空间,第1代内存会将它们压缩成连续空间,然后原来的在0代上的3块空间成为不可达对象就要释放掉,这样我们就修改对象的引用地址(从0代到1代)。

如果1代也满了,在从1代搬运到2代的过程中,要释放0代和1代的内存,搬运步骤一样,所以第0代中都是新分配对象,而1代和2代都是旧对象。

大对象总被认为是第二代内存,目的是减少性能损耗,提高性能。不会对大对象进行搬运压缩,大约83kb以上的为大对象。

当然这都是堆内存满的时候才能垃圾回收,我们也可以手动触发:

static void Main(string[] args)
        {
            //在场景加载时调用比较好,防止游戏卡顿
            GC.Collect();
            Console.ReadKey();
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值