堆栈与垃圾回收

本文详细探讨了进程中的堆栈内存分配,引用类型和值类型的存储位置,享元模式的工作原理,以及C#中的垃圾回收机制,包括托管资源、GC行为和内存回收策略。
摘要由CSDN通过智能技术生成

堆栈

1、一个进程一个堆内存,一条线程一个栈内存

2、student s=new student(); 引用类型在堆中存储,s为变量在栈中存储,new studnet 在堆中存储

3、student s2=s;指向内存都为堆,所以2个变量相同

4、int i=10;object o=i;object为引用所以需要指向堆,而i为值类型指向栈;所以o,与i不在一块内存,i改变o不会变(装箱就是栈内存值-->堆内存) ,反正就是拆箱。

5、new studnet(); 是在堆中所以该类型所有的属性等都在堆中。

6、struct 类型 中有一个引用类型属性,该引用类型被保存到堆中(因为值类型的长度是确定的,引用是不确定)

7、享元:string s1=“1” ;string s2=“2” ; s2=“1” 此时object.ReferenEquals(s1,s2);返回值为True

二者公用1个堆内存(先分配内存在计算就不支持)。

8、将s2=“111”此时只有s1未变,因为堆是连续摆放("1","12","123")分别占1,2,3个字符空间

若是对原堆改变每一个内存都需要后移动变成 “12”就需要挪2个字符空间,“123”又得挪2个空间内存引用会出错,所以s2在赋值是开辟了一块新的内存指向。享元的前提就是对该堆变量进行修改不会影响到其他。

9、方法不保持在堆栈他是存根(不存在存储的概念,需要就有,不需要也不占空间)

10、引用类型中包含引用类,包含类型会指向一块地址,而引用类型的包含类型变量指向该地址

垃圾回收

1、只有堆中才需要被回收

2、垃圾回收--CLR提供、托管资源+引用类型

3、托管资源(CLR控制,new 的对象,string的字符),非托管(数据库链接、文件流、句柄,手动释放)

4、C# using封装了让一些资源可托管

5、什么时候执行GC,new对象会检查堆中够不够,不够就执行回收;GC.Collrc();这些都是回收垃圾对象

6、GC回收:全部的对象标记垃圾,在从入口开始遍历访问到就标记可访问,遍历玩就清理;

("1","12","123")清理了2  ("1", “”,"123")产生不连续所以需要压缩到一块("1","123")所以导致地址移动所以修改变量指向所以出现全局阻塞。

7、清理2种情况 没有析构直接移除;有转到队列在由一个线程专门用来调用(通常用来非托管资源释放),

8、垃圾回收策略 0代第一次分配,1代经历了一次,2代经历了2次及以上;垃圾回收优先0代

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值