备注:没有JVM内存模型的说法!只说:Java内存模型(JMM)。
备注:没有Java内存结构的说法!只说: JVM内存结构 / Java内存区域。
一、计算机内存模型?
二、Java内存模型(JMM)?
Java内存模型(Java memory model):简称JMM。
【以后不要说“JVM内存模型”的术语,会被嘲笑的!】
2.1简单概述(我在其他文章详解)
- JMM并不像JVM内存结构一样是真实存在的。他只是一个抽象的概念。
- JMM是和多线程相关的,他描述了一组规则或规范,这个规范定义了一个线程对共享变量的写入时对另一个线程是可见的。
- 简单总结下,Java的多线程之间是通过共享内存进行通信的,而由于采用共享内存进行通信,在通信过程中会存在一系列如可见性、原子性、顺序性等问题,而JMM就是围绕着多线程通信以及与其相关的一系列特性而建立的模型。JMM定义了一些语法集,这些语法集映射到Java语言中就是volatile、synchronized等关键字。
- 在Java中,JMM是一个非常重要的概念,正是由于有了JMM,Java的并发编程才能避免很多问题。这里就不对Java内存模型做更加详细的介绍了,想了解更多的朋友可以参考《Java并发编程的艺术》。
2.2图解
- 手绘板图解(JMM):
- 网图1:
- 网图2
三、JVM内存结构(Java内存区域)?
JVM内存结构,也称Java内存区域,指的是Java运行时数据区:
堆、方法区、
栈、本地方法栈、程序计数器。
Java非运行时数据区是:直接内存。
3.1概述
略。
3.2图解
- 手绘板(运行时数据区部分)
- 网图1(运行时数据区部分)
- 网图2(运行时数据区部分)
- 网图3(运行时数据区部分)
3.3详细图解
- JDK1.7及以前,图解:
- JDK1.8及以后,图解:
- JVM内存结构,JDK1.7和JDK1.8区别:
就是有一个元数据区替代方法区了。
JDK 1.7 其实是并没完全移除方法区,但是不会像1.6以前报 “java.lang.OutOfMemoryError: PermGen space”,而是报 “java.lang.OutOfMemoryError: Java heap space”。
1.7部分内容(比如 常量池、静态变量由方法区转移到了堆中)
3.4名词解释(我的其他文章会详细讲)
- 堆:包含年轻代(新生代)、老年代。比例1:2。
- 方法区:方法区就是永久代。不过JDK1.8删除了永久代,替换为元空间。
- 新生代:包含Eden、S0、S1三个区。比例8:1:1。
四、Java对象模型?
见链接 https://www.zhihu.com/question/64586462
五、总结
Java内存模型,和Java的并发编程有关。
JVM内存结构,和Java虚拟机的运行时数据区域有关。
Java对象模型,和Java对象在虚拟机中的表现形式有关。
六、提供学习链接
Java内存模型(指令重排序、volatile):
https://juejin.cn/post/6919350421685288973
https://www.zhihu.com/question/64586462
JVM内存结构:https://www.zhihu.com/question/64586462
https://zhuanlan.zhihu.com/p/38348646