当一个人开始学习Java或者其他编程语言的时候,会接触到堆和栈,由于一开始没有明确清晰的说明解释,很多人会产生很多疑问,什么是堆,什么是栈,堆和栈有什么区别?更糟糕的是,Java中存在栈这样一个后进先出(Last In First Out)的顺序的数据结构,这就是java.util.Stack。这种情况下,不免让很多人更加费解前面的问题。事实上,堆和栈都是内存中的一部分,有着不同的作用,而且一个程序需要在这片区域上分配内存。众所周知,所有的Java程序都运行在JVM虚拟机内部,我们这里介绍的自然是JVM(虚拟)内存中的堆和栈。
区别
java中堆和栈的区别自然是面试中的常见问题,下面几点就是其具体的区别
各司其职
最主要的区别就是栈内存用来存储局部变量和方法调用。
而堆内存用来存储Java中的对象。无论是成员变量,局部变量,还是类变量,它们指向的对象都存储在堆内存中。
独有还是共享
栈内存归属于单个线程,每个线程都会有一个栈内存,其存储的变量只能在其所属线程中可见,即栈内存可以理解成线程的私有内存。
而堆内存中的对象对所有线程可见。堆内存中的对象可以被所有线程访问。
异常错误
如果栈内存没有可用的空间存储方法调用和局部变量,JVM会抛出java.lang.StackOverFlowError。
而如果是堆内存没有可用的空间存储生成的对象,JVM会抛出java.lang.OutOfMemoryError。
空间大小
栈的内存要远远小于堆内存,如果你使用递归的话,那么你的栈很快就会充满。如果递归没有及时跳出,很可能发生StackOverFlowError问题。
你可以通过-Xss选项设置栈内存的大小。-Xms选项可以设置堆的开始时的大小,-Xmx选项可以设置堆的最大值。
这就是Java中堆和栈的区别。理解好这个问题的话,可以对你解决开发中的问题,分析堆内存和栈内存使用,甚至性能调优都有帮助。
查看默认值(Updated)
查看堆的默认值,使用下面的代码,其中InitialHeapSize为最开始的堆的大小,MaxHeapSize为堆的最大值。
1
2
3
4
5
6
7
8
9
13:17 $ java -XX:+PrintFlagsFinal -version | grep HeapSize
uintx ErgoHeapSizeLimit = 0 {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 134217728 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 2147483648 {product}
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)
查看栈的默认值,其中ThreadStackSize为栈内存的大小。
1
2
3
4
5
6
7
13:21 $ java -XX:+PrintFlagsFinal -version | grep ThreadStackSize
intx CompilerThreadStackSize = 0 {pd product}
intx ThreadStackSize = 1024 {pd product}
intx VMThreadStackSize = 1024 {pd product}
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.25-b02, mixed mode)

转载于:https://www.cnblogs.com/seattle-xyt/p/10365859.html

Java中的堆和栈的区别相关推荐

  1. java栈 类 堆_详细介绍Java中的堆和栈

    栈与堆都是Java用来在RAM中寄存数据的中央.与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆. Java的堆是一个运转时数据区,类的对象从中分配空间.这些对象经过new.newar ...

  2. (十一)C语言中内存堆和栈的区别

    在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到.但对于很多的初学着来说,堆栈是一个很模糊的概念. 堆栈:一种数据结构.一个在程序运行时用于存放的地方,这可能是很多初学者的认 ...

  3. Jvm(29),理解升级----C语言中的堆和栈的区别 (可以借鉴)

    假如你现在还在为自己的技术担忧,假如你现在想提升自己的工资,假如你想在职场上获得更多的话语权,假如你想顺利的度过35岁这个魔咒,假如你想体验BAT的工作环境,那么现在请我们一起开启提升技术之旅吧,详情 ...

  4. java 中的堆和栈

    Java把内存划分成两种:一种是栈内存,一种是堆内存.          在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 当在一段代码块定义一个变量时,Java就在栈中为这个 ...

  5. 计算机程序中的堆和栈的区别,内存中的堆与栈(stack)和栈的区别

    前言:我们经常听到一个概念,堆和栈.实际上,数据结构中有两个相同的概念,但这与内存堆栈不同.本文还将说明它们之间的区别,此内.函数完成后,这些内容将被自动销毁. .它的特点是效率高,但内存大小有限. ...

  6. java中的堆、栈、方法区等比较

    • 堆.栈.方法区 1. java中的栈(stack)和堆(heap)是java在内存(ram)中存放数据的地方 2. 堆区 存储的全部是对象,每个对象都包含一个与之对应的class的信息.(clas ...

  7. Java中关于队列与栈的区别

    一:栈  ,先进后出,通常叫压栈,往箱子里面放衣服,最先进去,先进后出,后进先出LIFO.底层采用Vector import java.util.Stack;public class StackQue ...

  8. 什么是java中的栈和堆_java中的堆和栈是什么?堆和栈有什么区别?

    java中的堆和栈是什么?堆和栈有什么区别? 发布时间:2020-06-02 11:51:19 来源:亿速云 阅读:183 作者:Leah java中的堆和栈是什么?堆和栈有什么区别?这些问题可能是我 ...

  9. 堆和栈的区别(面试经验总结)

    C++中,内存分为5个区:堆.栈.自由存储区.全局/静态存储区和常量存储区. 栈:是由编译器在需要时自动分配,不需要时自动清除的变量存储区.通常存放局部变量.函数参数等. 堆:是由new分配的内存块, ...

最新文章

  1. PChar 类型的又一些用法
  2. 手把手教你刷新BACKUP Bios
  3. 《给教师的阅读建议》经典语录
  4. linux系统列表,Linux常用系统调用列表-20210415054405.docx-原创力文档
  5. 手机python3ide加法器_Python3开发常用工具
  6. vs2010 mysql linq to sql 系列_linq to sql简单使用
  7. 【软考】《希赛教育·软件设计师考前冲刺与考点分析》计算机硬件基础知识——学习笔记
  8. Spark之functions
  9. asp.net membership 配置错误
  10. 光立方体c语言程序,444光立方程序怎么写 光立方原理图、源代码及制作教程
  11. 一个很好用的桌面取色器和一个在线取色器
  12. 有限维空间上的线性算子
  13. python包NetworkX学习——最短路径dijkstra_path和dijkstra_path_length
  14. plotly绘制简单图形4--饼形图
  15. Mac快速创建文件、文件夹
  16. 计算机网络实验 ppt,计算机网络实验实验四跨交换机实现vlan.ppt
  17. uboot什么意思(uboot fastboot)
  18. 哀悼日网页彩色变黑白方法-css样式修改
  19. 各种机器学习算法的应用场景分别是什么(比如朴素贝叶斯、决策树、K 近邻、SVM、逻辑回归最大熵模型)?...
  20. 别具一格,原创唯美浪漫情人节表白专辑,(复制就可用)(html5,css3,svg)表白爱心代码(1)

热门文章

  1. 2015 8月31 工作计划与执行
  2. javascript 获取控件坐标
  3. 【Java进阶营】Java多线程基础学习(一)
  4. Python培训的基础知识
  5. python中单下划线(_)和双下划线(__)的特殊用法 还等什么
  6. 【TensorFlow】TensorFlow从浅入深系列之九 -- 教你认识图像识别中经典数据集
  7. Re-attention机制Transformer,实现强大性能
  8. 浙江大学最美学习笔记赏析!我太吃惊了
  9. 大神云集!2019年谷歌博士奖学金获得者重磅问世,清华、上交大、港中文入选最多!...
  10. Char RNN原理介绍以及文本生成实践