温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

ASP.NET堆、栈的基本概念和值类型内存分配是什么

发布时间:2022-08-13 13:57:22 来源:亿速云 阅读:115 作者:iii 栏目:开发技术

本篇内容介绍了“ASP.NET堆、栈的基本概念和值类型内存分配是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

".NET的堆和栈"系列:

ASP.NET堆和栈一之基本概念和值类型内存分配

ASP.NET堆和栈二之值类型和引用类型参数传递和内存分配

ASP.NET堆和栈三之引用类型对象拷贝和内存分配

ASP.NET堆和栈四之对托管和非托管资源垃圾回收和内存分配

当我们对.NET Framework的一些基本面了解之后,实际上,还是很有必要了解一些更底层的知识。比如.NET Framework是如何进行内存管理的,是如何垃圾回收的......这样,我们才能写出更高性能的程序。

在.NET Framework中,有2个地方帮我们保存管理数据:一个是"堆",也叫"托管堆",由.NET Framework的垃圾收集器(Garbage Collection, GC)管理;另一个是"栈",也叫"线程堆栈",由操作系统直接管理。它们都寄宿在操作系统内存。

 什么是"栈"

可以把"栈"想像成由下而上堆叠起来的盒子,值类型实例存储于此。

ASP.NET堆、栈的基本概念和值类型内存分配是什么

在应用程序中,每当调用一个方法,就相当于在"堆"上放上了一个盒子A,这时,应用程序只能使用处在"栈"最上方、刚被放上的这个盒子A,当方法执行结束,相当于把最上方的盒子A扔掉。接下来,刚才还在A下面的盒子B就处在"栈"的最上方了,于是应用程序又开始使用盒子B,以此类推。而且,每当把最上面的盒子扔掉,其对应的内存也被自动释放。

栈的优点是执行效率高,缺点是存储容量有限。

在.NET Framework中,所有派生于System.ValueType的就是值类型,值类型实例位于"栈"。值类型包括:

  • bool

  • byte

  • char

  • decimal

  • double

  • enum

  • float

  • int

  • long

  • sbyte

  • short

  • stuct

  • uint

  • ulong

  • short

什么是"堆"

可以把"堆"想像成一些摆放无序的盒子,引用类型实例存储于此。

ASP.NET堆、栈的基本概念和值类型内存分配是什么

我们可以在任何时候,使用任何盒子。我们需要借助垃圾收集器(Garbage Collection, GC)的自动回收机制或手动处理,以保证"堆"的盒子被及时回收。

另外,根据引用类型实例的大小,"堆"分为"GC堆"和"LOH(Large Object Heap)堆",当引用类型实例大小小于85000个字节的时候,实例被分配在"GC堆"上;当实例大小大于或等于于85000个字节的时候,实例被分配在"LOH(Large Object Heap)堆"。

在.NET Framework中,所有派生于System.Object的就是引用类型,引用类型实例位于"堆"。引用类型包括:

  • 类 class

  • 接口 interface

  • 委托 delegate

  • object

  • string

值类型内存分配

在方法内的值类型内存分配

public int Add(int x)
{
    int result;
    result = x + 2;
    return result;
}

1、在执行Add(int x)方法之前,方法参数x被存放到"栈"的顶部。

ASP.NET堆、栈的基本概念和值类型内存分配是什么

2、在"method table"中搜寻Add()方法,如果找不到,就让JIT及时编译再存放到"method table"中去。

3、开始执行Add(int x)方法,局部变量result也需要"栈"中的一些内存。

ASP.NET堆、栈的基本概念和值类型内存分配是什么

4、当方法执行完毕,先释放result,再释放x,线程堆栈指针重新指向。

ASP.NET堆、栈的基本概念和值类型内存分配是什么

在引用类型内部的值类型内存分配

public class MyClass
{
    public int MyValue;
}

public MyClass Add(int x)
{
    MyClass result = new MyClass();
    result.MyValue = x + 2;
    return result;
}

1、在执行Add(int x)方法之前,方法参数x被存放到"栈"的顶部。

ASP.NET堆、栈的基本概念和值类型内存分配是什么

2、在"method table"中搜寻Add()方法,如果找不到,就让JIT及时编译再存放到"method table"中去。

3、开始执行Add(int x)方法,执行MyClass result = new MyClass()
先在托管堆上创建一个MyClass的实例,然后在栈上开辟一块空间并指向实例地址。

ASP.NET堆、栈的基本概念和值类型内存分配是什么

4、当方法执行完毕,在栈中由上到下依次释放内存。

ASP.NET堆、栈的基本概念和值类型内存分配是什么

此时,在托管堆上的MyClass实例如何处理呢?

5、此时,垃圾回收器登场了,他在托管堆中搜寻那些不再被引用的对象实例,然后实施回收。

练习题

public int ReturnValue()
{
    int x = new int();
    x = 3;
    int y = new int();
    y = x;      
    y = 4;          
    return x;
}

结果是:3, 因为值类型x变量,在方法执行结束之前,一直存在于栈上。

public int ReturnValue2()
{
    MyInt x = new MyInt();
    x.MyValue = 3;
    MyInt y = new MyInt();
    y = x;                 
    y.MyValue = 4;              
    return x.MyValue;
}

结果是:4,因为,当通过y=x把x赋值给y时,实际上是把x在托管堆上的地址赋值y,也就是,栈上的x和y都指向托管堆上的同一个对象实例,改变y的字段值,相当于改变x的字段值。

“ASP.NET堆、栈的基本概念和值类型内存分配是什么”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI