精华内容
下载资源
问答
  • 栈内存和堆内存有什么区别?

    千次阅读 2019-03-22 18:17:00
    内存和堆内存有什么区别? 栈内存和堆内存是什么?有什么用? 栈内存堆内存是什么? 栈内存和堆内存都是存储数据的地方。 为什么会分栈内存和堆内存?? 因为栈内存中存储的值的大小是固定的,...

    栈内存和堆内存有什么区别?

    栈内存堆内存是什么?有什么用?

    栈内存堆内存是什么?

    栈内存堆内存都是存储数据的地方。

    为什么会分栈内存堆内存??

    因为栈内存中存储的值的大小是固定的,堆内存中存储值的大小不固定的。

    基本数据类型

    目前有5种基本数据类型:StringNumberBooleanNullnull,这5种基本数据类型传递时,是按值传递的;在分配内存时,会分配固定大小的内存空间。
    ```
    let a = 1
    let b = a

    b = 3
    
    console.log( a ) // 1

    a=1因为1是基本数据类型,所以会在栈内存中分配固定大小的空间给a
    b=a因为a是基本数据类型,所以会在栈内存中分配固定大小的空间给b,并存入值为1

    引用数据类型

    引用数据类型因为大小不固定,所以会存在堆内存中,栈内存中存的是堆内存的地址,每次读取值时,先找到栈内存中的内存地址,在通过内存地址,找到在堆内存中的对应的对象。

    栈内存和堆内存的关系图示

    980264-20190322184853956-24584650.png

    参考地址

    posted @ 2019-03-22 18:17 DaivdAndLemon 阅读(...) 评论(...) 编辑 收藏
    展开全文
  • 栈内存和堆内存Java(详细实例讲解)

    千次阅读 2019-05-02 10:29:19
    栈内存:存放基本类型的变量、对象的引用(引用变量)。(如何回收?) 在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间:当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该...

    定义

    栈内存:存放基本类型的变量、对象的引用(引用变量)。(如何回收?)

         在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间:当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

    堆内存:存放new创建的对象和数组。(GC垃圾回收)

    GC垃圾回收:https://blog.csdn.net/sinat_41144773/article/details/89420619

         在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量(引用变量),这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象。数组和对象在没有引用变量指向它的时候,才变成垃圾,不能再被使用,但是仍然占着内存,在随后的一个不确定的时间被垃圾回收器释放掉。这个也是java比较占内存的主要原因

    1、基本类型变量的引用和值都存在栈内存,“引用”指向“值”。栈内存的一个特点是数据共享,这样设计是为了减小内存消耗。i=1,i和1都在栈内存内,如果再定义一个j=1,此时将j放入栈内存,然后查找栈内存中是否有1,如果有则j指向1。如果再给j赋值2,则在栈内存中查找是否有2,如果没有就在栈内存中放一个2,然后j指向2。

    2、String通过new产生的对象,会先去常量池中查找是否已经有了”word”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”word”对象的拷贝对象。由此,String s1 = new String(“word”)会产生几个对象?如果常量池中原来没有”word”,就会产生两个对象!

    3、基本类型常量(public static final)存放在常量池中

    寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制
    栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)
    堆:存放所有new出来的对象。
    静态域:存放静态成员(static)
    常量池:存放字符串常量对象和基本类型常量(public static final)

    数据共享性:栈和常量池中的对象可以共享,堆中的对象不可以共享

    数据的生命周期:栈中的数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会消失。堆中的对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定,具有很大的灵活性。

    引用:https://blog.csdn.net/LK274857347/article/details/77512555

     

    2、“==”和equals()的区别

    "=="关系操作符的作用:

    1、"=="是关系操作符,只能比较两个操作数的值之间的关系

    2、用于比较两个基本数据类型的变量指向是否相同,String的直接引号类型是否指向同一个字符串。

          不用于比较看似相同的两个对象,对象间的比较用equals()方法

    // "=="操作符的例子
    public static void main(String[] args) {
        //基本类型数据,n1和n2在栈内存中都指向5(也在栈内存),可用==比较
        int n1 = 5;
        int n2 = 5;
        System.out.println(n1 == n2);
    
        //String引用类型,s1、s2都指向常量池中的“word”,可用==比较
        String s1 = "word";
        String s2 = "word";
        System.out.println(s1 == s2);
    
        //new对象的引用integer1和integer2在栈内存引用地址不同,在堆内存中是两个对象,不可用==比较
        Integer integer1 = new Integer(3);
        Integer integer2 = new Integer(3);
        System.out.println(integer1 == integer2);
    
        //String new的对象 在堆内存中是两个对象,比较不可用==比较
        String s3 = new String("good");
        String s4 = new String("good");
        System.out.println(s3 == s4);
    
    }
    
    //输出:
    true
    true
    false
    false
    

     

     equals()的作用:

           equals()是Object 中的方法,用于判断两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

    // equals()的例子
    public static void main(String[] args) {
    
        Integer integer3 = new Integer(3);
        Integer integer4 = new Integer(3);
        System.out.println(integer3.equals(integer4));
    
        //String new的对象 在堆内存中是两个对象,比较不可用==比较
        String s5 = new String("good");
        String s6 = new String("good");
        System.out.println(s5.equals(s6));
    
    }
    
    //输出:
    true
    true
    
    

     

    结束。

    展开全文
  • JavaScript栈内存和堆内存区别

    千次阅读 2017-12-03 16:19:10
    栈这两个字我们已经接触多很多次,那么具体是什么存在栈中... 基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象。1、基本类型 基本类型有Undefined、Null、Boolean、Number S

    和栈这两个字我们已经接触多很多次,那么具体是什么存在栈中什么存在堆中呢?就拿JavaScript中的变量来说:
    首先JavaScript中的变量分为基本类型和引用类型。
    基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象。

    1、基本类型
    基本类型有Undefined、Null、Boolean、Number 和String。这些类型在内存中分别占有固定大小的空间,他们的值保存在栈空间,我们通过按值来访问的。

    2、引用类型
    引用类型,值大小不固定,栈内存中存放地址指向堆内存中的对象。是按引用访问的。如下图所示:栈内存中存放的只是该对象的访问地址,在堆内存中为这个值分配空间。由于这种值的大小不固定,因此不能把它们保存到栈内存中。但内存地址大小的固定的,因此可以将内存地址保存在栈内存中。 这样,当查询引用类型的变量时, 先从栈中读取内存地址, 然后再通过地址找到堆中的值。对于这种,我们把它叫做按引用访问。
    这里写图片描述
    其他语言中的内存分配类似。

    为什么会有栈内存和堆内存之分?
    通常与垃圾回收机制有关。为了使程序运行时占用的内存最小。
    当一个方法执行时,每个方法都会建立自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁了。因此,所有在方法中定义的变量都是放在栈内存中的;
    当我们在程序中创建一个对象时,这个对象将被保存到运行时数据区中,以便反复利用(因为对象的创建成本通常较大),这个运行时数据区就是堆内存。堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(方法的参数传递时很常见),则这个对象依然不会被销毁,只有当一个对象没有任何引用变量引用它时,系统的垃圾回收机制才会在核实的时候回收它。

    展开全文
  • js栈内存和堆内存与垃圾回收机制

    千次阅读 2018-11-04 17:20:34
    栈内存存储基本类型的变量:如Number,String,boolen,undefined,null,以及对对象和数组变量的指针,对象是动态分配内存,数组的初始化方式分为: 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。 ...

    v8作为javascirpt引擎,对变量的存储主要有两种位置:栈存储和堆存储

    栈内存存储基本类型的变量:如Number,String,boolen,undefined,null,以及对对象和数组变量的指针,对象是动态分配内存,数组的初始化方式分为:

    动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。

    静态初始化:初始化时指定每个数据元素的初始值,由系统决定数组长度

    我们在代码声明变量并赋值时,所使用的对象就分配在堆中,如果申请的堆内存不够分配新的对象,将继续申请内存,知道堆的大小超过v8的限制。

    这里写图片描述

    var obj1={zs:'bangbang',age:'22'};

    var b =obj1;

    b.age=18

    console.log(obj.name)//18

    var c= obj.age

    c=22

    以上看出:当我们改变b的数据的时候,我们看到了obj1.name的数据也在改变,但是我们改变c的数据的时候发现,obj1.age的值没有变化,这说明了:b和obj1变量操作的是同一个对象,c和obj1完全独立的

    v8的垃圾回收机制

    在栈中变量用完之后自动释放,v8堆内存分为新生代和老生代内存

    1 新生代对象

    在分代的基础上,新生代的对象主要通过Scavenge算法进行垃圾回收,在Scavenge算法的具体实现中,主要采用Cheney算法,它将新生代内存一分为二,一个处于使用中,另一个处于闲置中,处于闲置中为to空间,当我们分配对象时,首先在from空间进行分配,当开始垃圾回收,首先会检查from空间的存活对象,这些存活对象会被复制到to空间中,而非存活的对象占用的空间将被释放,完成复制后,from空间和to空间的角色发生对换,Scavenge的缺点时只能使用堆内存的一半,但因为新生代兑现的生命周期较短,恰恰适合这个算法。

    2老生代对象

    当一个对象经过多次复制依然存活,它被认为生命周期较长的对象,这种较长生命周期的对象会被移动到老生代中,对于老生代中的对象,由于存活对象占较大比重,在采用Scavenge的方式会有两个问题:一个时存活对象较多,复制存活对象的效率将会很低;另一个问题依然时浪费一半空间的问题。为此,v8在老生代中主要采用Mark-Sweep和Mark-Compact相结合的方式进行垃圾回收。

    Mark-Sweep就是我们常说的标记清除,它分为标记和清除两个阶段,在标记阶段遍历堆的所有对象,在随呼的标记清除阶段中,只清除没有被标记的对象。Sweep最大的问题就是进行一次标记清除回收后,内存空间会出现不连续的状态,所以Mark-Compact被提出来,就是标记整理的意思,在对象被标记死亡后,在整理的过程中,将活着的一下对象往一断移动,移动完成后,直接清理掉边界的内存

    3,如何触发垃圾回收

    提到如何触发垃圾回收,第一个要介绍的是作用域,函数执行结束后,该作用域将会销毁,同时作用域中声明的局部变量分配在该作用域上,随着作用域的销毁而销毁

    1.标识符查找

    所谓的标识符可以理解为变量名,js在执行中会去查找该变量定义在哪里,也就是我们常说的词法分析,最先查找的是当前作用域,如果在当前作用域中无法找到该变量的声明,将会向上级的作用域查找,直到查到为止,一层一层查找就构成了作用链,

    2.变量的主动释放,如果变量是全局变量,由于全局作用域需要直到退出进程才能释放,将会导致引用的对象常驻老生代内存中


     

    展开全文
  • 堆内存完全由JVM负责分配释放,如果程序没有缺陷代码导致内存泄露,那么就不会遇到java.lang.OutOfMemoryError这个错误。 使用堆外内存,就是为了能直接分配释放内存,提高效率。JDK5.0之后,代码中能直接操作...
  • 为什么要有栈内存和堆内存之分

    千次阅读 2018-01-30 17:28:37
    的特点是子节点都比父节点要小,用于动态创建分配内存,创建删除节点的时间复杂度是O(logn)。创建删除的时间复杂 度是O(1),速度更快。  堆栈的出现,源于对内存的优化,你知道,java有垃圾回收,的...
  • 笔试题目:请解释一个栈内存与一个堆内存的区别,请分析下面代码运行是否有问题,如果有问题请改正。 char* GetMemory(void) {  char p[] = "Hello world";  return p; } void main(void) ...
  • 3.成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中   局部变量: 1.局部变量定义在局部范围内:如方法,函数,语句中,只在作用域有效 2.局部变量没有默认初始化值 3.局部变量...
  • Java数组 在进入讲解主题“-栈内存...针对于Java数组,Java语言把内存分为两种:-栈内存和堆内存栈内存: 在方法中定义的一些基本类型的变量和对象的引用变量都在方法的栈内存中分配,当在一段代码块中定义一个变...
  • 堆内存和栈内存的区别

    万次阅读 2019-03-14 00:03:46
    总结: 1 :为编译器自动分配和释放,如函数参数、局部变量、临时变量等等 2 堆:为成员分配和释放,由程序员自己申请、自己释放。否则发生内存泄露。...栈内存和堆内存的区别(一个笔试题的一部分)http://...
  • 基础知识篇——堆内存和栈内存

    万次阅读 多人点赞 2018-11-01 09:05:00
    数据结构中的堆和栈 是一种连续储存的数据结构,具有先进后出的性质。 通常的操作有入栈(压栈),出栈栈顶元素。想要读取中的某个元素,就是将其之间的所有元素出栈才能完成。 是一种非连续的树形储存...
  • 栈内存/堆内存特点

    千次阅读 2017-08-18 09:06:37
    栈内存的特点:栈内存存储的都是局部变量,变量一旦出了自己的作用域,那么马上会从内存小时,释放内存空间。 凡是以new关键字创建的对象,jvm都会在堆内存开辟一个新的空间,创建一个新的对象 堆内存特点:...
  • javascript:栈内存堆内存浅谈

    千次阅读 2017-08-03 23:23:19
    javascript的栈内存堆内存
  • JS中对象分为基本类型和引用类型,基本类型存放在栈内存,引用类型存放在堆内存。请问栈内存和堆内存的区别是什么,为什么这两种对象分别存储在不同的内存中?
  • 堆内存和栈内存详解

    万次阅读 多人点赞 2014-10-04 17:50:01
    :顺序随意 :先进后出 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。...
  • JAVA内存管理之堆内存和栈内存

    千次阅读 2013-06-18 19:11:31
    我们常常做的是将Java内存区域简单的划分为两种:堆内存和栈内存。这种划分比较粗粒度,这种划分是着眼于我们最关注的、与对象内存分配密切相关的两类内存域。其中栈内存指的是虚拟机栈,堆内存指的是java堆。 1....
  • C# 堆内存 vs 栈内存 (1)

    千次阅读 2018-05-06 22:50:52
    概述 在.Net当中,有Clr帮我们进行内存管理和垃圾回收,但这并不意味着我们不需要关心这些机制。...当程序运行时,.Net会在两个地方存储程序信息,堆内存和栈内存,它们只是对内存的逻辑分段,在程序...
  • java堆内存和栈内存的区别

    千次阅读 2015-11-03 14:05:48
    一段时间之前,我写了两篇文章文章分别是Java的垃圾回收和Java的值传递,从那之后我收到了很多要求解释Java堆内存和栈内存的邮件,并且要求解释他们的异同点。在Java中你会看到很多堆和栈内存的引用,JavaEE书和文章...
  • 栈内存堆内存的区别

    千次阅读 2019-03-06 20:48:45
    ——自动,——手动
  • Java 堆内存和栈内存

    千次阅读 2016-03-23 19:59:12
    对Java中堆内存和栈内存的简单理解
  • 关于堆内存和栈内存释放

    千次阅读 2019-06-28 20:47:18
    js 中的内存分为堆内存和 栈内存 堆内存:存储引用类型值 (对象:键值对 函数:代码字符串) 栈内存: 提供JS代码执行的环境和存储基本类型值 堆内存释放 让所有引用堆内存空间地址的变量赋值给Null 即可 (没有...
  • JavaScript变量——栈内存or堆内存

    万次阅读 多人点赞 2014-12-13 14:16:14
    栈这两个字我们已经接触多很多次,那么具体是什么存在栈中什么存在堆中呢?... 基本类型就是保存在栈内存中的简单数据段,而引用类型指的是那些保存在堆内存中的对象。   1、基本类型    基本类型有Undef
  • 在函数中定义的一些基本类型的变量对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存...
  • 栈内存的一个特点是数据共享,堆内存没有数据共享的特点。
  • C++内存分区以及堆内存和栈内存

    千次阅读 2016-03-08 16:43:32
    一、文章来由做项目用了很多堆内存指针,我一直苦苦思考的问题就是这些堆内存是否可以完全由空间分配的方式解决,这个问题纠结了好久,于是下决心解决它。二、程序内存分配区(stack)— 由编译器自动分配释放...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 321,494
精华内容 128,597
关键字:

栈内存和堆内存