c# 栈(stack) 和 堆(heap) 的工作原理

第一次写博客,作为理科生的我,不善于表达,请各位看官见谅!

接触C#已经有5年有余了 ,从一个菜菜鸟到现在的 小菜鸟,把自己踩过的一些坑,分享一下 ,如果有不同的观点,非常欢迎一起讨论学习,谢谢!

进入今天的主题了 !

我们编写的代码必须在电脑中运行 , 一台电脑的内存多大,决定了我们所编写的应用程序执行的效率。

在.NET Framework环境中,应用程序执行时,代码会存储在内存中 ,在内存中 会分为两个概念:栈和堆

首先来介绍一下栈:

栈(stack): 负责保存我们的代码执行的路径。也就是说,我们的代码在执行某个函数的时候,会依次存入栈中,你可以想象把栈看成是一个容器,先被执行的放在最下面,因为栈是被内存自动维护的,当这个函数执行完后,这个函数执行的内存空间将自动被回收。

堆(heap):负责保存对象的路径。堆在内存中存储的空间无顺序摆放的 ,所以我们访问是没有限制的。这样就造成 堆不能被系统及时的回收,增大 了内存的垃圾数据,如果我们在代码中不将无用的堆信息释放,那只能等到内存达到一个阀值的时候,内存会启动GC回收,当启动GC回收的时候,会停掉所有正在运行的所有线程,找出堆中存在的不被主程序所访问的对象,并释放掉,然后GC会重新组织堆中所有剩下的对象来节省空间,这个过程是非常消耗性能的 ,所以在编写高性能的代码是,这是我们必须所重视的!

 接下来我们看下栈和堆中有什么东东了:

 当我们的代码执行的时候,栈和堆中主要放置了四种类型的数据:值类型(Value Type),引用类型(Reference Type),指针(Pointer),指令(Instruction)。

1、值类型:

bool 

byte 

char 
decimal 
double 
enum 
float 
int 
long 
sbyte 
short 
struct 
uint 
ulong 

ushort

2、引用类型:

class 
interface 
delegate 
object 

string

3、指针类型

 指针类型在我们的代码并没有显示出来,在调用一个引用类型的时候,内存中会分配一块内存空间来存储指向这个引用类型的地址的指针对象 。

4.指令

 对于指令,我理解也很少,如果您对指令有何见解,非常欢迎交流学习

对于栈和堆   值类型和引用类型  我们都有了相关了了解,接下来 我们一起看看它们在程序中是 怎样运行的 。



通过这个图 我们分析一下 ,我们定义了两个int 类型(值类型),首先我们分别给 i,j赋值  i=10,j=20.然后 再不i 赋值给j  ,再对 i进行重新赋值,这里输出结果跟我们想的一样 ,i 的是最后赋的值,j的值是 i初始化的值 10. 


我们在看看这个图, 先定义一个类类型(引用类型),首先分别实例两个类类型对象,内存会给他们单独分配两块独立的存储空间,分别给实例里面的属性进行赋值,这时候 两个实例里面的属性分别是 5,10这两个值,然后第二个实例赋值给第一个实例,再对第二个实例里面的值进行重新赋值,我们在把两个实例的值打印出来看看 。  全都第二个 最后赋的那个数值。 矣。是不是很奇怪?   来我们分析一下 ,首先  我们实例化了两个引用类型对象,他们都会在栈中占用一块存储空间  注意这里栈不是存储实例对象,而是存储一个指针对象,指向这里实例对象的指针,当第二个实例赋给第一个实例时, 这时候 classtest 的指针引用会被 classtest2 的指针引用所覆盖掉。这时  classtest 和classtest2 用的是同一个指针了 。所以在最后为什么改变calsstest2的属性值,calsstest的属性值 也跟着改变。因为它们用的是 同一个对象。

总结:

引用类型:它是存储中堆中的

值类型:它是存储在被声明的地方(如果在堆中声明了 ,就存在堆中,如果在栈中声明,就存在栈中)

最后一点是本章最重要的知识:因为栈是由内存来自动维护的 ,变量的生命周期都是由内存去管理。堆中的变量就不那么理想了 ,在堆中的变量要等到程序结束,或者达到内存中的一个阀值,内存会启动 GC管理器,进行清理,这个过程是非常消耗性能的。比如上面我们创建的classtest 和classtest2,当这个方法执行完后,内存中只会清除栈中 指向这两个实例的指针引用,并不会清除 classtest classtest2真实的内存空间,这时就造成了内存垃圾,虽然这两个实例只占用很少的内存空间,几乎可以忽略不计。但是对于大型网站 ,积少成多,对于我们的性能还是有影响的 。


这是本人对 栈和堆的见解。如果有错误的地方,非常欢迎一起学习进步,谢谢!

猜你喜欢

转载自blog.csdn.net/u010838163/article/details/79720638