• JVM 运行时数据区(二)


    @

    运行时数据区

    JVM 运行时数据区主要分为5块

    • 方法区 JDK1.8以后叫做元数据区(Metaspace)
    • 堆区
    • 虚拟机栈区
    • 本地方法栈区
    • 程序计数器

    方法区和堆都是线程共享的,在JVM启动时创建,在JVM停止时销毁,而Java虚拟机栈、本地方法栈、程序计数器是线程私有的,随线程的创建而创建,随线程的结束而死亡。

    graph TB subgraph 线程A X((线程A)) C[虚拟机栈] D[本地方法栈] E[程序计数器] end subgraph 线程B Y((线程B)) H[虚拟机栈] I[本地方法栈] J[程序计数器] end subgraph 线程共享区 K((线程共享)) A[方法区] B[堆区] end X-->K Y-->K

    JDK1.7 -JVM运行时数据区

    graph TB subgraph 物理内存 subgraph JVM subgraph 共享区 A[方法区] B[堆区] end subgraph 隔离区 C[虚拟机栈区] D[本地方法栈区] E[程序计数器] end end end

    JDK1.8 -JVM运行时数据区

    graph TB subgraph 物理内存 subgraph JDK1.8 -JVM运行时数据区 B[堆区] subgraph 非共享区域 C[虚拟机栈区] D[本地方法栈区] E[程序计数器] end end A[元数据区] end

    共享区

    在JVM运行时数据区中,方法区和堆区 是各个线程内共享的内存区域

    堆区

    堆区 主要是存储运行时创建的对象,以及运行时常量池对象等

    方法区

    方法区 主要存放类的信息,常量,静态变量,运行时常量池以及JIT编译后代码等,JDK1.7以后把常量池里面的对象存放到了堆中,方法区里面存放的时候其引用地址

    隔离区

    虚拟机栈

    栈是一种数据结构,特点是FILO

    每当启动一个新的线程后,java虚拟机都会为它分配一个java栈。java以栈帧为单位保存线程的运行状态。虚拟机只会对java栈执行2中操作,以栈帧我单位的入栈和出栈。

    抛出的异常2种

    • OutOfMemoryError 表述虚拟机空间不足,没法申请到空间
    • StackOverflowError 线程请求的深度>大于虚拟机允许的深度

    栈帧

    栈帧部分组成:局部变量表,操作数栈,栈数据,动态链接,返回地址等。

    graph TB subgraph 虚拟机栈 subgraph 栈帧 A[局部变量表] B[操作数栈] X((栈帧)) C[动态链接] D[方法出口] end subgraph 栈帧 E[局部变量表] F[操作数栈] Y((栈帧)) H[动态链接] I[方法出口] end X-->Y end
    • 局部变量用于保存函数的参数已经局部变量的引用,局部变量表中的变量只是在当前的函数中有效,当函数调用结束后,跟随着函数栈帧的销毁,局部变量表也会随之销毁。局部变量表在编译期间就确定了大小。局部变量表的存储单位是以Variable Slot 为最小的单位,每个变量槽都可以存储32位长度的内存空间。
    • 操作数栈 主要用于保存计算过程中间结果,同时作为计算过程中变量临时存储。只支持出栈入栈的操作
    • 动态链接 每个栈帧都包含一个指向运行时常量池中该栈帧的所属方法的引用,持有这个引用是为了支持方法调用过程中的动态链接,在类的加载阶段中的解析过程会将符号引用转化为直接引用,这种转化也称为静态解析。另外一部分将在运行时转化为直接引用,这个部分称之为动态链接
    • 方法执行后 只有2中退出方法,一是方法返回指令,二是异常退出。

    本地方法栈

    这个个虚拟机栈一样,只不过这个是运行本地方法的内存模型。运行本地方法的时候也会去创建栈帧等一些列操作

    程序计数器

    程序计数器是一块较小的内存空间,维护着当先线程所执行的字节码行号,以便在CPU切换调度的时候能知道当先线程执行到了什么位置。如果当先线程正在执行本地方法(Native method)那么程序计数器是为空。

    程序计算器主要有2个作用:

    • 字节码的解释器可以通过修改程序计数器值来读取下一个指令,从而达到代码的流程控制,比如我们代码中创建的循环,异常处理等
    • 在多线程的情况下,程序计数器是用来保持当前线程执行的位置,当CPU切换执行时间片,切换回来的时候任然能继续执行上次执行的位置
    • 程序计数器 是唯一一个不会出现OOM的区域
  • 相关阅读:
    ​DBEngines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
    深入了解 BTree 和 B+Tree 的区别
    exec详解
    javascript之property's attributes
    极客公园之李彦宏讲话要点
    C++之auto_ptr
    javascript之属性状态控制Method
    ARM寄存器简介
    linux之fcntl
    http之100continue
  • 原文地址:https://www.cnblogs.com/burg-xun/p/12694676.html
Copyright © 2020-2023  润新知