hi,你好!欢迎访问本站!登录
本站由网站地图腾讯云宝塔系统阿里云强势驱动
当前位置:首页 - 教程 - 杂谈 - 正文 君子好学,自强不息!

JVM三部曲之运行时数据区 (第一部)

2019-11-18杂谈搜奇网28°c
A+ A-

在接下来的几天想总结下,JVM相干的一些内容,比方下面的这三个内容算是比较中心学问点了

1.运转时数据地区: 在运转时数据区里存储类Class文件元数据(要领区),对象和数组(堆),要领参数局部变量(栈)等。

2.垃圾接纳机制: java 言语的上风之一就是它的自动内存治理,重要接纳运转时数据地区的堆内存里的数据

3.类加载机制: 假造机起首须要把编译完成的字节码文件经由历程类加载器来加载到运转时数据地区

一个段Java代码的生命周期都邑少不了上图这几个步骤,也就是Java代码起首会被编译成字节码文件,以后被类加载器加载到运转时数据地区,以及运转,垃圾收集器接纳对象等等。

但本日我想引见第一个学问点《运转时数据地区》

1 运转时数据区

Java假造机定义了一系列逻辑数据地区,有些是跟着假造机的启动而建立,假造机的封闭而烧毁。另有一部份是跟着线程生命周期建立烧毁的。

我们有必要深切相识这块的内容,因为它将决议服务器机能,起首我们须要对全部运转时地区由团体的熟悉而且相识了每一个地区的生命周期以及作用以后才经由历程响应的调参来提拔体系机能。除此之外另有助于疾速定位假造机的相干Error.

逻辑上能够划出一下6个地区分别是

1.1 PC寄存器

全名叫做 Program Counter Register 既然是叫做寄存器了那末肯定是须要存东西,那究竟存的是什呢?
因为JVM同时能够处置惩罚多个线程所以就涉及到一些线程调理,当cpu停息运转线程A把时候片让给线程B的时候我们须要保留线程A被停息实行前的一些现场状况,须要纪录当前实行到那一行字节码了,所以具有保留现场的功用。

每条线程都有本身的pc寄存器,在恣意时候假造机只会实行一个要领

假如实行的是要领不是native要领 pc寄存器则保留指向当前实行字节码的指令地点

假如实行的是native要领 pc寄存器会保留undefined

1.2 java假造机栈

假造机栈也是每条线程私有的地区,里头存储栈帧(Frame),后面会重点引见栈帧算是重点内容。要领的挪用与返回基于栈帧来完成的。

1.3 假造机堆

在Java假造机中堆是一切线程都能够同享的内存地区,是寄存一切类实例和数组对象的处所。在假造机启动就依据相干堆参数,建立堆,他也是垃圾收集器事情的重要地区。
堆内存里的对象不会被显式的接纳,而是由垃圾接纳器接纳

为了合营垃圾收集器的特征我们能够把堆分为年青代和老年代

年青代又分了Eden和survivor区,重如果为了合营垃圾接纳算法而这么搞得。

1.4 要领区和运转时常量池

在Java假造机中 要领区是可供应各个线程同享的运转时内存地区,它存储了每一个类的组织信息,比方运转时常量池,字段和要领数据,组织函数和一般函数的字节码内容,一句话总结就是存储元数据处所

运转时常量池是class文件中每一个类或接口常量池表的示意情势。它包括了多少差别的常量,比方 从编译期可知的数值字面量到运转时才剖析取得的要领或字段援用等等。

建立机遇
每一个运转时常量池都在Java假造机的要领区中分配,在加载类和接口到假造机以后建立对应的运转时常量池

1.5 当地要领栈

假如我们想再Java底层里挪用别的言语代码的话就须要用到别的要领栈了,比方Java假造机的完成会用到传统的栈(C stack)来挪用native要领,这个就是当地要领栈的运用,固然这个不是必需完成的,完整取决于假造机的完成。

2 栈帧:

起首看下栈帧在假造机内存中在什么位置,

栈帧是用来存储数据和部份历程效果的数据组织,同时也用来处置惩罚动态链接,要领返回,非常分配等事情。栈帧的生命周期是跟要领一致的,跟着要领的挪用而建立,要领的完毕或许非常而烧毁。
每一个栈帧都由局部变量表,操纵数栈,动态链接构成的

2.1 局部变量表 (Local variable)

每一个栈帧内部都包括一组称为局部变量表的列表,变量表的长度在编译期决议。
一个局部变量能够存储一个基础数据范例或一个对象援用(referance),returnAddress的数据。存储long或double须要两个局部变量才存储。

当假造秘密运用局部变量内外的数据时经由历程索引来定位,默许从0最先,因为long和double占用两个局部变量所以它的索引较特别,取决于最小的谁人值,比方某个long范例数据在索引n和n+1里存储了,那末它对应的索引值就是n.
假造机经由历程局部变量表来完成要领挪用时的参数通报。假如是类要领,它的参数顺次从0最先的位置通报到局部变量表,假如是实例要领则第0位置存储地点对象的援用(this),从1最先通报参数。

2.2 操纵数栈 (Operating Stack)

操纵数栈是属于栈帧中的栈,实在它的全名叫做当前栈帧的初操纵数栈。栈,栈帧,操纵数栈的关联须要梳理清晰:

  • 栈:是假造机运转时数据区的一个逻辑地区,内里存储了一个个栈帧。
  • 栈帧:栈帧代表一个要领的全部生命周期,里头存储了局部变量表,操纵数栈,动态链接
  • 操纵数栈: 方才建立时操纵数栈是空的。假造机供应一些指令从局部变量表把一些常量或许变量值加载到操纵数栈,也供应了从操纵数栈取走数据的指令。
    挪用要领时操纵数栈用来预备挪用要领参数以及接收要领的返回效果。

2.3 动态链接 (Dynamic Linking)。

动态链接是用来完成运转时绑定操纵的。在栈帧中有一个指向常量池的当前类的一个援用。在class文件里一个要领如果挪用其他要领或许要领其他成员变量,则须要经由历程标记援用来示意。

  • 动态链接的作用就是将标记援用转换为直接援用。
  • 类加载的历程当中将要剖析尚未被剖析的标记援用,而且把对变量的接见转换为准确的偏移量。
  选择打赏方式
微信赞助

打赏

QQ钱包

打赏

支付宝赞助

打赏

  移步手机端
JVM三部曲之运行时数据区 (第一部)

1、打开你手机的二维码扫描APP
2、扫描左则的二维码
3、点击扫描获得的网址
4、可以在手机端阅读此文章
未定义标签

本文来源:搜奇网

本文地址:https://www.sou7.cn/282285.html

关注我们:微信搜索“搜奇网”添加我为好友

版权声明: 本文仅代表作者个人观点,与本站无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。请记住本站网址https://www.sou7.cn/搜奇网。

发表评论

选填

必填

必填

选填

请拖动滑块解锁
>>