精华内容
下载资源
问答
  • 引用类型保存在堆吗
    千次阅读
    2020-07-02 23:32:08

    变量位于方法中

    如果是基本数据类型,放置在栈中,如果是引用类型,引用存在在栈中,new出的对象存储在堆中

    变量位于类中(作为成员变量)

    1.常量:如果是字符串的,则存放在堆中的字符串常量池,如果是其他类型,则存放在元空间中即本地内存中
    2.static 变量 存放在Class对象的末尾,即在堆中
    3.其他变量 存储在堆中,无论是基本数据类型还是引用类型,都作为new出的对象的属性一起存储在堆中

    另外

    另外对于方法区:1.7之前是使用永久代实现的
    1.8之后使用元空间将其分为两部分:字符串常量池和静态变量放入堆内存, 方法区(包括类型信息,运行时常量池等)放入元空间(本地内存实现的)
    由于1.8后元空间使用本地内存实现,不会出现OOM错误了

    字符串常量池是存放在堆中,运行时常量池是存放在元空间中

    还有访问方法区的外部接口Class对象是位于堆的

    更多相关内容
  • 关于 “引用类型保存在堆上,值类型保存栈上”是不准确的 关于 堆栈 早期的理解是 内存的两块区域。 呢 速度快 但是 比较小。二栈呢 速度稍慢,但是空间比较大。 早期 关于 说道 值类型 和 引用类型的时候...

    关于 “引用类型保存在堆上,值类型保存在栈上”是不准确的

        关于 堆栈 早期的理解是 内存的两块区域。呢 速度快 但是 比较小。呢 速度稍慢,但是空间比较大。

      栈(Stack)

    • 栈是一种只能先进后出的内存结构。
    • 栈只能在一端对数据进行操作,也就是栈顶端进行操作。
    • 栈也是一种内存自我管理的结构,压栈自动分配内存,出栈自动清空所占内存
    • 栈中的内存不能动态请求,只能为大小确定的数据分配内存,灵活性不高,但是栈的执行效率很高
    • 栈的可用空间并不大,所以我们在操作分配到栈上的数据时要注意数据的大小带来的影响

      堆(Heap)

    • 相比栈只能在一端操作,堆中的数据可以随意存取。
    • 能存储大量数据,而且堆能够动态分配存储空间
    • 但堆的结构使得堆的执行效率不如栈高,而且不能自动回收使用过的对象

          在早期 关于 说道 值类型 和 引用类型的时候 经常说 :值类型一般是在 里面,而引用类型则在 里面存放是的引用的地址,而真是的值 是在 里面!。 当时想着想着 又有哪里不对。 应为当类里面包含 值类型的时候 那这个类的实例 又该在哪里呢? 后来随着学习的深入 。发现这样的说法是不完全正确的!

    那么变量的值在内存空间 究竟是如何分配的呢?

    通常来讲 变量的值分配 与其声明该变量的位置有关。 局部变量的值 总是在 栈上的。 实例变量的值则和实例本身一起储存在实例储存的地方。 引用类型实例和静态总是储存在上的。

            之所以说 值类型的实例一般分配在上而非 全部分配在上的原因是由一下几种情况, 值类型也有可能分配在上。

            这些特殊的情况包括数数组的元素、引用类型中的值类型字段、法代器块中的局部变量、闭包情况下匿名函数( Lamda )中的局部变量。这是由于在这几种情况下的值类型实例如果分配在 线程栈上,有可能会出现线程技中的方法己经调用结束,但是还会访问这些值的情况。也就是说如果分配在 线程栈上,有可能会随着被调用方法的返回而被清除掉。因此它们也被分配在了托管堆上,以满足在方法返回之后还能够被访问的要求。所以单纯地说“引用类型保存在托管堆上,值类型保存在线程栈上”是不准确的。将这句话一分为二看待,引用类型的确总是分配在托管堆上, 但是值类型并非总是分配在线程栈上有可能分配在堆

           那么在C#语言中,到底哪些类型可以归为是引用类型,又有哪些类型应该被归为值类型呢?根据ECMA 的C#语言规范CECMA”334 规范)或者微软官方的C#语言规范,任何被称为“类”的类型都是引用类型。并且通常使用以下3 个关键字来声明一个自己定义的引用类型。

    • Class"
    • Interface
    • Delegate
    当然,在C#中也有一些内建的引用类型。
    • Dynamico
    • Objecto
    • string 。

    在C#中,继承自System.ValueType的类型被称为值类型,主要有以下几种(CLR2.0中支持类型有增加):
        * bool
        * byte
        * char
        * decimal
        * double
        * enum
        * float
        * int
        * long
        * sbyte
        * short
        * struct
        * uint
        * ulong
        * ushort

     

    总结:

    值类型和引用类型在栈和堆中的分配

    1.创建引用类型时,runtime会为其分配两个空间,一块空间分配在堆上,存储引用类型本身的数据,另一个块空间分配在栈上,存储对堆上数据的引用,实际上存储的堆上的内存地址,也就是指针。

    2.创建值类型时, runtime会为其分配一个空间,这个空间分配在变量创建的地方,如:

    • 如果值类型是在方法内部创建,则跟随方法入栈,分配到栈上存储。
    • 如果值类型是引用类型的成员变量,则跟随引用类型,存储在堆上。(对象的成员变量)
    展开全文
  • 要彻底搞明白那一概念及其它们之间的关系似乎并不是一件容易的事,这是因为大部分C#程序员并不了解托管(简称“”)和线程栈(简称“栈”),或者知道它们,但了解得并不深入,只知道:引用类型保存在托管里...
  • C#引用类型和值类型在堆、栈中的存储

    千次阅读 多人点赞 2020-10-12 16:14:10
    一个数据项需要多大的内存、存储什么地方、以及如何存储都依赖于该数据项的类型。 运行中的程序使用两个内存区域来存储数据:栈和。 1、栈 栈是一个内存数组,是一个LIFO(last-in first-out,后进先出)的...

    一、栈和堆是什么

    程序运行时,它的数据必须存储在内存中。一个数据项需要多大的内存、存储在什么地方、以及如何存储都依赖于该数据项的类型。

    运行中的程序使用两个内存区域来存储数据:栈和堆。

    1、栈

    栈是一个内存数组,是一个LIFO(last-in first-out,后进先出)的数据结构。栈存储几种类型的数据:某些类型变量的值、程序当前的执行环境、传递给方法的参数。

    栈的特点:(1)数据只能从栈的顶端插入和删除。(2)把数据放到栈顶称为入栈。(3)从栈顶删除数据称为出栈。

    2、堆

    堆是一块内存区域,在堆里可以分配大块的内存用于存储某种类型的数据对象。与栈不同,堆里的内存能够以任意顺序存入和移除。下图展示了一个在堆里放了4项数据的程序。

    虽然程序可以在堆里保存数据,但并不能显式地删除它们。CLR的自动垃圾收集器在判断出程序的代码将不会再访问某数据项时,会自动清除无主的堆对象。下图阐明了垃圾收集过程。

    二、值类型和引用类型

    C#中的值类型和引用类型大致如下图所示

    程序的数据项的类型定义了存储数据需要的内存大小以及组成该类型的数据成员。类型还决定了对象在内存中的存储位置——栈或堆。

    值类型与引用类型的存储方式:

    值类型:值类型只需要一段单独的内存,用于存储实际的数据。

    引用类型:引用类型需要两段内存,第一段存储实际的数据,它总是位于堆中。第二段是一个引用,指向数据在堆中的存放位置。


    问题:如下代码所示,我们都说值类型存在于栈中,引用类型的实际数据在栈中,引用存在堆中。那么下面的代码,当实例化 Student stu=new Student()时,那么Age属于值类型会存在于栈中吗?StudentAddress属于引用类型,会在栈和堆之间分成两半吗?答案是否定的。

    public class Student
    { 
        public int Age { get; set; }
        public string Name { get; set; }
        public Address StudentAddress { get; set; }
    }
    public class Address
    {
    
       public string address { get; set; }
    }

    请记住,对于一个引用类型,其实例的数据部分始终存放在堆里。既然两个成员都是对象数据的一部分,那么它们都会被存放在堆里,无论它们是值类型还是引用类型。如下图所示:

    尽管成员Age是值类型,但它也是new Student()实例数据的一部分,因此和对象的数据一起被存放在堆里。

    成员StudentAddress是引用类型,所以它的数据部分会始终存放在堆里,正如图中“数据”框所示。不同的是,它的引用部分也被存放在堆里,封装在new Student()对象的数据部分中。

    说明:对于引用类型的任何对象,它所有的数据成员都存放在堆里,无论它们是值类型还是引用类型。

    三、申明变量时,内存是如何变化的?

    当你在一个.NET应用程序中定义一个变量时,在RAM中会为其分配一些内存块。这块内存有三样东西:变量的名称、变量的数据类型以及变量的值。

    在.NET中有两种可分配的内存:栈和堆。你的变量究竟会被分配到哪种类型的内存取决于数据类型。在接下来的几个部分中,详细地说明这两种类型的存储。

    Line 1:当这一行被执行后,编译器会在栈上分配一小块内存。栈会在负责跟踪你的应用程序中是否有运行内存需要。

    .Net(C#)编程语言中的栈与堆

    Line 2:现在将会执行第二步。栈会将此处的一小块内存分配叠加在刚刚第一步的内存分配的顶部。你可以认为栈就是一个一个叠加起来的房间或盒子。在栈中,数据的分配和解除都会通过LIFO (Last In First Out)即先进后出的逻辑规则进行。换句话说,也就是最先进入栈中的数据项有可能最后才会出栈。

    .Net(C#)编程语言中的栈与堆

    Line 3:在第三行中,我们创建了一个对象。当这一行被执行后,.NET会在栈中创建一个指针,而实际的对象将会存储到一个叫做“堆”的内存区域中。“堆”不会监测运行内存,它只是能够被随时访问到的一堆对象而已。不同于栈,堆用于动态内存的分配。

    需要注意的重点是对象的引用指针是分配在栈上的。 例如:声明语句 Class1 cls1; 其实并没有为Class1的实例分配内存,它只是在栈上为变量cls1创建了一个引用指针(并且将其默认值为null)。只有当其遇到new关键字时,它才会在堆上为对象分配内存。

    .Net(C#)编程语言中的栈与堆

    离开这个Method1方法时:现在执行的控制语句开始离开方法体,这时所有在栈上为变量所分配的内存空间都会被清除。换句话说,在上面的示例中所有与int类型相关的变量将会按照“LIFO”后进先出的方式从栈中一个一个地出栈。

    注意:这时它并不会释放堆中的内存块,堆中的内存块将会由垃圾回收器稍候进行清理。

    .Net(C#)编程语言中的栈与堆

    四、总结

    Heap space 堆空间: 所有存活的对象在此分配.

    Stack space 栈空间: 方法调用时保存变量对象的引用或变量实例.

    在C#中只要是成员变量,一旦它所在类被实例化后,都是作为一个整体放在堆内存的,不管它是值类型还是引用类型。局部变量才是放在栈内存的。而类的方法是所有的对象共享的,方法是存在方法区的,只用当调用的时候才会被压栈,不用的时候是占内存的。

    简单来说,值类型和引用类型变量本身在栈中分配内存,引用类型的实例在堆中分配内存。(要注意的是,一定要理解清楚引用类型变量本身和引用类型的实例的区别,引用类型变量好比一个指针,它所指向的内容即引用类型的实例)。有时候又会看到一些说法,值类型在其所定义的位置分配内存,这让人感到很混乱却也不得不在意,下面简单捋一下。

    如下面代码:

    public class TestClass 
    {
          int a = 0;
    }
     
    public void Function()
    {
         int b = 0;
         TestClass class1 = new TestClass();
    }

    方法Function中定义的值类型(int b)在栈中分配,引用类型(类class1)以一个类似于指针的形式也存储于栈中,而类的实例对象即代码中class1所引用的实际数据(整型a)是在堆上面分配的。这就可以理解,为什么有的地方会说“值类型在其所定义的地方分配”,因为上述代码中的值类型a由于定义在类中,作为类的一个成员,在类实例化时是被分配到堆中的。

    因此,更进一步地,可以理解为:值类型作为一个方法中的局部变量时,是在栈中分配的,而当作为类的成员变量时,是分配在堆中的

    在上面代码的TestClass中添加一个Run函数:

    public class TestClass 
    {
        int a = 0;
        public void Run()
        {
            int c = 0;
        }
    }
     
    public void Function()
    {
        int b = 0;
        TestClass class1 = new TestClass();
        class1.Run();
    }

    此时,整型a是在堆中分配内存,而Run函数中的整型c在栈中分配内存。

    因此关于值类型、引用类型各自在堆或栈上的内存分配可以总结为:

    值类型作为方法中的局部变量时,在栈中分配,而作为类的成员变量时,在堆中分配;引用类型变量在栈中分配,引用类型的实例在堆中分配

     

    展开全文
  • 引用类型值:指的是那些保存在堆内存中的对象,意思是,变量中保存的实际上只是一个指针,这个指针指向内存中的另一个位置,由该位置保存对象; 两种访问方式: 基本类型值:按值访问,操作的是他们实际保存的值; ...
  • 引用类型值:按引用访问,当查询时,我们需要先从栈中读取内存地址,然后再顺藤摸瓜地找到保存在堆内存中的值; 下面就分别介绍一下javascript的这两种数据类型。 一.基本数据类型: javascript中存在着六种基本...
  • 2、引用类型分配托管上,引用类型的变量通常包含一个指向实例的指针,变量通过该指针来引用实例。3、值类型继承自ValueType(注意:而System.ValueType又继承自System.Object);而引用类型继承自System.Object...
  • 有基本类型和引用类型,他们是区别是一个有固定空间存在于栈内存中,一个没有固定空间保存在堆内存中并且栈内存中保存了一个指向实现位置的指针。 市面上很多书都有不小的篇幅讲。这篇文章会讲几个方面,这些...
  • java中的基本数据类型可以栈中直接分配内存、除了基本数据类型外,还有例如 String 、Integer、用户自定义的引用数据类型,他们的对象的引用在栈中,对象实际存放在堆中,实际上是将对象的地址赋值给了过去...........

    1.基本数据类型

    java中的基本数据类型可以在栈中直接分配内存,它有以下八种:

    boolean,byte,char,short,int,long,float,double


    2.引用数据类型

    除了基本数据类型外,还有例如 StringInteger用户自定义的引用数据类型(使用关键字new创建的类型 ),他们的对象的引用在栈中,对象实际存放在堆中,实际上是将对象的地址赋值了过去

    不清楚的可以看下面的例子:

    **//定义两个基本数据类型**
    int i=10;
    double j=2.0;
    **//定义三个引用数据类型**
    int[] arr={100,200,300};//Java中将数组作为一种特殊的引用类型处理
    String str1="hello";
    String str2="java";
    

    存储情况如下:

    在这里插入图片描述

    图中的001、002、003是地址,String类型是字符串类型,它里面是字符串常量,存储在常量池中。

    栈的小知识点:
    1. 局部变量 的空间是在栈上分配的;
    2.栈上内存的分配规则是先定义的变量分配在更高的地址处。

    展开全文
  • 当我们把变量赋值给一个变量时,解析器首先要确认的就是这个值是基本类型值还是引用类型值 基本数据类型:数字(Number)、字符串(String)、布尔(Boolean)、空(Null)、未定义(Undefined) 引用数据类型:也就是...
  • 方法中声明:值类型数据存储栈中,引用类型的引用存储栈中,数据存储在堆中;方法栈中执行,方法内声明的变量都是栈中存储,方法执行完毕后将这些数据清除,方法内部的值类型将直接被
  • JAVA中的引用四种引用类型

    千次阅读 2020-08-30 10:09:38
    关于值类型和引用类型的话题,C++、JAVA、python、go、C#等等高级语言都有相关的概念,只要理解了其底层工作原理,可以说即使是不同的语言,面试学习工作实践中都可以信手拈来(不要太纠集语言),当然此处我选择了...
  • 值类型和引用类型 是什么 区别

    千次阅读 2021-08-15 15:57:57
     值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储数据中。  值类型(value type):byte,short,int,long,float,double,decimal,char,bool 和struct统称为值类型。值类型...
  • js基本类型与引用类型

    千次阅读 多人点赞 2018-06-15 11:21:22
    1.基本类型:Underfined ,...而对象,以及被装箱的数据放在中栈内存中存放地址指向内存中的对象基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象基本类型内存中分别占有固...
  • C#引用类型

    千次阅读 2021-07-06 17:14:56
    概念:引用类型存储对其值的引用。部署:托管上部署了所有引用类型引用类型:基类为Objcet ... 引用类型的对象总是进程中分配(动态分配)。 引用类型在栈内的空间大小相同; ...
  • 基本数据类型是放在栈中还是放在中,这取决于基本类型在何处声明,下面对数据类型在内存中的存储问题来解释一下: 一:方法中声明的变量,即该变量是局部变量,每当程序调用方法时,系统都会为该方法建立一个...
  • Java中基本数据类型引用数据类型的存放位置
  • c#中提供的数据类型有两类,值类型...引用类型在堆中分配存储单元。 其中对于栈和的理解参考知乎。 链接:https://www.zhihu.com/question/19729973/answer/13037929 这里的 应该指的是heap而非数据结构中的
  • 引用类型值指的是那些保存在堆内存中的对象,所以引用类型的值保存的是一个指针,这个指针指向存储在堆中的一个对象。除了上面的 6 种基本数据类型外,剩下的就是引用类型了,统称为 Object 类型。细分的话,有:...
  •   1.基本数据类型: boolean,char,byte,short,int,long,float,double  ...2.引用数据类型: 除了基本数据类型以外其他所有的数据类型,比如 Integer 、String、用户自定义的类等等  ...
  • 什么是值类型,什么是引用类型

    千次阅读 2021-05-12 20:01:43
    部署:托管上部署了所有引用类型引用类型:基类为Objcet 值类型:均隐式派生自System.ValueType: 值类型: byte,short,int,long,float,double,decimal,char,bool 和 struct ...
  • 基本数据类型引用数据类型

    千次阅读 2022-04-14 13:21:42
    1、栈(stack)和(heap)  stack为自动分配的内存空间,它由系统自动释放;而heap则是动态分配的内存,大小也不一定会自动释放 2、数据类型  JS分两种数据类型:  js的六或七大数据类型:Number, String, ...
  • C#详解值类型和引用类型区别

    万次阅读 多人点赞 2016-04-20 17:59:42
    C#中值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储数据中。 值类型(value type):byte,short,int,long,float,double,decimal,char,bool 和 struct 统称为值类型。值...
  • 一、.存储上的区别1.基本数据类型是存放栈中的简单数据段。2.引用数据类型是存放在堆内存中的对象,栈内存...2.引用类型的比较是引用的比较var a = {}var b = {}console.log(a == b) //false问:看起来明明一样为什
  • 二、基本类型变量与引用类型变量的区别 1、基本类型变量 1、概念:基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值; 2、举例 //基本类型变量 int a=10; int b=20; 2、引用...
  • (一)四种引用类型

    千次阅读 2022-02-11 10:47:35
    为什么要回收 每个Java程序中对象都会占用计算机的资源...当程序创建对象,数组等引用类型实体时,系统都会在堆内存中为之分配一块内存区,对象就保存在这块内存区,当这块内存不再被任何变量引用时,这块内存就变成垃
  • 基本数据类型引用数据类型在栈中进行分配在堆中进行分配,的读写速度远不及栈变量名指向具体的数值变量名指向存数据对象的内存地址,即变量名指向hash值变量声明之后java就会立刻分配给他内存空间它以特殊的方式...
  • 基本类型和引用类型区别

    千次阅读 2020-03-13 16:13:28
    2.引用类型包括: Function,Array,Object 基本类型和引用类型也有人叫原始类型和对象类型,拥有方法的类型和不能拥有方法的类型,可变类型和不可边类型 3.基本类型 基本类型是按值访问的,引用类型是按引用访问 ...
  • 值类型和引用类型的区别

    千次阅读 2019-04-04 11:35:15
    值类型的变量直接存储数据,而引用类型的变量持有的是数据的引用,数据存储数据中。 值类型(value type):byte、short、int、long、float、double、decimal、char、bool 、 struct、enum 统称为值类型。值类型...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 186,019
精华内容 74,407
热门标签
关键字:

引用类型保存在堆吗