浅析C#中内存管理

前言:个人觉得C#吸收了各种语言的优点,可谓集大成者,但是不知但,这种集所有语言于一身的情况是好是坏.C#编程的一个优点就是程序员不需要关心具体的内存管理,尤其是垃圾收集器会处理所有的内存清理工作.虽然不比手工管理内存,但是如果要编写高质量的代码,还是要理解后台发生的情况,理解C#的内存管理.

用户可以得到像C++语言那样的效率,而不需要考虑像在C++中那样内存管理工作的复杂性.

注意:这一章的许多内容,可以说全部,都是没有经过事实验证的.您应把这一届看做是一般规则的简化向导,而不是实现的确切说明.

首先C#将数据分为两种:值数据类型和引用数据类型,这两种数据类型存储在内存中的不同的地方:值数据类型存储在堆栈中,而引用类型存储在内存的托管堆中.

一.内存简介

windows使用一个系统:虚拟寻址系统.这个系统的作用是将程序可用的内存地址映射到硬件内存中的实际地址.其实际结果就是32位的机子上每个进程都可以使用4GB的内存,当然,64位的机器4,这个数字就更大了.这4G的内存实际上包含了程序的所有的部分,可执行代码,DLL以及程序运行时使用的所有变量的内容.这个4GB内存称为虚拟地址空间或虚拟内存.为方便,着了成为内存.

4GB中的每个存储单元都是从零开始向上存储的.要访问存储在内存中的某个空间中的值,就必须提供表示该存储单元的一个数字.在高级编程语言中,比哪一期的一个重要作用就是负责将人们可以理解的变量名称编程处理器可以理解的内存地址.

二.堆栈

在内存中,有一个区域称为堆栈,存储对象.

对象成员的值数据类型调用方法时,传递给所有方法的参数的副本.注意:调用方法时,堆栈存储的是所有参数的副本,因此,经值类型A传递给函数,A的值是不会变化的.当然,引用类型时会变化的,因为堆栈中存储的是引用类型的地址.

案例:

{

int a;

//do domething

{

int b;

//do domething

}

}

分析:首先声明a,在内部的代码块中声明b,然后内部的代码块终止,b就出了作用域,最后a出作用域.所以b的声明周期总是包含在a的声明周期内,在释放变量的时候,其顺序总是和分配内存的顺序相反.即:变量的生存周期都是嵌套的.这就是堆栈的工作方式.

三.托管堆

堆栈具有相当高的性能,但是变量的生命周期必须是嵌套的,这个要求在有的时候过于苛求.我们希望有一种别的方法来分配内存,存储一些数据,并在方法退出的很长一段时间内,这些户数仍然是可用的,这时就可以使用托管堆.

托管堆(简称堆)是内存中的另一个区域,我们仍然用一个例子来说明堆的工作方式:

{

Customer customer1;

customer1=new Customer();

Customer customer2=new Customer();

//do domething

}

分析:首先,声明一个Customer:customer1,在堆栈上给这个引用分配空间.注意:仅仅是给这个引用分配存储空间,并不是实际的Customer对象.customer1占用4个字节的空间(32位机),来表示Customer对象在内存中的地址.

然后.执行第二行代码,完成以下操作:

在堆上分配存储空间,用来存储CUstomer对象,注意,这里是Customer对象.

将变量customer1的值设为分配给Customer对象的内存地址从这个例子中可以看出,建立引用类型的变量的过程要比建立值类型变量的过程复杂,且不能避免性能的降低.但是,我们可以将一个引用变量的值赋给另一个引用变量,当一个变量出了作用域时,他会从对战中删除,但是对象的数据仍然保留在内存中,直到程序停止.

这样,我们将一个引用变量A传递给函数时,仅仅是将变量A的引用传递给了函数,即:仅仅是在对站上分配内存,即变量B两者指向同一个内存地址.因此,当变量发生变化时,变量A也会发生变化.

四.拆装箱

拆装箱就是值类型和引用类型的项目转化,装箱可以将值类型转化为引用类型,拆箱的作用恰好相反,经引用类型转化为值类型.

五.垃圾回收

一般情况下. .NET运行库会在认为需要的时候运行垃圾收集器来释放托管资源,这在大多数情况下是足够的,就是说我们没有必要去关心内存.但在有的情况下,我们会强制垃圾回收器在代码的某个地方运行,释放内存.这就用到了System.GC.Collect;System.GV表示一个垃圾回收期.这种情况很少见,例如,代码中大量的对象刚刚停止引用,就是和调用垃圾收集器.

