精华内容
下载资源
问答
  • Java 堆和栈区别

    万次阅读 多人点赞 2016-08-10 12:59:31
    1、概述在Java中,内存分为两种,一种是内存,另一种就是内存。2、内存1.什么是内存? 内存是是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会...

    1、概述

    在Java中,内存分为两种,一种是栈内存,另一种就是堆内存。

    2、堆内存

    1.什么是堆内存?
    

    堆内存是是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放。

    2.堆内存的特点是什么?
    

    第一点:堆其实可以类似的看做是管道,或者说是平时去排队买票的的情况差不多,所以堆内存的特点就是:先进先出,后进后出,也就是你先排队,好,你先买票。

    第二点:堆可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,但缺点是,由于要在运行时动态分配内存,存取速度较慢。

    3.new对象在堆中如何分配?
    

    由Java虚拟机的自动垃圾回收器来管理

    3、栈内存

    1.什么是栈内存
    

    栈内存是Java的另一种内存,主要是用来执行程序用的,比如:基本类型的变量和对象的引用变量

    2.栈内存的特点
    

    第一点:栈内存就好像一个矿泉水瓶,像里面放入东西,那么先放入的沉入底部,所以它的特点是:先进后出,后进先出

    第二点:存取速度比堆要快,仅次于寄存器,栈数据可以共享,但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性

    3.栈内存分配机制
    

    栈内存可以称为一级缓存,由垃圾回收器自动回收

    4.数据共享
    

    例子:
    int a = 3;
    int b = 3;

    第一步处理:
    

    1.编译器先处理int a = 3;
    2.创建变量a的引用
    3.在栈中查找是否有3这个值
    4.没有找到,将3存放,a指向3

    第二步处理:
    

    1.处理b=3
    2.创建变量b的引用
    3.找到,直接赋值

    第三步改变:
    

    接下来
    a = 4;
    同上方法
    a的值改变,a指向4,b的值是不会发生改变的

    PS:如果是两个对象的话,那就不一样了,对象指向的是同一个引用,一个发生改变,另一个也会发生改变

    4、栈和堆的区别

    JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。

    差异
    

    1.堆内存用来存放由new创建的对象和数组。
    2.栈内存用来存放方法或者局部变量等
    3.堆是先进先出,后进后出
    4.栈是后进先出,先进后出

    相同
    

    1.都是属于Java内存的一种
    2.系统都会自动去回收它,但是对于堆内存一般开发人员会自动回收它

    展开全文
  • Java堆和栈区别

    2010-11-19 14:41:33
    Java堆和栈区别Java堆和栈区别Java堆和栈区别Java堆和栈区别Java堆和栈区别Java堆和栈区别
  • Java面试--堆和栈的概念和区别

    万次阅读 多人点赞 2018-09-19 20:30:33
    堆和栈的概念和区别【转载自博客】 在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分:  Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行...

    堆和栈的概念和区别【转载自博客

    在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分:

          Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区域,启动时在自己的内存区域中进行更细致的划分,因为虚拟机中每一片内存处理的方式都不同,所以要单独进行管理。

          JVM内存的划分有五片:

           1.   寄存器;

           2.   本地方法区;

           3.   方法区;

           4.   栈内存;

           5.   堆内存。

           我们重点来说一下堆和栈:

           栈内存:栈内存首先是一片内存区域,存储的都是局部变量,凡是定义在方法中的都是局部变量(方法外的是全局变量),for循环内部定义的也是局部变量,是先加载函数才能进行局部变量的定义,所以方法先进栈,然后再定义变量,变量有自己的作用域,一旦离开作用域,变量就会被释放。栈内存的更新速度很快,因为局部变量的生命周期都很短。

           堆内存:存储的是数组和对象(其实数组就是对象),凡是new建立的都是在堆中,堆中存放的都是实体(对象),实体用于封装数据,而且是封装多个(实体的多个属性),如果一个数据消失,这个实体也没有消失,还可以用,所以堆是不会随时释放的,但是栈不一样,栈里存放的都是单个变量,变量被释放了,那就没有了。堆里的实体虽然不会被释放,但是会被当成垃圾,Java有垃圾回收机制不定时的收取。

          下面我们通过一个图例详细讲一下堆和栈:

          比如主函数里的语句   int [] arr=new int [3];在内存中是怎么被定义的:

          主函数先进栈,在栈中定义一个变量arr,接下来为arr赋值,但是右边不是一个具体值,是一个实体。实体创建在堆里,在堆里首先通过new关键字开辟一个空间,内存在存储数据的时候都是通过地址来体现的,地址是一块连续的二进制,然后给这个实体分配一个内存地址。数组都是有一个索引,数组这个实体在堆内存中产生之后每一个空间都会进行默认的初始化(这是堆内存的特点,未初始化的数据是不能用的,但在堆里是可以用的,因为初始化过了,但是在栈里没有),不同的类型初始化的值不一样。所以堆和栈里就创建了变量和实体:

                                                      

         那么堆和栈是怎么联系起来的呢?

         我们刚刚说过给堆分配了一个地址,把堆的地址赋给arr,arr就通过地址指向了数组。所以arr想操纵数组时,就通过地址,而不是直接把实体都赋给它。这种我们不再叫他基本数据类型,而叫引用数据类型。称为arr引用了堆内存当中的实体。(可以理解为c或c++的指针,Java成长自c++和c++很像,优化了c++)                                                                

         

                  如果当int [] arr=null;

                  arr不做任何指向,null的作用就是取消引用数据类型的指向。

                  当一个实体,没有引用数据类型指向的时候,它在堆内存中不会被释放,而被当做一个垃圾,在不定时的时间内自动回收,因为Java有一个自动回收机制,(而c++没有,需要程序员手动回收,如果不回收就越堆越多,直到撑满内存溢出,所以Java在内存管理上优于c++)。自动回收机制(程序)自动监测堆里是否有垃圾,如果有,就会自动的做垃圾回收的动作,但是什么时候收不一定。

                 所以堆与栈的区别很明显:

                1.栈内存存储的是局部变量而堆内存存储的是实体;

                2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

                3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

    展开全文
  • Java的堆是一个运行时数据区,类的对象从...栈中主要存放一些基本数据类型的变量(byte,short,int,long,float,double,boolean,char)和对象的引用,这篇文章给大家详细介绍java 堆和栈的概念和区别,一起看看吧
  • 偶然看到一道面试题,Java在实例化一个类的时候,数据在堆和栈中是如何存放的?  public class A{  public int i=1;  public static A a1 = new A();  public static void mian(String args[]){  int c = ...
  • Java堆和栈区别

    千次阅读 2019-01-07 13:14:36
    (Heap)和栈(Stack)是平时编程接触比较多的两个计算机语言,网上相关介绍内容已经有很多了,作者在此记录下我的理解,也供以后温故之用。 1. 栈(Stack)和(Heap)的定义 栈:空间小,速度快,放对象的...

    堆(Heap)和栈(Stack)是平时编程接触比较多的两个计算机语言,网上相关介绍内容已经有很多了,作者在此记录下我的理解,也供以后温故之用。

    1. 栈(Stack)和堆(Heap)的定义

    栈:空间小,速度快,放对象的引用;一个先进后出(Last In First Out )的数据结构,通常用于保存基本类型字面量、对象的引用变量、自定义变量。

    堆:空间大,可动态申请,放所有创建的对象;一个可动态申请的内存空间,通常用于保存关键字new 构造出来的对象,malloc(C/C++)语句所产生的内存空间、数组

    以上定义回答了堆(Heap)和栈(Stack)是什么,以及它们主要用来干什么(保存什么的),有一个共同点:都是java运行时内存中(RAM)存放数据的地方。

    2. 各自存放数据的特点

    栈:当java中定义一个变量时,就会在栈内存中分配,当运行到超过变量的作用域时,java会自动释放掉该变量所分配的内存空间,该内存空间会另作他用(生命周期)。

    堆:在堆中分配的内存,不同语言处理方式不完全相同,java中由虚拟机的自动回收器来管理,当没有指向该对象的引用时,垃圾回收机制在适当的时候回收掉。

    当对象被创建放入堆时,此时有一个栈中的特殊引用变量指向该对象在内存中的首地址,而这个特殊变量被称为引用变量,在程序中要访问该对象时通过该引用变量进行访问!

     

    以上是我的理解,一点一点深入学习中,欢迎指正!

    展开全文
  • 主要介绍了java堆和栈区别,分析了Java堆和栈的原理及使用时的注意事项,需要的朋友可以参考下
  • 彻底理解Java堆和栈区别

    千次阅读 多人点赞 2018-05-08 14:30:13
    1、概述在Java中,内存分为两部分,一种是内存,另一种就是内存。2、Java中变量在内存中的分配1). 类变量(static修饰的变量):在程序加载时系统就为它在中开辟了内存,中的内存地址存放于以便高速访问。...

    1、概述

    在Java中,内存分为两部分,一种是堆内存,另一种就是栈内存。

    2、Java中变量在内存中的分配

    1). 类变量(static修饰的变量):在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便高速访问。静态变量的生命周期—一直持续到整个“系统”关闭
    2). 实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量(比如说类实例),然后根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的“物理位置”。实例变量的生命周期–当实例变量的引用丢失后,将被GC(垃圾回收器)列如可回收“名单”中,但并不马上就释放堆中内存
    3). 局部变量:局部变量,由声明在某方法,或某代码段里(比如for循环),执行到它的时候在堆中开辟内存,当局变量一旦脱离作用域,内存立即释放

    3、堆内存

    1. 什么是堆内存?
      堆内存是java内存中的一种,它的作用是用于存储java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在堆内存中开辟一段空间给它,用于存放。
    2. 堆内存的特点是什么?
      第一点:堆其实可以类似的看做是管道,或者说是平时去排队买票的情况差不多,所以堆内存的特点就是:先进先出,后进后出,也就是你先排队好,你先买票。
      第二点:堆可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,但缺点是,由于要在运行时动态分配内存,存取速度较慢。
    3. new对象在堆中如何分配?
      由Java虚拟机的自动垃圾回收器来管理。

    4、 栈内存

    1. 什么是栈内存
      栈内存是Java的另一种内存,主要是用来执行程序用的,比如:基本类型的变量和对象的引用变量
    2. 栈内存的特点
      第一点:栈内存就好像一个矿泉水瓶,往里面放入东西,那马先放入的沉入底部,所以它的特点是:先进后出,后进先出
      第二点:存取速度比堆要快,仅次于寄存器,栈数据可以共享,但缺点是,存在栈中的数据大小与生存必须是确定的,缺乏灵活性
    3. 栈内存分配机制
      栈内存可以称为一级缓存,由垃圾回收器自动回收
    4. 数据共享
      例子:
      int a = 3;
      int b = 3;

    第一步处理:

    1). 编译器先处理int a=3;
    2). 创建变量a的引用
    3). 在栈中查找是否存在3这个值
    4). 没有找到,将3存在,a指向3

    第二步处理:

    1). 处理b=3
    2). 创建变量b的引用
    3). 找到,直接赋值

    第三步改变:

    接下来
    a=4;
    同上方法
    a的值改变,a指向4,b的值是不会发生改变的

    PS:如果是两个对象的话,那就不一样了,对象指向的是同一个引用,一个发生改变,另一个也会发生改变

    5、 栈和堆的区别

    JVM是基于堆栈的虚拟机,JVM为新创建的线程都分配一个堆栈,也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。

    差异:

    1). 堆内存用来存放由new创建的对象和数组
    2). 栈内存用来存放方法或者局部变量等
    3). 堆是先进先出,后进后出
    4). 栈是先进后出,后进先出
    5). 共享性的不同:

    栈内存是线程私有的
    堆内存是所有线程共有的

    6). 异常错误不同:

    如果栈内存或者堆内存不足都会抛出异常。
    栈空间不足:java.lang.StackOverFlowError。
    堆空间不足:java.lang.OutOfMemoryError。

    7). 空间大小
    栈的空间大小远远小于堆的。

    相同

    1). 都是属于Java内存的一种
    2). 系统都自动去回收它,但是对于堆内存一般开发人员会自动回收它

    展开全文
  • Java堆和栈区别/联系详解

    千次阅读 2017-12-18 13:48:59
    Java堆和栈区别/联系详解关于Java中堆栈内存的知识,算是基础知识,和C语言中的指针有一些类似,面试中也经常会被问到,特别是跟Java和C都有关的开发工作。一.堆栈的联系在Java中,内存分为两种,一种是栈内存,另...
  • 主要介绍了Java堆和栈区别详解,所有的Java程序都运行在JVM虚拟机内部,我们这里介绍的自然是JVM(虚拟)内存中的堆和栈,需要的朋友可以参考下
  • Java虚拟机:Java堆和栈的详细区别

    万次阅读 2019-04-12 13:02:15
    一、Java把内存划分成两种:一种是内存,一种是内存。 在函数中定义的一些基本类型的变量对象的引用变量都在函数的内存中分配。 当在一段代码块定义一个变量时,Java就在中为这个变量分配内存空间,当...
  • 区别Java栈区别Java栈区别Java栈区别Java栈区别Java栈区别Java栈区别Java栈区别Java与栈
  • java堆和栈有什么区别

    千次阅读 2019-02-24 19:24:20
    堆和栈都是Java用来在RAM中存放数据的地方。 一、堆 (1)Java的堆是一个运行时数据区,类的对象从堆中分配空间。这些对象通过new等指令建立,通过垃圾回收器来销毁。 (2)堆的优势是可以动态地分配内存空间,需要...
  • 主要介绍了java 栈和堆区别详细介绍的相关资料,需要的朋友可以参考下
  • (heap)和栈(stack)的区别 1、存储 栈:变量、对象的引用 :实例对象 2、速度 栈:存取速度快 :存取速度慢 3、线程访问 栈:每个线程都有一个栈区 :所有线程共享一个区 4、垃圾回收 栈:比较频繁 ...
  • JAVA堆和栈区别

    万次阅读 多人点赞 2011-06-29 22:05:00
    在函数中定义的一些基本类型的变量对象的引用变量都在函数的内存中分配。 当在一段代码块定义一个变量时,Java就在中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存...
  • 经典面试题-java堆和栈区别

    千次阅读 2019-11-16 07:51:13
    Java栈是与每一个线程关联的,JVM在创建每一个线程的时候,会分配一定的空间给线程,主要存放线程执行过程中的局部变量,方法的返回值,基本类型的变量(,int, short, long, byte, float, double, boolean, char)...
  • 让你彻底明白JAVA区别

    万次阅读 多人点赞 2017-04-24 11:59:14
    简单的说: Java把内存划分成两种:一种是内存,一种是内存。 在函数中定义的一些基本类型的变量对象的引用变量都在函数的内存中分配。 当在一段代码块定义一个变量时,Java就在中为这个变量分配内存...
  • java堆和栈区别

    千次阅读 2018-03-28 09:36:30
    在函数中定义的一些基本类型的变量对象的引用变量都在函数的内存中分配。 当在一段代码块定义一个变量时,Java就在中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存...
  • Java堆和栈的比较

    千次阅读 2018-08-24 09:20:21
    1、首先在Java中程序员都不可以直接操作堆和栈 2、new创建的对象存在于堆中,局部变量存在于栈中。在堆中定义的对象会在栈中存其的首地址,方便快速访问。 3、栈的存取方式为先进后出,堆为先进先出 4、栈的访问...
  • java堆和栈和方法区的区别

    千次阅读 多人点赞 2019-05-09 16:44:26
    堆和栈很好理解,这里讲下方法区 方法区通俗点理解就是虚拟机在完成类装载操作后,将class文件中的常量池载入到内存中,并保存在方法区中, 方法区的好处: 常量池是为了避免频繁的创建和销毁对象而影响系统性能...
  • String3.1-java堆和栈---马克-to-win java视频 马克Java社区 马克towin
  • JAVA堆和栈区别和联系

    千次阅读 2019-04-25 14:01:14
    一、Java内存和栈内存 Java把内存划分成两种:一种是内存,一种是栈内存。 :主要用于储存实例化的对象,数组。由JVM动态分配内存空间。一个JVM只有一个内存,线程是可以共享数据的。 栈:主要用于储存...
  • JVM中的堆和栈 JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说,它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧...
  • 简单的说: Java把内存划分成两种:一种是内存,一种是内存。 在函数中定义的一些基本类型的变量对象的引用变量都在函数的内存中分配。 当在一段代码块定义一个变量时,Java就在中为这个变量分配内存...
  • java堆内存和栈内存的区别

    千次阅读 2018-04-22 17:02:11
    总结:1 :为编译器自动分配释放,如函数参数、局部变量、临时变量等等2 堆:为成员分配释放,由程序员自己申请、自己释放。...Java堆内存堆内存在Java运行时被使用来为对象JRE类分配内存。不论什...
  • Java面试题】堆和栈区别
  • 详解java堆和栈

    2012-04-09 10:06:10
    详细介绍java堆和栈区别,对初学者 是 好处

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 215,743
精华内容 86,297
关键字:

java堆和栈的区别

java 订阅