• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

带你复习c# 托管和非托管资源

c# 搞代码 4年前 (2022-01-09) 16次浏览 已收录 0个评论

前言

c# 托管和非托管比较重要,因为这涉及到资源的释放。

现在只要在计算机上运行的,无论玩出什么花来,整个什么概念,逃不过输入数据修本文来源[email protected]搞@^&代*@码网(改数据输出数据(计算机本质),这里面有个数据的输入,那么我们的内存有限啊,这里面就牵扯到数据释放。

看下c# 的垃圾回收是怎么样的。

了解垃圾回收之前首先要了解数据,了解数据需要了解数据类型啊,数据类型分为值类型还有引用类型。

windows 使用一个虚拟寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址上,这些任务完全由windows 在后台管理。我们的程序运行在操作系统上,那么我们作为程序员关系的就是这个虚拟寻址系统。

这东西有什么用呢?

比如32位系统中,每个进程所占用的最多4G(4G这样来的,2^32,4个字节),那么这个程序如果进行管理的这4G,它不需要知道在硬件地址是多少。

比如这个进程申请了1k内存,那么这个进程管理的实际是从0到1k的虚拟内存,而不需要知道这个硬件物理内存地址是多少,有一个可以直接证明的就是我们写c++输出指针的时候,发现指针输出1千多,

你觉得可能是物理内存地址的1千多吗?默默的打开资源管理看看现在占用多少内存。

默认情况下,32 位计算机上的每个进程都具有 2 GB 的用户模式虚拟地址空间。这里解释一下,每个进程2个G是虚拟地址,就是在这个进程维护一个2G的虚拟地址,并不是实际占有2G的硬件内存地址。

盗一张图:

虚拟地址有三种状态:

状态 描述
Free 该内存块没有引用关系,可用于分配。
保留 内存块可供你使用,并且不能用于任何其他分配请求。 但是,在该内存块提交之前,你无法将数据存储到其中。
已提交 内存块已指派给物理存储。

那么这个虚拟内存上又分了堆和栈,栈上存储值类型,堆上存储引用类型。

他们的存储方式不一样。

下面是栈:

栈是这样子的先用高位后用低为,比如申请80000,先用的就是80000 直到为0为止。

{
 int a=10;
 double b=100.0;
}

如上图,80000用完了,这时候栈指针指向80000。

现在int a了,int是4个字节,这时候栈指针减4,到79996这个位置。

然后是double,double 为8个字节,这时候栈指针减8,以此类推。

然后如果变量超出作用域,那么这个时候就会被垃圾回收,栈指针增加8,然后增加4。(记得栈指针增加的时候[垃圾回收]并不会去把已经使用的地址重置为0,只有类型申明的时候才重置为0,然后再赋值)

下面是引用类型:

堆是这样子的,已用的内存地址小,空闲的内存地址大。

举个栗子:

{
 student a;
 a=new student;
}

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:带你复习c# 托管和非托管资源

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址