精华内容
下载资源
问答
  • 2021-02-12 15:56:39

    一、概述

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

    二、堆内存

    1、什么是堆内存?

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

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

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

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

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

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

    三、栈内存

    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:如果是两个对象的话,那就不一样了,对象指向的是同一个引用,一个发生改变,另一个也会发生改变。

    四、栈和堆的区别

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

    差异点:

    1.堆内存用来存放由new创建的对象和数组。

    2.栈内存用来存放方法或者局部变量等。

    3.堆是先进先出,后进后出。

    4.栈是后进先出,先进后出。

    相同点:

    1.都是属于Java内存的一种。

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

    以上就是本次整理的全部相关知识点,感谢大家的学习和对脚本之家的支持。

    更多相关内容
  • 浅谈Java栈内存和堆内存

    千次阅读 2022-03-22 10:22:50
    Java把内存分成两种,一种叫做栈内存,一种叫做内存。在函数中定义的一些基本类型的变量对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过...

    介绍Java语言有关内存分配的知识。Java语言把内存分为两种:栈内存堆内存

    栈内存

    在方法中定义的一些基本类型的变量对象的引用变量都在方法的栈内存中分配,当在一段代码块中定义一个变量时,Java就在栈内存中为这个变量分配内存空间,当超出变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立刻被另作他用。


    堆内存

    堆内存用来存放由 new 运算符创建的数组或对象,在堆中分配的内存,由Java虚拟机的垃圾回收器来自动管理。在堆中创建了一个数组或对象后,同时还在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,引用变量实际上保存的是数组或对象在堆内存中的首地址(也称为对象的句柄),以后就可以在程序中使用栈的引用变量来访问堆中的数组或对象。

    引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。引用变量就相当于是为数组或对象起的一个名称。而数组或对象本身在堆内存中分配,即使程序运行到使用 new 运算符创建数组或对象的语句所在的代码块之外,数组或对象本身所占据的内存也不会被释放,数组或对象在没有引用变量指向它时,会变为垃圾,不能再被使用,但仍然占据内存空间不放,在随后一个不确定的时间被垃圾回收器收走(释放掉),这也是Java比较占内存的原因。

    Java有一个特殊的引用型常量null,如果将一个引用变量赋值为null,则表示该引用变量不指向(引用)任何对象。


    下面通过一个数组案例进行演示,以对栈内存和堆内存有更深的了解。

    一维数组是最简单的数组,其逻辑结构是线性表。要使用一维数组,需要先声明数组;分配空间;创建数组元素并赋值。

    数据类型 [] 数组名;             //声明一维数组
    
    数组名 = new 数据类型[个数];    //分配内存给数组
    

    在数组的声明格式里,“数据类型”是声明数组元素的数据类型,可以是Java语言中任意的数据类型,包括基本类型和引用类型。

    与C/C++语言不同,Java语言在数组的定义中并不为数组元素分配内存,因此“[]”中不用给出数组中元素的个数(即数组的长度),但必须在为它分配内存空间后才可使用。

    数组声明之后,接下来就要分配数组所需的内存,这时必须用运算符new,利用new运算符为数组元素分配内存空间的方式称为动态内存分配方式

    int [] x;    //声明名称为x的int型数组
    x = new int[10]; //x数组中包含有10个元素,并为这10元素分配内存空间
    

    在声明数组时,也可以将两个语句合并成一行,格式如下:

    数据类型 [] 数组名 = new 数据类型[个数];
    int [] x = new int[10];
    

    等号左边的 “int [] x ”相当于定义了一个特殊的变量x,x的数据类型是一个对 int 型数组对象的引用,x就是一个数组的引用变量,其引用的数组元素个数不定。等号右边的 “new int[10]” 就是在堆内存中创建一个具有10个int型变量的数组对象。其意义就是将右边的数组对象赋值给左边的数组引用变量。

    这里我们先声明一个数组,例如:

    int [] x;  //定义了一个数组x
    

    这条语句执行完成后的内存状态如图下所示。

    这时只声明了数组,而没有对其分配内存空间。现在我们为数组元素分配内存空间。

    x = new int[10];  //初始化数组
    

    这条语句执行完后的内存状态如图下所示。

    声明数组并分配相应的内存空间,引用变量指向数组对象

    执行“x=new int[10];”后,在堆内存里创建了一个数组对象,为这个数组对象分配了10个整数单元,并将数组对象赋给了数组引用变量x。引用变量就相当于C语言中的指针变量,而数组对象就是指针变量指向的那个内存块。所以在Java内部还是有指针,只是把指针的概念对用户隐藏起来了,而用户所使用的是引用变量。

    用户也可以改变x的值,让它指向另外一个数组对象,或者不指向任何数组对象。要想让x不指向任何数组对象,只需要将常量null赋给x即可。如执行“x = null;”语句后的内存状态如图下所示。

    执行完“x = null;”语句后,原来通过new int[10]产生的数组对象不再被任何引用变量所引用,变成了所谓的“垃圾”,直到垃圾回收器来将它释放掉。


    感谢大家的耐心阅读,如有建议请私信或评论留言

    展开全文
  • java栈内存和堆内存有什么区别

    千次阅读 2021-03-09 08:53:56
    内存和堆内存的区别:1、栈内存用来存放基本类型的变量和引用变量,堆内存用来存储java中的对象,无论是成员变量,局部变量,还是类变量,他们指向的对象都存储在堆内存中。(视频教程推荐:java视频)2、栈内存归属...

    fcc80abbc808718b6bb0e952609e7117.png

    栈内存和堆内存的区别:

    1、栈内存用来存放基本类型的变量和引用变量,堆内存用来存储java中的对象,无论是成员变量,局部变量,还是类变量,他们指向的对象都存储在堆内存中。

    (视频教程推荐:java视频)

    2、栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属的线程中可见,即栈内存可以理解成线程的私有内存;堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。

    3、如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.stackoverflowerror 错误;如果是堆内存内有可用的空间存储生成的对象,jvm会抛出java.lang.outofmemoryerror错误。

    3、栈的内存要远远小于堆内存,如果你使用递归的话,那么你的栈会很快充满。-Xss设置每个线程堆栈内存的大小 -Xms可以设置堆内存开始时的大小。

    总结:

    JVM 中堆和栈属于不同的内存区域,使用目的也不同。栈常用于保存方法帧和局部变量,而对象总是在堆上分配。栈通常都比堆小,也不会在多个线程之间共享,而堆被整个 JVM 的所有线程共享。

    展开全文
  • Java把内存划分成两种:一种是栈内存,一种是内存。 一、栈内存 存放基本类型的变量,对象的引用方法调用,遵循先入后出的原则。 栈内存在函数中定义的“一些基本类型的变量对象的引用变量”都在函数的栈内存...

    Java把内存划分成两种:一种是栈内存,一种是堆内存。

    一、栈内存

    存放基本类型的变量,对象的引用和方法调用,遵循先入后出的原则。
    栈内存在函数中定义的“一些基本类型的变量和对象的引用变量”都在函数的栈内存中分配。当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。

    Java中的代码是在函数体中执行的,每个函数主体都会被放在栈内存中,比如main函数。假如main函数里调用了其他的函数,比如add(),那么在栈里面的的存储就是最底层是main,mian上面是add。栈的运行时后入先出的,所以会执行时会先销毁add,再销毁main。

    栈的优势是,栈内存与堆内存相比是非常小的,存取速度比堆要快,仅次于寄存器,栈数据可以共享。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。栈中主要存放一些基本类型的变量(int, short, long, byte, float, double, boolean, char)和对象句柄。栈有一个很重要的特殊性,就是存在栈中的数据可以共享。

    二、堆内存

    存放所有new出来的对象和数组

    特此强调,堆内存和数据结构中的堆完全是两码事,分配方式倒是类似于链表

    堆内存是区别于栈区、全局数据区和代码区的另一个内存区域。堆允许程序在运行时动态地申请某个大小的内存空间,堆内存实际上指的就是(满足堆内存性质的)优先队列的一种数据结构,第1个元素有最高的优先权。

    在堆内存分配时首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。

    另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。堆内存是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆内存的大小受限于计算机系统中有效的虚拟内存。由此可见,堆内存获得的空间比较灵活,也比较大。堆内存是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。

    栈与堆都是Java用来在Ram中存放数据的地方。与C ++不同,Java自动管理栈和堆,程序员不能直接设置栈或堆

    Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过新的,newarray,anewarray和multianewarray等指令建立,它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的,堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,因为它是在运行时动态分配内存的,Java的的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要在运行时动态分配内存,存取速度较慢。

    三、其他数据存储

    1、常量池:存放基本类型常量和字符串常量(public static final)
    2、静态域:存放静态成员(static定义的)
    3、非RAM存储:硬盘等永久存储空间

    堆内存和栈内存的区别:

    1、应用程序所有的部分都使用堆内存,然后栈内存通过一个线程运行来使用。
    2、不论对象什么时候创建,他都会存储在堆内存中,栈内存包含它的引用。栈内存只包含原始值变量好和堆中对象变量的引用。
    3、存储在堆中的对象是全局可以被访问的,然而栈内存不能被其他线程所访问。
    4、栈中的内存管理使用LIFO的方式完成,而堆内存的管理要更复杂了,因为它是全局被访问的。
    5、栈内存是生命周期很短的,然而堆内存的生命周期从程序的运行开始到运行结束。
    6、我们可以使用-Xms和-Xmx JVM选项定义开始的大小和堆内存的最大值,我们可以使用-Xss定义栈的大小
    7、当栈内存满的时候,Java抛出java.lang.StackOverFlowError异常而堆内存满的时候抛出java.lang.OutOfMemoryError: Java Heap Space错误
    8、和堆内存比,栈内存要小的多,因为明确使用了内存分配规则(LIFO),和堆内存相比栈内存非常快。

    总结:

    1 栈:为编译器自动分配和释放,如函数参数、局部变量、临时变量等等

    2 堆:为成员分配和释放,由程序员自己申请、自己释放。否则发生内存泄露。典型为使用new申请的堆内容。
    除了这两部分,还有一部分是:

    3 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。

    最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:11604713672

    展开全文
  • Java堆内存和栈内存

    2020-12-22 15:22:30
    Java把内存分成两种,一种叫做栈内存,一种叫做内存  在函数中定义的一些基本类型的变量对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java在栈中为这个变量分配内存空间,当超过...
  • 主要介绍了java 中的堆内存和栈内存的知识,有需要的朋友可以参考下
  • 浅析Java堆内存和栈内存的区别

    万次阅读 2018-03-06 09:36:55
    参考 内存:https://baike.baidu.com/item/%E5%A0%86%E5%86%85%E5%AD%98/7270805?fr=aladdin ...Java把内存划分成两种:一种是栈内存,一种是内存。 一、栈内存 存放基本类型的变量,对象的引用和方...
  • java堆内存和栈内存的区别

    千次阅读 2018-04-22 17:02:11
    总结:1 :为编译器自动分配释放,如函数参数、局部变量、临时变量等等2 :为成员分配释放,由程序员自己申请、自己释放。...Java堆内存堆内存在Java运行时被使用来为对象JRE类分配内存。不论什...
  • java栈内存与堆内存(JVM内存模型)Java中堆内存和栈内存详解1 和 Java中堆内存和栈内存详解2 都粗略讲解了栈内存和堆内存的区别,以及代码中哪些变量存储在堆中、哪些存储在栈中。内存中的堆和栈到底是什么 详细...
  • Java栈内存和堆内存详解,非常容易理解
  • 主要介绍了Java内存与栈内存的存储机制,包括JVM的内存优化GC等相关方面内容,需要的朋友可以参考下
  • 主要介绍了Java 内存与栈内存详细介绍的相关资料,这里对java堆内存和栈内存进行了详细的分析,需要的朋友可以参考下
  • 简单的说: Java把内存划分成两种:一种是栈内存,一种是内存。 在函数中定义的一些基本类型的变量对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存...
  • 本文分析了Java内存与栈内存分配的异同
  • Java把内存划分成两种:一种是栈内存,一种是内存。这里需要解释一下, 这里的内存是跟数据结构的是完全两码事。一、栈内存存放基本类型的变量,以及对象的引用值函数主体,遵循先入后出的原则。栈内存在函数...
  • Java堆内存和栈内存详解.doc
  • 详细的讲解了java内存分配,包括运行时堆和栈内存的分配,变量方法存储等
  • Java内存管理(,方法区)

    千次阅读 2022-05-02 19:21:29
    栈内存中保存的是内存空间的访问地址,或者说栈中的变量指向内存中的变量。 栈是Java方法执行的内存模型每个方法在执行的同时都会创建一个栈帧的用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每...
  • Java数组---栈内存内存的区别(通过数组讲解)

    千次阅读 多人点赞 2019-11-19 21:24:51
    Java数组 在进入讲解主题“-栈内存...针对于Java数组,Java语言把内存分为两种:-栈内存和堆内存。 栈内存: 在方法中定义的一些基本类型的变量和对象的引用变量都在方法的栈内存中分配,当在一段代码块中定义一个变...
  • Java 内存管理(堆和)及 垃圾回收算法一.Jvm虚拟机内存简介1.1 Java运行时内存区1.2 线程私有的如下:1.3 线程共享的如下:二.Java 栈和堆2.1 堆栈的概念和特点2.2 与堆的异同2.3 举个例子另注:三.垃圾回收...
  • 主要介绍了java内存溢出示例(溢出、溢出),需要的朋友可以参考下
  • 栈内存和堆内存Java(详细实例讲解)

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

    千次阅读 2020-08-07 18:40:24
    Java的内存需要划分成为5个... 作用域:一旦超出作用域,立刻从栈内存当中消失。 2.(Heap) :凡是new出来的东西,都在当中。 内存里面的东西都有一个地址值: 16进制 内存里面的数据,都有默认值。规则: ...
  • 堆内存和栈内存的区别

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 339,451
精华内容 135,780
关键字:

java栈内存和堆内存

java 订阅