C#堆栈和堆的讲解

  1. OS和CLR通常将用于容纳数据的内存划分为两个独立的区域,每个区域都采用截然不同的方式来管理:堆栈(Stack)和堆(heap)。

(1)       调用一个方法时,它的参数以及它的局部变量需要的内存总是从堆栈中获取,方法结束后,为参数和局部变量分配的内存将自动还给堆栈,并可在另一个方法调用时重新使用。

(2)       使用new关键字和一次构造函数调用来创建一个对象时,创建对象所需的内存总是从堆中获取,使用引用变量,同一个对象可以从几个地方引用,对对象的最后一次引用消失以后,对象使用的内存就可以供重用(它可能没有被立即回收)。

(3)       所有值类型都是在堆栈中创建的,所有引用类型都是在堆中创建的。

2.堆内存和堆栈内存

(1)堆栈内存就像一系列堆叠越高的箱子:调用方法时,每个参数都被放入一个箱子,并将这个箱子放到堆栈的最顶部。每个局部变量也同样分配到一个箱子,并同样放到堆栈最顶部;方法结束后,它的箱子都会从堆栈中移除。

(2)堆内存则像散布在房间里的一大堆箱子,而不像堆栈那样每个箱子都严格重叠在另一个箱子上方,每个箱子都有一个标签,标记了这个箱子是否使用。创建一个对象时,运行库会查找一个空箱子,并把它分配给对象,对对象的引用存储在堆栈上的一个局部变量中。运行库会跟踪对每一个箱子的引用数量,一旦最后一个引用消失,运行库就会将箱子标记为“未使用”吗,将来某个时候,会消除箱子里的东西,使其真正的能够重用。堆内存是一种有限的资源,如果堆内存被耗尽,new操作将会抛出一个OutOfMemoryException,对象创建失败。

3.对上边理论的例子解释:

例如: void Method(int param)

{

  Circle c;

  C=new Circle(param);

   ……

}

假定传给param的值是42.。堆栈中将分配出一小片内存(刚好能够存储一个int),并使用值42来初始化,在方法内部,还要从堆栈中分配除另一小片内存,它刚好能够存储一个引用,只是暂时不初始化而已。接着,需要从堆中分配一个足够大的内存区域来容纳一个Circle对象。这正是new关键字所执行的操作——它将运行Circle构造函数,将这个原始的堆内存转换成一个Circle对象。

Circle构造函数也可能跑出一个异常,在这中情况下,分配给Circle对象的内存也会被回收,而且构造函数返回的将是一个null引用。

下面画一个图来表示一下内存中的分配,可能更清楚一些:

 

转载于:https://www.cnblogs.com/loveyezi/archive/2012/11/23/2784274.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/361121.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jQuery中的常用内容总结(一)

jQuery中的常用内容总结(一) 前言 不好意思(✿◠‿◠),由于回家看病以及处理一些其它事情耽搁了,不然这篇博客本该上上周或者上周写的;同时闲谈几句:在这里建议各位开发的童鞋,如果有疾病尽快治疗,不要拖&a…

关于Firefox在Win8下界面显示错乱的解决方法

最近又把Windows8安装上,由于平常做前端开发用的最多的还是Firefox,因此在家的机器上也安装上Firefox,但使用中发现Firefox界面老是错误,特别是那种乱套的颜色,不得其解,查看设置发现默认启用了硬件加速&am…

react ant design路由配置

最初的时候,只使用了antd中的menu,header和footer都是自己写的组件,在写路由时,总是报如下错误: 相关的路由配置如下: 在网上查的说是组件未暴露出去或者是return 这一行必须有个括号或者标签,我…

线程魔术技巧:Java线程可以做的5件事

Java线程最鲜为人知的事实和用例是什么? 有些人喜欢爬山,有些人喜欢跳伞。 我,我喜欢Java。 我喜欢它的一件事是,您永不停止学习。 您每天使用的工具通常可以向您展示全新的方面,以及您还没有机会看到的方法和有趣的用…

强制删除tfs未迁入项的两个方法。

方法1: 打开Vs2008的命令提示: 查看用户的工作区: 输入: Tf workspaces /owner:所有者或* /server:服务器名称或IP ex: tf workspaces /owner:stcct(所有者) /server:203.156.1.100(Ip地址) 删除用户的未迁入项: 输…

VUE 全选

<div id"vue_det"> <p>全选:</p> <input type"checkbox" id"checkbox" v-model"checked" change"changAllChecked"/> <label for"checkbox"> {{checked}} <…

RabbitMQ –使用Spring集成Java DSL串行处理消息

如果您曾经需要使用RabbitMQ来串行处理消息&#xff0c;并且有一群监听器来处理消息&#xff0c;那么我所看到的最好方法是在监听器上使用“独占消费者”标志&#xff0c;每个监听器上有1个线程来处理消息。 专用使用者标志可确保只有1个使用者可以从特定队列中读取消息&#…

