堆栈
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代