Java中堆和栈的区别详解

 更新时间:2015年01月16日 09:56:33   投稿:junjie  
这篇文章主要介绍了Java中堆和栈的区别详解,所有的Java程序都运行在JVM虚拟机内部,我们这里介绍的自然是JVM(虚拟)内存中的堆和栈,需要的朋友可以参考下

当一个人开始学习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为堆的最大值。

复制代码 代码如下:

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为栈内存的大小。

复制代码 代码如下:

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)

译文信息

原汁原味的英文原文:http://javarevisited.blogspot.com.au/2013/01/difference-between-stack-and-heap-java.html.

译文在原文基础上进行了修改,整理,删减。如有兴趣可以访问原文。P.S.地址已被墙。

相关文章

  • 并发编程之Java内存模型锁的内存语义

    并发编程之Java内存模型锁的内存语义

    这篇文章主要介绍了并发编程之Java内存模型锁的内存语义,锁的作用是让临界区互斥执行,本文只要围绕锁的内存语义展开全文内容,需要的小伙伴可以参考一下
    2021-11-11
  • java开发微信公众号支付

    java开发微信公众号支付

    这篇文章主要给大家结合微信支付接口开发的实践,从获取用户授权到各主要接口的使用方法等方面介绍微信支付的关键点技术,有需要的小伙伴可以参考下
    2015-08-08
  • 在Java的MyBatis框架中建立接口进行CRUD操作的方法

    在Java的MyBatis框架中建立接口进行CRUD操作的方法

    这篇文章主要介绍了在Java的MyBatis框架中建立接口进行CRUD操作的方法,CRUD是指在做计算处理时的增加(Create)、重新取得数据(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写,需要的朋友可以参考下
    2016-04-04
  • SpringBoot + SpringSecurity 短信验证码登录功能实现

    SpringBoot + SpringSecurity 短信验证码登录功能实现

    这篇文章主要介绍了SpringBoot + SpringSecurity 短信验证码登录功能实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • java agent 使用及实现代码

    java agent 使用及实现代码

    java agent的作用可以在字节码这个层面对类和方法进行修改的技术,能够在不影响编译的情况下,修改字节码。本文主要给大家讲解java agent 使用及实现代码,感兴趣的朋友一起看看吧
    2018-07-07
  • JavaBean实体类处理外键过程解析

    JavaBean实体类处理外键过程解析

    这篇文章主要介绍了JavaBean实体类处理外键过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 实例分析Java Class的文件结构

    实例分析Java Class的文件结构

    今天把之前在Evernote中的笔记重新整理了一下,发上来供对java class 文件结构的有兴趣的同学参考一下
    2013-04-04
  • Java框架Quartz中API、Jobs和Trigger详解

    Java框架Quartz中API、Jobs和Trigger详解

    这篇文章主要介绍了Java框架Quartz中API、Jobs和Trigger详解,JobDetail 对象是在将 job 加入 scheduler 时,由客户端程序(你的程序)创建的,它包含 job 的各种属性设置,以及用于存储 job 实例状态信息的 JobDataMap,需要的朋友可以参考下
    2023-11-11
  • Java反转链表测试过程介绍

    Java反转链表测试过程介绍

    这篇文章主要介绍了Java反转链表测试过程,学习过数据结构的小伙伴们,对链表想来是并不陌生。本篇文章将为大家介绍几种在Java语言当中,实现链表反转的几种方法,以下是具体内容
    2023-04-04
  • 老生常谈Java字符串进阶(必看篇)

    老生常谈Java字符串进阶(必看篇)

    下面小编就为大家带来一篇老生常谈Java字符串进阶(必看篇)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06

最新评论