JVM 内存结构

文章目录

大家好,你有没有想过:我们写的 Java 程序,new 出来的对象去了哪?这些问题的答案,其实都藏在 JVM 的内存结构 里。今天,带你们搞清楚 JVM 是什么划分内存区域的。


一、JVM 内存结构是啥?

我们可以把 JVM 想象成一栋楼,这栋楼专门用来运行 Java 程序。楼里有不同的房间,每个房间干不同的事。这些"房间",就是 JVM 的内存区域。

JVM 把内存划分为 5 个主要部分

  1. 程序计数器
  2. Java 虚拟机栈
  3. 本地方法栈
  4. 方法区

二、程序计数器

  1. 它是干啥的?

    记录当前线程执行到哪一行字节码了,方便线程之间的切换。

  2. 特点:

    每个线程都有自己的程序计数器(线程私有)。

    它是 JVM 中唯一不会发生 OutOfMemoryError 的区域。

    如果当前执行的是 Java 方法,它记录的是代码行号


三、Java 虚拟机栈

  1. 它是干啥的?

    每调用一个方法,JVM 就会为这个方法分配一块内存空间,叫做"栈帧",然后把这个栈帧压到栈里。方法执行完,就弹出来。它是线程私有的,生命周期和线程一样。

  2. 栈帧里装了啥?

    局部变量表

    操作数栈

    动态链接

    方法返回地址

  3. 常见异常:
    StackOverflowError :递归太深,比如 "main" 调用自己,栈太深了超出存储容量。
    OutOfMemoryError:线程开得太多,每个线程都要栈,内存不够用了。


四、本地方法栈

它是干啥的?

和虚拟机栈类似,但它服务的是 native 方法------也就是用 C/C++ 写的底层方法,比如 Thread.start()、Object.hashCode()。它也是线程私有的。

虽然我们平时不直接写 native 方法,但很多 Java 底层功能都依赖它。


五、堆(内存最大的区域)

  1. 它是干啥的?

    所有通过 new 创建的对象,都住在这里。数组也在这里。

  2. 特点:

    所有线程共享,是 JVM 中最大的一块内存。

    垃圾回收(GC)主要发生在这里。

    可以通过 -Xms (初始大小)和 -Xmx(最大大小)来设置。

堆还分"小区":

  • 新生代(Young Generation) :新对象的"临时宿舍"。
    • Eden 区:大多数对象出生地。
    • Survivor 区(S0、S1):经历过一次 GC 还活着的对象搬到这里。
  • 老年代(Old Generation):活了很久的对象,比如缓存、静态集合。

大多数对象"朝生夕死",所以新生代回收频繁但高效;老年代对象少但活得久,回收慢。


六、方法区

  1. 它是干啥的?
    存放类的结构信息,比如:
  • 类名、方法名、字段
  • 静态变量
  • 常量
  • 编译后的字节码(运行时常量池)
  1. 特点:
  • 所有线程共享。
  • 在 JDK 8 之前叫"永久代"(PermGen),容易溢出。
  • JDK 8 开始,改用"元空间"(Metaspace),不再放在堆里,而是使用本地内存(操作系统的内存),所以更稳定。

七、常见问题,一次说清

1. 堆和栈有什么区别?

项目
存什么 对象实例 方法调用(栈帧)
线程共享 否(线程私有)
回收 GC 管理 方法结束自动弹出
速度
大小

2. 方法区到底在哪?

  • JDK 7 及以前:在堆内,叫永久代。
  • JDK 8+:移到本地内存,叫元空间(Metaspace),默认不限大小(受系统内存限制)。

上述属个人学习后的见解,如有错误欢迎在评论区留言,我们一起进步。

相关推荐
桦说编程1 小时前
Java 中如何创建不可变类型
java·后端·函数式编程
lifallen1 小时前
Java Stream sort算子实现:SortedOps
java·开发语言
IT毕设实战小研1 小时前
基于Spring Boot 4s店车辆管理系统 租车管理系统 停车位管理系统 智慧车辆管理系统
java·开发语言·spring boot·后端·spring·毕业设计·课程设计
CCCC13101632 小时前
嵌入式学习(day 28)线程
jvm·学习
没有bug.的程序员2 小时前
JVM 总览与运行原理:深入Java虚拟机的核心引擎
java·jvm·python·虚拟机
甄超锋2 小时前
Java ArrayList的介绍及用法
java·windows·spring boot·python·spring·spring cloud·tomcat
cui__OaO3 小时前
Linux软件编程--线程
linux·开发语言·线程·互斥锁·死锁·信号量·嵌入式学习
阿华的代码王国3 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
Zyy~3 小时前
《设计模式》装饰模式
java·设计模式
A尘埃3 小时前
企业级Java项目和大模型结合场景(智能客服系统:电商、金融、政务、企业)
java·金融·政务·智能客服系统