JVM模型
# JVM内存模型
这里主要还是会问一些Java的内存模型,1.8之前和之后的内存模型是不一样的
简单说一下每个部分是干嘛的吧
- 程序计数器 用于记录程序执行的位置(字节码解释器可以改变这个来选取下一条执行的指令)
- 虚拟机栈 描述的是java方法执行的内存模型,每个方法执行都会创建一个栈帧,栈帧包含局部变量表、操作数栈、动态连接、方法出口等。
- 本地方法栈 本地方法栈则为虚拟机使用到的 Native 方法服务。 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一,本地方法被执行的时候,在本地方法栈也会创建一个栈帧,用于存放该本地方法的局部变量表、操作数栈、动态链接、出口信息。方法执行完毕后相应的栈帧也会出栈并释放内存空间,也会出现StackOverFlowError 和 OutOfMemoryError 两种错误。
- 堆 Java 虚拟机所管理的内存中最大的一块,Java 堆是所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例以及数组都在这里分配内存。
- 方法区 与 Java 堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
- 元空间 jdk1.8之后,就把方法区放到元空间了,元空间直接放到本地内存了(这样我们就不用担心之前永久代内存溢出的问题,只要本地内存足够,就不会出现java.lang.OutOfMemoryError: PermGen space的错误)
还有一个更加详细的
参考:
# happens-before是啥
这个东西主要是为了解决并发编程中多线程的可见性。
为了方便程序员开发,将底层的烦琐细节屏蔽掉,JMM定义了Happens-Before原则。只要我们理解了Happens-Before原则,无需了解JVM底层的内存操作,就可以解决在并发编程中遇到的变量可见性问题。
JVM定义的Happens-Before原则是一组偏序关系:对于两个操作A和B,这两个操作可以在不同的线程中执行。如果A Happens-Before B,那么可以保证,当A操作执行完后,A操作的执行结果对B操作是可见的。
Happens-Before的规则包括:
- 程序顺序规则
- 锁定规则
- volatile变量规则
- 线程启动规则
- 线程结束规则
- 中断规则
- 终结器规则
- 传递性规则
参考
编辑 (opens new window)
上次更新: 2021/03/31, 20:52:00