C#编程(七十三)----------浅析C#中内存管理的更多相关文章

  1. 深入理解Linux中内存管理

    前一段时间看了<深入理解Linux内核>对其中的内存管理部分花了不少时间,但是还是有很多问题不是很清楚,最近又花了一些时间复习了一下,在这里记录下自己的理解和对Linux中内存管理的一些看 ...

  2. [转载]对iOS开发中内存管理的一点总结与理解

    对iOS开发中内存管理的一点总结与理解   做iOS开发也已经有两年的时间,觉得有必要沉下心去整理一些东西了,特别是一些基础的东西,虽然现在有ARC这种东西,但是我一直也没有去用过,个人觉得对内存操作 ...

  3. 七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 4.@property参数 5.@class和循环retain的使用 6.NSString的内存管理

    1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程 ...

  4. OC中内存管理(转)

    OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继 ...

  5. IOS中内存管理机制浅解

    我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是 由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得 ...

  6. ARM裸机开发中内存管理库RT_HEAP的使用

    在使用arm芯片进行裸机开发的时候,很多时候都需要内存管理的功能,我们可以使用自己写的内存管理程序,也可以直接使用标准库,不过我一般比较喜欢标准库,速度快,今天就来说说在C语言环境下怎么样进行内存的动 ...

  7. 【Linux】深入理解Linux中内存管理

    主题:Linux内存管理中的分段和分页技术 回顾一下历史,在早期的计算机中,程序是直接运行在物理内存上的.换句话说,就是程序在运行的过程中访问的都是物理地址. 如果这个系统只运行一个程序,那么只要这个 ...

  8. 【iOS系列】-iOS中内存管理

    iOS中创建对象的步骤: 1,分配内存空间,存储对象 2,初始化成员变量 3,返回对象的指针地址 第一:非ARC机制: 1,对象在创建完成的同时,内部会自动创建一个引用计数器,是系统用来判断是否回收对 ...

  9. 七十三、SAP中清空内表的三种方式

    一.上代码 二.需要注意的是 * CLEAR 只能清空不带WITH HEADER LINE的内表* REFRESH 能清空内表,但是不回收内存* FREE 能清空内表并回收内存,但是此内表还能继续使用

随机推荐

  1. 20175225《java程序设计》第五周学习总结

    20175225 2018-2019-2 <Java程序设计>第5周学习总结 教材学习内容总结 1.接口体中包含常量的声明(没有变量)和抽象方法两部分.接口体中只有抽象方法,没有普通的方法 ...

  2. IntelliJ IDEA JRebel Maven Tomcat 实现热部署

    一,JRebel 插件 获取与安装 直接在 IDEA 中操作获取 JRebel 插件 Paste_Image.png Paste_Image.png 安装完成,记得重启 IDEA 使刚才安装的插件生效 ...

  3. Intellij IDEA15: 带着参数 运行

    package main.scala /** * Created by silentwolf on 2016/5/24. */ object FileIO { def main(args: Array ...

  4. Js数组里剔除指定的元素(不是指定的位置)

    s数组里删除指定的元素(不是指定的位置)之前一直是做后端的,从来也没有写过js,但是却一直想学学,也只是基于兴趣而已!现在到了这个公司,确实大量的写js.但也一直都是没有系统的去看过js!都是搞什么查 ...

  5. 【BZOJ】4128: Matrix

    题解 学习一下矩阵求逆 就是我们考虑这个矩阵 \(AA^{-1} = I\) 我们相当于让\(A\)乘上一个矩阵,变成\(I\) 我们可以利用初等行变换(只能应用初等行变换,或只应用初等列变换) 分三 ...

  6. XML与HTML区别

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流!—————————— Xml简介 1. xml是什么? Xml 是eXtended markup lang ...

  7. Stable Match

    稳定婚姻问题 主要就是处理两个数组 boy[i][j]    存放第i个男的第j喜欢的女的   存的是女的编号!! girl[i][j]   存放 第i个女的对第j个男的的好感度  存的是值 然后只要 ...

  8. 002.DHCP配置

    一 DHCP服务器安装包 yum -y install dhcp 二 对应端口 ipv4 udp67.udp68 ipv6 udp546.udp547 三 文件路径 服务名:dhcpd 主配置文件:/ ...

  9. C#开发Unity游戏教程之游戏对象的行为逻辑方法

    C#开发Unity游戏教程之游戏对象的行为逻辑方法 游戏对象的行为逻辑——方法 方法(method),读者在第1章新建脚本时就见过了,而且在第2章对脚本做整体上的介绍时也介绍过,那么上一章呢,尽管主要 ...

  10. IllegalArgumentException: Unmatched braces in the pattern.

    IllegalArgumentException: Unmatched braces in the pattern. 非法参数异常. 不匹配的 吊带 在 样品 中. === 没有管.  项目一直卡在d ...