.NET 内存模型-----堆栈与托管堆

堆栈(STACK):跟踪正在执行的代码(调用的函数)

托管堆(HEAP):跟踪我们的对象object/data.


STACK和HEAP的形象化比喻

STACK是先进后出的,只能使用TOP.而HEAP是可以随取随放的。

STACK是自我维护的,自己负责自己的内存管理(memory management),TOP层的数据不再用的时候就被扔了。而HEAP和GC(紧密相关)。

STACK和HEAP主要负责四种类型的数据:

值类型(VALUE);引用类型(REFERENCE);指针(POINTERS);指令(INSTRUCTIONS)。

C#中的值类型:

bool

byte

char

decimal

double

enum

float

int

long

sbyte

short

struct

uint

ulong

ushort

C#中的引用类型(继承自SYSTEM.OBJECT):

class

interface

delegate

object

string

指针:

指针(或者引用)和引用类型完全是两个不同的概念。我们不会直接用到它,因为它被CLR自己维护的。一个指针是一块指向另一块内存空间的内存空间。指针就像我们放置在STACK或者HEAP中的数据一样,只不过它的值是内存地址罢了。


指针的形象化解释

值类型通常保存在STACK中,作为一个线程维护状态的参数空间/一个线程运行时有自己的虚拟内存(method call涉及body里的变量)

下面是两个例子:

1.值类型

public int  AddFive(intpValue)

{int  result;

result = pValue + 5;

return  result;

}

1.过程开始


2.result入栈


3. 这个method call结束


4.结束,释放内存空间

2.引用类型
public class MyInt{

public int MyValue;

}

接下来执行的函数:

public MyInt  AddFive(int pValue)

{MyInt result =new MyInt();

result.MyValue = pValue + 5;

return   result;}


1.进程开始


2.result涉及引用类型MyInt,指针进栈


3.函数结束,栈释放内存空间


4.栈空了,堆的内存空间未释放

这个时候GC垃圾回收开始发挥作用,当内存空间不够时,GC停止所有正在运行的线程THREAD,然后检查HEAP中哪些objects不再被用了,回收它们。

当我们处理引用类型的时候,我们处理的是对应类型的指针,而不是它自己;当我们处理值类型的时候,我们处理的就是它自己。

CTS(通用)的值类型可分为简单类型、枚举类型和结构类型,而引用类型则分为类类型、数组类型、接口类型和委托类型。最后,值类型是密封的,不能派生其他类型,而且值类型必须继承自System.Value,相反,引用类型可以继承除System.Value以外的任何非封装类型。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,328评论 18 399
  • JVM内存模型Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: ...
    光剑书架上的书阅读 7,590评论 2 26
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,498评论 11 349
  • 尽管在Java我们并不需要担心内存管理和垃圾回收(GarbageCollection),但是我们还是应该了解它们,...
    csgyl阅读 3,535评论 0 0
  • 本游戏郑重承诺以保护使用其交互性产品和服务之用户的隐私。以下声明旨在披露与本游戏网页有关的隐私政策: 本游戏收集哪...
    旬日阅读 5,539评论 0 0

友情链接更多精彩内容