在面试中经常会遇到Java内存模型和JVM内存结构这两个问题,相信也有不少人对这两个概念感到模糊,今天我们就来聊聊这两个概念。看看究竟什么是Java内存模型、什么是JVM内存结构。
Java内存模型
即Java Memory Model(JMM),是一种符合内存模型规范的,屏蔽了各种硬件和操作系统访问差异的,保证Java在不同平台下操作内存时的结果一致性的机制和规范(约定),其目的是为了解决有多线程利用共享内存通信时存在的原子性、可见性及有序性问题。
为了保证共享内存的正确性(原子性、可见性和有序性),内存模型定义了共享内存系统中多线程读写操作的行为规范。同时提供了synchronized、volatile、concurrent包下等原语供开发者使用。
参考内容求你了,再问你Java内存模型的时候别再给我讲堆栈方法区了
JVM内存结构
由于不同JVM的实现可能不同,此处以Java 8来分析JVM内存结构
- PC Register 即 program counter register
- JVM Stacks
- Heap
- Method Area
- Run-Time Constant Pool
- Native Method Stack
其中PC Register、Stacks、Native Method Stacks是线程级别的,为线程私有。而Heap、Method Area及Run-time Constant pool是JVM级别的,为所有线程共享。下面我们逐一说明。
- PC Register
官方介绍中有如下说明,Each JVM thread has their own pc register(即计数器是线程私有的)。若当前线程正在执行的方法是非native的,则程序计数器会持有当前方法的JVM指令集地址,也就是returnAddress类型变量(namely is returnAddress),原文是the pc register contains the address of the Java Virtual Machine instruction currently being executed
若当前线程正在执行native方法,程序计数器则为null。 - JVM Stacks
官方介绍中有如下说明,Each Java Virtual Machine thread has a private Java Virtual Machine stack, created at the same time as the thread. 即Stack是随着JVM线程启动而启动的。另外,Stacks中存储栈帧(Frame),JVM 栈不会直接操作变量,只参与对栈帧的压栈和出栈。 - Heap
在官方介绍中说明了堆内存是JVM共享的,且随着JVM启动而启动,原文如下:
The Java Virtual Machine has a heap that is shared among all Java Virtual Machine threads. The heap is the run-time data area from which memory for all class instances and arrays is allocated. The heap is created on virtual machine start-up. - Method Area
方法区也是随着JVM启动而启动的,在Java 8 的实现中逻辑上是堆的一部分。主要用来存储类的结构(这就涉及到Java对象模型,感兴趣的可以自己了解),运行时常量池、方法、类的初始化方法等。原文如下:
The method area is created on virtual machine start-up. Although the method area is logically part of the heap.The Java Virtual Machine has a method area that is shared among all Java Virtual Machine threads. It stores per-class structures such as the run-time constant pool, field and method data, and the code for methods and constructors, including the special methods (§2.9) used in class and instance initialization and interface initialization. - Run-Time Constant Pool
运行时常量池是随着类或接口创建时创建的。原文如下:
Each run-time constant pool is allocated from the Java Virtual Machine's method area (§2.5.4). The run-time constant pool for a class or interface is constructed when the class or interface is created (§5.3) by the Java Virtual Machine. - Native Method Stacks
本地方法栈,通常来说是常规栈的一部分。随着线程创建而创建。
JVM结构图如下
至此我们了解了JVM内存结构和Java内存模型的区别,并介绍了JVM内存结构及各部分的生命周期。相信大家再遇到这两个问题的时候不会在犯迷糊了。