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),默认不限大小(受系统内存限制)。

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

相关推荐
CodeCraft Studio7 分钟前
借助Aspose.HTML控件,在 Python 中将 HTML 转换为 Markdown
开发语言·python·html·markdown·aspose·html转markdown·asposel.html
QQ_4376643148 分钟前
C++11 右值引用 Lambda 表达式
java·开发语言·c++
永卿0018 分钟前
设计模式-迭代器模式
java·设计模式·迭代器模式
aramae9 分钟前
大话数据结构之<队列>
c语言·开发语言·数据结构·算法
誰能久伴不乏17 分钟前
Linux如何执行系统调用及高效执行系统调用:深入浅出的解析
java·服务器·前端
封奚泽优32 分钟前
使用Python实现单词记忆软件
开发语言·python·random·qpushbutton·qtwidgets·qtcore·qtgui
慕y27438 分钟前
Java学习第七十二部分——Zookeeper
java·学习·java-zookeeper
midsummer_woo43 分钟前
基于spring boot的医院挂号就诊系统(源码+论文)
java·spring boot·后端
_Aaron___1 小时前
面向对象的三大特性---多态
java
Kiri霧1 小时前
IntelliJ IDEA
java·ide·kotlin·intellij-idea