Bohr-L Bohr-L
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

刘博

I'm a slow walker, But I never walk backwards.
首页
技术
常见面试题
收藏
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • 数据处理与存储类

  • Spring 生态类

  • 缓存问题类

  • 多线程类

  • JVM 类

    • JVM 中一次完整的 GC 流程(从 ygc 到 fgc)是怎样的
    • 如何判断对象可以被回收
    • 你知道哪些垃圾收集算法
    • 虚拟机为什么使用元空间替换了永久代
    • 简述 CMS 垃圾收集器的工作流程,它有什么优缺点?
    • 简述一下 JVM 的内存模型
    • 说说堆和栈的区别
    • 简述 Java 的对象结构
    • JVM 中的即时编译器(JIT)如何工作?
    • 什么是内存屏障?JVM 如何使用内存屏障保证指令执行顺序?
    • 如何排查和解决 JVM 内存泄漏问题?有哪些常用的工具和方法?
    • JVM 如何处理异常?try-catch-finally 结构在字节码层面是如何实现的?
  • MySQL 类

  • Java 8 + 特性类

  • 其他技术类

  • 常见面试题
  • JVM 类
刘博
2025-12-28

说说堆和栈的区别

堆(Heap)和栈(Stack,指虚拟机栈)是 JVM 内存模型中两个核心区域,二者在存储内容、线程可见性、内存管理、生命周期等方面差异显著,具体对比如下:

对比维度 堆(Heap) 栈(虚拟机栈)
存储内容 存储 Java 对象实例(new创建的对象)和数组 存储方法执行时的栈帧(局部变量表、操作数栈等)
线程可见性 线程共享,所有线程可访问堆中对象 线程私有,每个线程有独立的栈,不可跨线程访问
内存分配方式 动态分配(对象创建时分配,大小不确定) 静态分配(栈帧大小编译时确定,方法调用时入栈)
内存回收机制 依赖 GC 回收(对象不可达时被回收) 无需 GC,栈帧随方法调用入栈、执行完出栈,自动释放
生命周期 与 JVM 一致(JVM 启动时创建,关闭时销毁) 与线程一致(线程启动时创建,结束时销毁)
异常类型 内存不足时抛出OutOfMemoryError: Java heap space 栈深度超限抛出StackOverflowError,内存不足抛出OutOfMemoryError
访问效率 效率低(需通过对象引用间接访问,存在 GC 开销) 效率高(栈帧连续存储,直接通过栈指针访问)
大小配置 通过-Xms(初始)、-Xmx(最大)配置 通过-XX:ThreadStackSize配置(默认 1MB)

上次更新: 12/30/2025
简述一下 JVM 的内存模型
简述 Java 的对象结构

← 简述一下 JVM 的内存模型 简述 Java 的对象结构→

最近更新
01
CPU 使用率较高排查和解决
12-29
02
JVM OOM 问题如何排查和解决
12-29
03
接口防刷怎么实现?
12-29
更多文章>
Theme by Vdoing | Copyright © 2025-2026 Bohr-L's note
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式