感性的理解JVM

感性的理解JVM


  • jvm 基础

    • jvm是什么?

      JVM是Java Virtual Mechine的缩写。它是一种基于计算设备的规范,是一台虚拟机,即虚构的计算机

    • jdk是什么

      Java Runtime Environment Java的开发工具包 例如:javac 编译

    • jre是什么

      Java Runtime Environment 也就是JVM的运行类库

  • jvm运行时区域

    • 主要包含:程序计数器(Program Counter),Java堆(Heap),Java虚拟机栈(Stack),本地方法栈(Native Stack),方法区(Method Area)
    • 程序计数器:

      指向当前线程正在执行的字节码指令的地址(行号)

    • 虚拟机栈(先进后出):
      • 存储当前线程运行方法时所需的数据、指令、返回地址(一个方法一个栈帧)
      • 栈帧:
        1. 局部变量表:存储基本数据类型(int, boolean, char, short, byte, long, float, double)、对象的引用
        2. 操作数栈: 操作栈和局部变量数组会频繁的交换数据
        3. 动态链接: 控制着运行时常量池和栈帧的连接
        4. 出口: 正常、异常
    • 本地方法栈:

      执行的是Native方法,为Native方法服务

    • 方法区(线程共享、永久代):存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码数据等
    • 堆(线程共享): 在运行时分配类实例、数组,几乎所有的对象实例都在这里分配内存(随着技术的发展,已不绝对)
  • jvm内存模型 JMM(原子性、可见性、有序性)
    • 什么是???

      为了应对在并发内存访问条件下操作会产生歧义的问题,java内存模型产生

    • 主内存和工作内存

      Java内存模型规定了所有的变量都存储在主内存(Main Memory)中,每条线程还有自己的工作内存(Working Memory),线程的工作内存中保存了被该线程使用到的变量和主内存副本拷贝

    • volatile型变量的特殊规则
      1. 保证此变量对所有线程的”可见性”

        所谓”可见性”是指当一条线程修改了这个变量的值,新值对于其它线程来说都是可以立即得知的,而普通变量不能做到这一点,普通变量的值在在线程间传递均需要通过主内存来完成,volatile只保证了可见性,并不保证基于volatile变量的运算在并罚下是安全的

      2. 使用volatile变量的第二个语义是禁止指令重排序优化

        普通变量仅仅会保证在该方法的执行过程中所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值操作的顺序与程序代码中的执行顺序一致。

    • 总结一下Java内存模型对volatile变量定义的特殊规则:
      1. 在工作内存中,每次使用某个变量的时候都必须线从主内存刷新最新的值,用于保证能看见其他线程对该变量所做的修改之后的值
      2. 在工作内存中,每次修改完某个变量后都必须立刻同步回主内存中,用于保证其他线程能够看见自己对该变量所做的修改
      3. volatile修饰的变量不会被指令重排序优化,保证代码的执行顺序与程序顺序相同

自己在学习jvm时总结的一些知识点,欢迎大家进行指正

猜你喜欢

转载自blog.csdn.net/y534560449/article/details/81329943