精华内容
下载资源
问答
  • 偶然看到一道面试题,Java在实例化一个类的时候,数据在堆和栈中是如何存放的?  public class A{  public int i=1;  public static A a1 = new A();  public static void mian(String args[]){  int c = ...
  • 主要介绍了JAVA堆内存栈内存区别,文中讲解非常细致,代码帮助大家更好的理解学习,感兴趣的朋友可以了解下
  • 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堆内存和栈内存区别

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

    总结:
    1 栈:为编译器自动分配和释放,如函数参数、局部变量、临时变量等等
    2 堆:为成员分配和释放,由程序员自己申请、自己释放。否则发生内存泄露。典型为使用new申请的堆内容。
    除了这两部分,还有一部分是:
    3 静态存储区:内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。它主要存放静态数据、全局数据和常量。

    Java堆内存

    堆内存在Java运行时被使用来为对象和JRE类分配内存。不论什么时候我们创建了对象,它将一直会在堆内存上创建。垃圾回收运行在堆内存上来释放没有任何引用的对象所占的内存,任何在堆上被创建的对象都有一个全局的访问,并且可以在应用的任何位置被引用。

    Java栈内存

    Java的栈内存被用来线程的执行,他们包含生命周期很短的具体值的方法和在堆中使用这个方法对象的引用。栈内存是LIFO(后进先出)序列。当方法被调用的时候,堆内存中一个新的块被创建,保存了本地原始值和在方法中对其他对象的引用。这个方法结束之后,这个块对其他方法就变成可用的了。栈内存与堆内存相比是非常小的。
    我们用下边的例子理解堆内存和栈内存
    [java] view plain copy
    1. package com.journaldev.test;  
    2.    
    3. public class Memory {  
    4.    
    5.     public static void main(String[] args) { // Line 1  
    6.         int i=1// Line 2  
    7.         Object obj = new Object(); // Line 3  
    8.         Memory mem = new Memory(); // Line 4  
    9.         mem.foo(obj); // Line 5  
    10.     } // Line 9  
    11.    
    12.     private void foo(Object param) { // Line 6  
    13.         String str = param.toString();  Line 7  
    14.         System.out.println(str);  
    15.     } // Line 8  
    16.    
    17. }  

    下边的图片展示了上边程序堆和栈内存的引用,并且是怎么用来存储原始值、对象和变量的引用。


    我们来看看程序执行的过程:
    1、只要我们一运行这个程序,它会加载所有的运行类到堆内存中去,当在第一行找到main()方法的时候,Java创建可以被main()方法线程使用的栈内存。
    2、当在第一行,我们创建了本地原始变量,它在main()的栈中创建和保存。
    3、因为我们在第三行创建了对象,它在堆内存中被创建,在栈内存中保存了它的引用,同样的过程也发生在第四行我们创建Memory对象的时候。
    4、当在第五行我们调用foo()方法的时候,在堆的顶部创建了一个块来被foo()方法使用,因为Java是值传递的,在第六行一个新的对象的引用在foo()方法中的栈中被创建
    5、在第七行一个String被创建,它在堆空间中的 String池中运行,并且它的引用也在foo()方法的栈空间中被创建
    6、foo()方法在第八行结束,此时在堆中为foo()方法分配的内存块可以被释放
    7、在第九行,main()方法结束,栈为main()方法创建的内存空间可以被销毁。同样程序也在行结束,Java释放了所有的内存,结束了程序的运行

    堆内存和栈内存的区别

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

    原文地址:http://www.journaldev.com/4098/java-heap-memory-vs-stack-memory-difference

    展开全文
  • Java 堆和栈区别

    万次阅读 多人点赞 2016-08-10 12:59:31
    内存是是Java内存中的一种,它的作用是用于存储Java中的对象和数组,当我们new一个对象或者创建一个数组的时候,就会在内存中开辟一段空间给它,用于存放。2.内存的特点是什么? 第一点:其实可以类似的看做...

    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堆和栈区别

    千次阅读 多人点赞 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堆和栈区别详解,所有的Java程序都运行在JVM虚拟机内部,我们这里介绍的自然是JVM(虚拟)内存中的堆和栈,需要的朋友可以参考下
  • Java虚拟机:Java堆和栈的详细区别

    万次阅读 2019-04-12 13:02:15
    一、Java内存划分成两种:一种是栈内存,一种是堆内存。 在函数中定义的一些基本类型的变量对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在中为这个变量分配内存空间,当...
  • (heap)和栈(stack)的区别 1、存储 栈:变量、对象的引用 :实例对象 2、速度 栈:存取速度快 :存取速度慢 3、线程访问 栈:每个线程都有一个栈区 :所有线程共享一个区 4、垃圾回收 栈:比较频繁 ...
  • Java堆内存和栈内存

    2020-12-22 15:22:30
    Java内存分成两种,一种叫做栈内存,一种叫做堆内存  在函数中定义的一些基本类型的变量对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java中为这个变量分配内存空间,当超过...
  • 主要介绍了Java堆内存栈内存的存储机制,包括JVM的内存优化GC等相关方面内容,需要的朋友可以参考下
  • 主要介绍了java 中的堆内存和栈内存的知识,有需要的朋友可以参考下
  • 栈内存堆内存和垃圾回收器的关系: 在中分配内存给新产生对象或者数组的同时,还在中产生一个特殊变量,这个特殊变量的取值等于对象或者数组在堆内存中的首地址。当这个特殊变量超过了函数体{},被自动回收后...
  • 简单的说: Java内存划分成两种:一种是栈内存,一种是堆内存。 在函数中定义的一些基本类型的变量对象的引用变量都在函数的栈内存中分配。 当在一段代码块定义一个变量时,Java就在中为这个变量分配内存...
  • java堆和栈有什么区别

    千次阅读 2019-02-24 19:24:20
    堆和栈都是Java用来在RAM中存放数据的地方。 一、堆 (1)Java的堆是一个运行时数据区,类的对象从堆中分配空间。这些对象通过new等指令建立,通过垃圾回收器来销毁。 (2)堆的优势是可以动态地分配内存空间,需要...
  • Java面试--堆和栈的概念和区别

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

    万次阅读 多人点赞 2019-02-19 16:39:41
    在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分: Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的。JVM运行时在内存中开辟一片内存区域,启动时在...
  • 主要介绍了Java 堆内存与栈内存详细介绍的相关资料,这里对java堆内存和栈内存进行了详细的分析,需要的朋友可以参考下
  • 堆和栈区别-JVM内存

    千次阅读 2017-06-13 11:28:47
    JAVA JVM的内存堆和栈分别用途是什么呢? 先了解一JVM的内存分布,大体见下图所示:
  • Java堆和栈区别/联系详解

    千次阅读 2017-12-18 13:48:59
    Java堆和栈区别/联系详解关于Java中堆栈内存的知识,算是基础知识,和C语言中的指针有一些类似,面试中也经常会被问到,特别是跟Java和C都有关的开发工作。一.堆栈的联系在Java中,内存分为两种,一种是栈内存,另...
  • JAVA堆内存和栈内存区别

    千次阅读 2018-01-25 12:30:45
    Java内存分成两种,一种叫做栈内存,一种叫做内存在函数中定义的一些基本类型的变量对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在中为这个变量分配内存空间,当超过...
  • 这里不讲垃圾回收的机制 ...我们都知道变量占有内存,内存在底层分配上有堆和栈。 值类型变量的内存通常是在栈中分配 引用类型变量的内存通常在堆中分配 注意这里说的是通常,因为变量又分为局部变量和全局变量。 当变
  • 堆内存和栈内存区别

    万次阅读 2019-03-14 00:03:46
    总结: 1 :为编译器自动分配释放,如函数参数、局部变量、临时变量等等 2 :为成员分配释放,由程序员自己申请、自己释放。否则发生内存泄露。...栈内存和堆内存区别(一个笔试题的一部分)http://...
  • 本文分析了Java堆内存栈内存分配的异同
  • Java 内存管理(堆和栈)及 垃圾回收算法一.Jvm虚拟机内存简介1.1 Java运行时内存区1.2 线程私有的如下:1.3 线程共享的如下:二.Java 栈和堆2.1 堆栈的概念和特点2.2 栈与堆的异同2.3 举个例子另注:三.垃圾回收...
  • 分析Java内存分配的栈和堆以及常量池 一java虚拟机内存原型 寄存器我们在程序中无法控制存放基本类型的数据对象的引用但对象本身不存放在中而是存放在存放用new产生的数据静态域存放在对象中用static...
  • 详细的讲解了java内存分配,包括运行时堆和栈内存的分配,变量和方法存储等

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 190,326
精华内容 76,130
关键字:

java内存堆和栈的区别

java 订阅