图解.NET内存堆和栈

llovebo

共 2552字,需浏览 6分钟

 · 2024-04-10

简介

计算机的内存可以分为代码块内存,stack内存和heap内存。代码块内存是在加载程序时存放程序机器代码的地方。.NET(C#) 的内存管理涉及两个主要部分:堆(Heap)和栈(Stack)。这两个结构在数据存储和管理方式上有显著的不同,它们对程序性能和资源使用有重要影响。

1、栈(Stack)

栈是一种线性数据结构,它以先进先出(LIFO)的方式管理数据。栈主要用于存储方法调用的信息,包括局部变量、方法参数和返回地址等。每个线程都有自己的栈。栈上的数据存储空间由编译器自动管理,因此它具有高速读写的特点。栈上的数据生命周期短暂,当一个方法结束时,它的栈中的数据就会被销毁。栈的操作通常更快,因为数据始终在栈顶进行增加或删除。存储基本数据类型(如 int, char, double)的值类型变量。存储引用类型的引用(即对象的地址)。方法的参数和局部变量通常存储在栈上。

2、堆(Heap)

堆是一种非线性数据结构,它用于存储动态分配的对象。堆上的数据由开发人员手动分配和释放,通常使用 new 操作符来创建对象。堆上的数据生命周期可以很长,直到没有引用指向这些对象时,它们才会被垃圾回收器回收。堆上的数据可以跨多个方法和线程访问,因此它们通常用于存储全局数据、对象和大型数据结构。存储引用类型的对象(如类实例、数组)。当使用 new 关键字创建对象时,对象被存储在堆上。

3、堆和栈的区别

在C#中,值类型(如整数、字符、布尔等)通常存储在栈上,而引用类型(如类、数组、接口等)的对象通常存储在堆上,但引用类型的引用本身可以存储在栈上。这是因为栈上的引用指向堆上的对象。内存中存储示意图如下,

1)int a=5;

4523b9c524b907333d7f57b33207a234.webp


2)String str="abc.com",

4ee1e98b1331bd5d96c697dcb7f12092.webp



3)示例代码

      
        using System;
      
      
        
          
class Person { public string Name { get; set; } public Person(string name) { Name = name; } }
class Program { static void Main() { int x = 5; // 值类型,存储在栈上 int y = 10; // 值类型,存储在栈上
int sum = Add(x, y); // 方法调用,局部变量 sum 存储在栈上 Console.WriteLine("Sum: " + sum); // 输出 Sum: 15
Person person1 = new Person("C#"); // 创建 Person 对象,存储在堆上 Person person2 = new Person("Java"); // 创建另一个 Person 对象,存储在堆上
Console.WriteLine("Person 1: " + person1.Name); // 输出 Person 1: C# Console.WriteLine("Person 2: " + person2.Name); // 输出 Person 2: Java }
static int Add(int a, int b) { return a + b; } }


注意:了解内存中的堆和栈的区别对于编写高效的C#代码以及避免内存泄漏等问题非常重要。同时,C#的垃圾回收器会负责管理堆上的对象,使得开发人员不需要手动释放内存,但要注意及时清除不再使用的引用以便垃圾回收能够正常工作。

编程之路

转自:cjavapy.com/article/39/

9c027f68777e24642c2c689fc21f67aa.webp

    

关注公众号DotNet开发跳槽    

浏览 3
点赞
评论
收藏
分享

手机扫一扫分享

举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

举报