C# 堆和栈的理解

垃圾回收GC:

当我用new创建一个对象时,可分配的内存不足时GC就会去回收未使用的对象,但是GC的操作是非常复杂,会占用很多的cpu时间。

硬盘:数据持久化(就是说 关机之后在开机数据还有,但是内存断电以后数据不在保留)

开机等待的原因就是等硬盘中的数据传输到内存中,数据到了内存中才能被cpu调用

当我们编写程序的时候,操作系统把我们编写的程序分五个区,分派在内存中

这个区是:栈区,堆区、常量区、静态区、代码区,static的变量存放在静态区

堆 Heap:

1.程序运行期间动态分配的内存空间,你可以跟你程序的运行情况确定分配内存的大小

2.存储引用类型

3.堆是从下而上分配,所以已用的空间在自由空间下面,堆是无序的,它是一片不连续的内存域,由用户自己来控制和释放,如果用户自己不释放的话,当内存达到一定特定值时,通过垃圾回收期(GC)来回收。

4. 当看new的时候用到了堆 除了string 先进先出

new Person:在堆区开辟一块空间,保存字段等,这块空间内会有一个地址,这个地址会保存在栈里,new的作用是在堆里开辟一块空间堆。里面就会保存类里面的字段和方法在代码区的地址。
方法:以数据的形势保存在代码区

当执行到Main方法时,会在栈区开辟一个Main栈,当执行到一个新的方法时,会在栈区开辟一个新栈,这个栈保存第一个断点信息,当这个的数据依次被销毁完成时,会返回一个断点信息,返回到Main栈里,然后继续执行这个方法之后的程序,Main方法执行结束后,Main栈里面的信息也会依次被销毁。所有类的方法,都存在代码区(方法在本质上也是一段代码)。方法名是一个地址,这个地址是保存这个方法在代码区的地址。

 5. C#中所有引用类型的对象分配在托管堆上,托管堆在内存上是连续分配的,并且内存对象的释放受垃圾收集机制的管理,效率相对于栈来说要低的多。

栈 Stack:

1. 在编译期间就分配好内存,所以栈的大小有明确定义,

2.存储值类型

3..栈是自上而下进行填充的,即由高内存地址指向低内存地址,并且内存分配是连续的,存储在栈中时要管存储顺序,保持先进后出的原则,他是一片连续的内存域,由系统自动分配和维护,先用高位,再用地位,比如申请了6000的内存,先用的就是6000,直到为0

4.先进后出原则

5.C# 中所有的值类型和引用类型的引用都分配栈上

调用方法:

系统先将一段编码(堆的首部地址)放到栈上,紧接着放置方法的参数,然后代码执行到方法时,查找栈中存放该堆首部地址的所有参数,并通过堆的首部地址来控制堆

当我们使用引用类型时,实际上只是在处理该类型的指针。而非引用类型本身,使用值类型的话则是使用其本身。

当一个类的实例对象创建的时候,这个对象的不同成员按类别被分配到了不同的内存区域,值类型和引用类型的指针被分配到了栈上,引用类型的实例对象被分配到了托管堆上,静态成员被分配到了全局数据区。此时栈上的指针会指向堆上的对象。当对象使用完以后,引用和实际对象的联系就会断开,从而从而使对象冬眠。因为栈具有自我维护性,它的内存管理可以通过操作系统来完成,而此时堆上的冬眠对象就需要通过垃圾回收器(GC)使用一定的算法来进行回收,释放对象所占据的内存。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值