面试官问:运行时的内存布局
![面试官问:运行时的内存布局](https://static001.geekbang.org/infoq/c5/c587d234037410e6f230f7e25d92b13e.webp)
![](https://static001.geekbang.org/infoq/18/1899448b8772f17d83ad2677470aa767.png)
1 JVM 的内存区域布局
java 代码的执行步骤有三点
JVM 执行的字节码需要用类加载来载入;字节码文件可以来自本地文件,可以在网络上获取,也可以实时生成。就是说你可以跳过写 java 代码阶段,直接生成字节码交由 JVM 执行
其中 Java 虚拟机栈、程序计数器、Heap、本地方法栈、Metaspace 属于 JVM 运行时的内存;按是否线程共享则可以分两类
![](https://static001.geekbang.org/infoq/05/05fa83aaa1344cbc036102cf6342c95a.png)
JAVA 堆和 MetasSpace 元空间属于线程共享的;虚拟机栈和本地方法栈、程序计数器是线程私有的
2 JVM 五大数据区域介绍
2.1 程序计数器(Progarm Counter Register)
2.2 虚拟机栈 (Virtual Machine Stack)
![](https://static001.geekbang.org/infoq/d0/d0e21dfdab2c021b74dc2bc54d285813.png)
2.3 本地方法栈 (Native Method Stack)
上述 3 类区域,生命周期与 Thread 相同,即:线程创建时,相应的内存区创建,线程销毁时,释放相应内存
2.4 堆 (Heap)
![](https://static001.geekbang.org/infoq/69/692dd12dc1d959e42ff511bf48e14685.png)
2.5 元空间 (MetaSpace)
使用元空间代替永久代原因
CodeCache
直接内存
3 JVM 运行时内存布局和 JMM 内存模型区别
![](https://static001.geekbang.org/infoq/d8/d80332fb249ca3c7ae50f44dbdbec39f.png)
JVM 内存区域是指 JVM 运行时将内存数据分区域存储,强调对内存空间的划分
JAVA 内存模型是 Java 语言在多线程并发情况下对于共享变量内存操作的规范:解决变量在多线程的可见性、原子性的问题
4 JMM 内存模型交互操作
内存交互操作有八种,虚拟机的实现保证每一个操作都是原子性的
read 和 load 好像是相同的操作?各位有何高见,请指教下
JMM 对这八种指令的使用,制定了如下规则
*
欢迎指正文中错误
参考文章
深入理解 Java 虚拟机
JVM 之内存布局超详细整理 [1]
Metaspace 之一:Metaspace 整体介绍 [2]
参考资料
[1]
JVM 之内存布局超详细整理: https://blog.csdn.net/mayfly_hml/article/details/102805030
[2]
Metaspace 之一:Metaspace 整体介绍: https://www.cnblogs.com/duanxz/p/3520829.html
评论