美文网首页
.NET 内存模型-----堆栈与托管堆

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

作者: ArimaKisho | 来源:发表于2017-08-14 14:50 被阅读98次

堆栈(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以外的任何非封装类型。

相关文章

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

    堆栈(STACK):跟踪正在执行的代码(调用的函数) 托管堆(HEAP):跟踪我们的对象object/data. ...

  • c#中的堆与栈

    简介:我们把内存分为堆空间和栈空间线程堆栈:简称栈 Stack 栈空间比较小,但是读取速度快托管堆:...

  • JAVA内存模型-深入理解CPU-STACK内存走向

    JAVA 内存模型-堆和栈: 堆栈存储结构 堆 存放运行时创建的对象、数组。为JVM的主内存,为所有线程共享。 栈...

  • C# 内存分配和参数传递及面向对象之封装,继承

    虚拟内存总体划分为五大区域:栈区(堆栈),堆区(托管堆),常量,静态(静态初始化,静态未初始化),代码区 * 栈...

  • 内存介绍

    虚拟内存总体分五大区域,栈区(堆栈),堆区(托管堆),常量,静态(静态未初始化区,和静态初始化区)其他区域**栈区...

  • 2. 托管内存

    对于Unity内存管理而言,需要理解托管堆。对于如何分析托管内存和如何优化内存,可以参见Unity优化中的理解托管...

  • JS 堆栈内存

    堆栈内存的作用 JS 中的内存堆内存和栈内存,所有堆栈内存的处理,浏览器会自行在内部执行 栈内存: 提供一个供 J...

  • js中堆栈、作用域(链)、this、闭包及垃圾回收

    一、堆栈 1、内存构成、作用域(链)与this JS的内存空间分为栈(stack)、堆(heap)、池(一般也会归...

  • 高效并发(一)——java内存模型与线程

    一、内存模型 1. 主内存与工作内存 虚拟机运行时内存区域: 虚拟机内存模型 前者内存区域中的Java堆、栈、方法...

  • java内存模型

    1、堆和栈的理解和区别[http://c.biancheng.net/c/stack/]2、java内存模型_秋夫...

网友评论

      本文标题:.NET 内存模型-----堆栈与托管堆

      本文链接:https://www.haomeiwen.com/subject/nzzyrxtx.html