400 028 6601

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

JVM运行时数据区-创新互联

文章目录
本文基于JDK8进行分析

创新互联是网站建设技术企业,为成都企业提供专业的成都网站设计、网站制作、外贸营销网站建设,网站设计,网站制作,网站改版等技术服务。拥有十余年丰富建站经验和众多成功案例,为您定制适合企业的网站。十余年品质,值得信赖!图形概述

忘了什么时候,在哪里听到这么一句话,一图胜千言,从后来的工作经历中验证,图形展示的内容确实会加深记忆,不容易忘记。

先上图片,运行时数据区布局概览,元空间和CodeCache(JIT编译后的代码)又称为非堆区域。
在这里插入图片描述
在Hotspot虚拟中,本地方法栈已合并到虚拟机栈,上图用相同颜色标记。
对运行时数据区有了整体的认知后,在来一张从线程安全角度来看运行时数据区的图片,加深下记忆,接下来本篇会从程序计数器、虚拟机栈、堆、元空间进行详细讲解,ThreadLocal后续再开一片单独讲解,或是放到JUC中讲解。
在这里插入图片描述

程序计数器 概念示例
public static void main(String[] args) {int a = 1;
        int b = 2;
        System.out.println(a + b);
    }

有两种方式可以查看到程序计数器,在终端可以执行javap -v ProgramCounterRegister.class,或是使用jclasslib插件。
在这里插入图片描述

讨论
  1. 使用程序计数器存储字节码指令地址有什么用?
    CPU在取得时间片的线程间不停切换,切换回来的时候要知道从哪里继续执行。
  2. 程序计数器为何被设置为线程私有?
    CPU不停的做任务切换,这样必然会导致经常中断或恢复,为了能准确记录各个线程正在执行的当前字节码指令地址,最好的办法就是每个线程都有自己的程序计数器。线程间不会相互影响。
虚拟机栈(本地方法栈) 栈帧概述栈帧结构局部变量表Variable Slot操作数栈JVM基于栈的字节码解释执行引擎

标题中栈指的就是操作数栈,本小节将展示基于栈的解释器执行过程,下面引用《深入理解Java虚拟机》(第三版)中的示例进行展示。

// 代码
    public int calc() {int a = 100;
        int b = 200;
        int c = 300;
        return (a + b) * c;
    }

字节码指令,截图中显示这段代码需要深度为2的操作数栈和4个变量槽的局部变量空间。
在这里插入图片描述
代码执行过程中,操作数栈、局部变量表的变化如图1至图6所示。
在这里插入图片描述
图1,执行程序计数器地址为0的指令,bipush指令作用是将100压入操作数栈顶。
图2,执行程序计数器地址为2的指令,istore_1指令作用是将操作数栈顶的整型值出栈并存放到局部变量表地址为1的变量槽中。
图3,执行程序计数器地址为11的指令,iload_1的作用是将局部变量表中地址为1的变量槽中的整型值100复制到操作数栈顶。
图4,和图3相同操作,将200复制到操作数栈顶。
图5,iadd的作用是将操作数栈中头两个栈顶元素出栈,做整型加法,然后把结果重新入栈。iadd执行完毕,100、200被出栈,计算结果300被重新入栈。
图6,和图3相同操作,将局部变量表中地址为3的变量槽中的300压入操作数栈,imul是将两个300出栈,然后做整型乘法,再将结果90000压入操作数栈,ireturn将90000返回给调用者。

动态连接方法返回地址

一个方法执行后有两种方式退出。

  1. 正常退出,此时可能会有返回值传递给调用者。
  2. 异常退出,不会给上层调用者提供任何返回值。

无论采用何种方式退出,在方法退出后都必须返回到最初方法被调用的位置,程序才能继续执行,方法返回是需要栈帧中保存一些信息,用来帮助恢复它的上层调用者的执行状态。

  1. 正常退出时,调用者的程序计数器的值可以作为返回地址。
  2. 异常退出时,返回地址通过异常处理器表确定,栈帧中不存。
附加信息

《Java虚拟机规范》允许虚拟机实现增加一些规范里没有描述的信息到栈帧之中,例如与调试、 性能收集相关的信息,这部分信息完全取决于具体的虚拟机实现。

栈运行原理本地方法栈

说到堆就很难绕开对象创建,垃圾回收等内容,但是本小节不涉及垃圾回收的内容,后续会单独开篇讲解。

分代思想

先来个全局图。
在这里插入图片描述

设置堆内存的参数内存分配策略对象在分代空间中流转

对象通常在Eden区里诞生,如果经过第一次新生代 GC后仍然存活,并且能被Survivor容纳的话,该对象会被移动到Survivor空间中,并且将其对象 年龄设为1岁。对象在Survivor区中每熬过一次Minor GC,就在两个survivor(S0、S1)中完成一次移动,年龄增加1岁,当它的年龄增加到一定程度(默认为15),就会被晋升到老年代中。对象晋升老年代的年龄阈值,可以通过参数-XX:
M axTenuringThreshold设置。
在这里插入图片描述

方法区(元空间) 概述设置元空间内存大小运行时常量池虚拟机栈、堆、方法区交互

在这里插入图片描述

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


当前文章:JVM运行时数据区-创新互联
转载来源:http://www.bluegullmedia.com/article/djjocs.html

其他资讯

让你的专属顾问为你服务

0.0400s