添加删除约束脚本 ::fn_get_sql

添加约束&#xff1a;alter table table1 add constraint pk_name primary key (name) --添加主健约束,名称作为主健&#xff1b; alter table table1 add constraint pk_name unique (name) --添加唯一约束,…

jquery 实现 点击把数据移动右侧 点击再次移回到左侧

2018年第一发 希望新的一年和大家一下学习更多知识 JS&#xff1a;//把数据左边挪到了右边&#xff0c;再从右边移动回来function moveOption(e1, e2){ $("#" e1 " option").each(function(){ if($(this).is(:selected)){ var oVal…

企业Java中事务隔离级别的初学者指南

介绍 基于ACID事务属性的关系数据库强一致性模型。 在本文中&#xff0c;我们将阐明对资源本地事务和JTA事务使用不同的事务隔离级别和各种配置模式的背后原因。 隔离和一致性 在关系数据库系统中&#xff0c;原子性和持久性是严格的属性&#xff0c;而一致性和隔离性或多或少…

点击左侧跳到右侧

效果图 JS部分 function moveOption(e1, e2){ try{ for(var i0;i<e1.options.length;i ){ if(e1.options[i].selected){ var e e1.options[i]; e2.options.add(new Option(e.text, e.value)); e1.remove(i); iii-1 } } } catch(e){}} HTML以及CSS部分 <for…

好的微服务架构=企业服务总线(ESB)的灭亡?

这些天&#xff0c;似乎每个人都在谈论微服务。 您可以在数百篇文章和博客文章中读到很多有关该主题的文章&#xff0c;但是我建议的出发点是Martin Fowler的这篇文章 &#xff0c; 该文章引发了有关这种新建筑概念的大量讨论。 本文介绍了创建良好的微服务体系结构所面临的挑战…

移动端UC /QQ 浏览器的部分私有Meta 属性

<meta name"format-detection" content "telephoneno"/> 格式检测 禁止识别我们页面中的数字&#xff0c;防止把其当作电话识别&#xff0c;emailno 禁止识别邮箱 IOS设备对META的私有属性 <meta name"apple-mobile-web-app-capable&qu…

IDC关于使用JBoss Fuse的商业价值的报告(与Apache Camel一起使用)

这只是一篇博客文章&#xff0c;具有更多的商业性质&#xff0c;但是您不能一无所有。 实际上&#xff0c;这也是使Apache Camel保持活力并保持良好状态的原因&#xff0c;这还归功于其商业上的成功。 希望从JBoss Fuse之类的产品中寻找有关在商业上使用Apache Camel的附加值的…

书评:精通Lambda:多核世界中的Java编程

从版本8开始&#xff0c;λ编程&#xff08;lambda编程&#xff09;终于在Java世界中引入。此功能将在很大程度上改变Java开发人员的编程方式以及针对样板代码的新“武器”。 Java 8通过引入新的Stream API&#xff0c;大部分已将函数式编程应用在Collections API中。 此外&…

js框架

PS&#xff1a;https://www.cnblogs.com/zx0303/p/js-liuxingkuangjia.html 下边这张表简述了js目前的流行框架的优点: AngularJ.js 由google开发&#xff0c;2009年首次发布 很流行的前端框架使用Angular.js创建第一个UI&#xff0c;成本很…

Spring-Quartz (一)

摘自&#xff1a; http://www.blogjava.net/Jay2009/archive/2009/03/25/259176.htmlSpring为创建Quartz的Scheduler、Trigger和JobDetail提供了便利的FactoryBean类&#xff0c;以便能够在Spring 容器中享受注入的好处。此外Spring还提供了一些便利工具类直接将Spring中的Bean…

如何在Java Reflection中的类下获取所有方法信息?

本文以我以前的文章为基础 。 在本文中&#xff0c;我们将看到如何使用Java Reflection检索类相关信息。 我们将重点介绍方法名称。 注意&#xff1a;我将创建一个单独的反射器实用程序类&#xff0c;在该类中&#xff0c;我们在其构造函数中输入一个目标类&#xff0c;然后使…

在Java EE 7上骑骆驼–带有Swagger文档的REST服务

骆驼开箱即用。 Swagger集成就是其中之一。 不幸的是&#xff0c;大多数已经存在的功能都严重依赖于Spring。 但这并不能阻止我们在普通的Java EE 7应用程序中使用它们&#xff0c;因为有时它只是服务器的轻量级变体。 但我不想再对此进行讨论。 相反&#xff0c;我认为在所有情…

怎么隐藏滚动条又能滚动

1 <!DOCTYPE html>2 <html lang"en">3 <head>4 <meta charset"UTF-8">5 <title>滚动条隐藏</title>6 <style>7 body, ul, li {8 margin: 0;9 padding: 0; 10 …