Java中的堆和栈示例详解

 更新时间:2025年09月24日 14:37:40   作者:在努力的韩小豪  
在Java中,堆(Heap)和栈(Stack)是两种不同的内存区域,本文给大家介绍Java中的堆和栈,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧

一、前言

  • 在Java中,堆(Heap)和栈(Stack)是两种不同的内存区域;
  • 用于管理程序运行时的数据存储;
  • 它们的核心区别在于存储内容、生命周期和内存管理方式。

二、栈(Stack)

  • 用途
    • 存储方法调用的栈帧(每个方法对应一个栈帧)。
    • 存放局部变量(基本数据类型,如 int、boolean)和对象引用(即对象的地址)。
    • 例如:int a = 10; 或 String s = “Hello”;(s 是引用,实际字符串在堆中)。
  • 特点
    • 线程私有:每个线程有自己的栈,互不干扰。
    • 快速分配:通过指针移动直接分配/释放内存。
    • 自动管理:方法执行完毕后,栈帧自动弹出,内存立即回收。
    • 容量较小:默认大小通常为 1MB(可通过 -Xss 参数调整)。
    • 溢出错误:递归过深或方法调用过多会导致 StackOverflowError。

三、堆(Heap)

  • 用途
    • 存储所有对象实例数组(无论是 new 关键字创建的,还是静态成员变量)。
    • 例如:Object obj = new Object();(对象本身在堆中,obj 是栈中的引用)。
  • 特点
    • 线程共享:所有线程共享堆内存。
    • 动态分配:内存分配相对复杂,需考虑碎片化和垃圾回收。
    • 生命周期不确定:对象存活到不再被引用时,由垃圾回收器(GC)自动回收。
    • 容量较大:默认大小为物理内存的1/4(可通过 -Xms 和 -Xmx 调整初始值和最大值)。
    • 溢出错误:内存不足时抛出 OutOfMemoryError。

四、核心区别

五、代码示例

public class Example {
    public static void main(String[] args) {
        int num = 42;                // 基本类型变量 `num` 存储在栈中
        String str = "Hello";       // 引用 `str` 在栈中,字符串常量在堆的字符串池中
        Object obj = new Object();  // 引用 `obj` 在栈中,对象实例在堆中
    }
}

六、常见问题

  • 为什么基本类型的成员变量在堆中?

    • 如果基本类型是类的成员变量(如 class A { int x; }),则它们会随对象实例存储在堆中。
  • 逃逸分析优化:

    • JVM会通过逃逸分析将某些对象直接分配到栈上(避免堆分配的开销),开发者无需干预。

七、总结

  • 高效管理方法执行和局部变量,自动回收,容量小。
  • 动态存储对象,由GC管理,容量大,生命周期灵活。
  • 理解两者的区别对内存优化和问题排查(如内存泄漏)至关重要。

到此这篇关于一文搞懂Java中的堆和栈的文章就介绍到这了,更多相关java 堆和栈内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解Java的Hibernate框架中的List映射表与Bag映射

    详解Java的Hibernate框架中的List映射表与Bag映射

    这篇文章主要介绍了Java的Hibernate框架中的List映射表与Bag映射,Hibernate是Java的SSH三大web开发框架之一,需要的朋友可以参考下
    2015-12-12
  • Spring Security实现基于角色的访问控制框架

    Spring Security实现基于角色的访问控制框架

    Spring Security是一个功能强大的安全框架,提供了基于角色的访问控制、身份验证、授权等安全功能,可轻松保护Web应用程序的安全,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-04-04
  • Spring Boot详细打印启动时异常堆栈信息详析

    Spring Boot详细打印启动时异常堆栈信息详析

    这篇文章主要给大家介绍了关于Spring Boot详细打印启动时异常堆栈信息的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring Boot具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-10-10
  • 使用Jackson进行JSON生成与解析的新手指南

    使用Jackson进行JSON生成与解析的新手指南

    这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-04-04
  • ssm mybatis如何配置多个mapper目录

    ssm mybatis如何配置多个mapper目录

    这篇文章主要介绍了ssm mybatis如何配置多个mapper目录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教。
    2022-01-01
  • idea启动命令过长的问题及解决

    idea启动命令过长的问题及解决

    当IDEA启动命令过长时,可以通过修改workspace.xml文件或调整启动类配置来解决,方案一是在.idea文件或项目目录中修改workspace.xml;方案二是通过运行配置(run->edit)来保存启动设置,这两种方法都可以有效缩短命令长度,解决启动错误
    2024-09-09
  • java实现jframe透明窗体示例

    java实现jframe透明窗体示例

    这篇文章主要介绍了java实现jframe透明窗体示例,需要的朋友可以参考下
    2014-03-03
  • Java线程等待唤醒几种方法小结

    Java线程等待唤醒几种方法小结

    线程等待和唤醒有三种实现方法,分别是Object类中的wait、notify,Condition类中的await、signal,LockSupport类中的park、unpark方法,感兴趣的可以了解一下
    2023-10-10
  • spring boot之使用spring data jpa的自定义sql方式

    spring boot之使用spring data jpa的自定义sql方式

    这篇文章主要介绍了spring boot之使用spring data jpa的自定义sql方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Spring 使用 feign时设置header信息的操作

    Spring 使用 feign时设置header信息的操作

    这篇文章主要介绍了Spring 使用 feign时设置header信息的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08

最新评论