JVM是JAVA虚拟机,JMM是JAVA内存模型。
JVM内存模型
JVM内存模型主要指运行时的数据区,包括5个部分
线程私有:
- 栈也就方法栈,是线程私有的,线程在执行每个方法时都会同时创建一个栈帧,用来存储局部变量表、操作栈、动态链接、方法出口等信息。调用方法时执行入栈,方法返回时执行出栈。
- 本地方法栈与栈类似,也是用来保存线程执行方法时的信息,不同的是,执行java方法使用栈,而执行native方法使用本地方法栈。
- 程序计数器保存着当前线程所执行的字节码位置,每个线程工作时都有一个独立的计数器。程序计数器为执行java程序服务,如果是native方法,则程序计数器为空。
线程共享
- 堆是JVM管理的内存中最大的一块,堆被所有线程共享,目的是为了存放对象实例,几乎所有的对象实例都在这里分配,当堆内存没有可用的空间时,会抛出OOM异常。根据对象存活的周期不同,JVM把堆内存进行分代管理,有垃圾回收器来进行对象的回收管理。
- 方法区也是各个线程共享的内存区域,又叫非堆区。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,JDK1.7中的永久代和JDK1.8中的元空间都是方法区的一种实现。
JMM内存可见性
JMM是Java内存模型,与JVM