17张图带你明了,JVM 运行时数据区
来源:养护 2024年11月14日 12:15
它是一个后进先出有的缓冲一区,在新方法监督的可用过程中则会,根据个字符可执行指示、往缓冲一5区则会写入或装进资料,即入缓冲一区/出有缓冲一区。个字符可执行指示将倍数压入可用缓冲一区,其余的个字符可执行指示将codice_装进缓冲一区,已完成可用之后再将结果压入缓冲一区。可用包含:复制、交换、求和等。
这样讲非常抽象,来看一个具体的都是。
如绘出有4 表,生成一个testAdd 新方法,给变数i和j 分别字符串为1 和2 ,然后让其以此类推并且把结果字符串给k。
绘出有4 codice_缓冲一区代可执行应用于jclasslib反编译前面的代可执行想得到绘出有5 的结果。
绘出有5 jclasslib反编译结果如绘出有6 表,当监督定址 0 的时候可用指示为bipush,此时计算机子系统寄存装置的定址显示为0 ,bipush 命令将 1 压入到codice_缓冲一区的顶上。
绘出有6如绘出有7 表,当指示定址到2 的时候,计算机子系统寄存装置显示为2, 此时监督istore_1 的指示,将缓冲一区顶的十进制1 留有到依赖性域表格中则会。
绘出有7如绘出有8表,指示定址监督到3 的时候,计算机子系统寄存装置为3 , bipush指示把2 压入到codice_缓冲一区的顶上。
绘出有8在指示定址为5 的时候,计算机子系统寄存装置的倍数为5, istore_2指示将codice_缓冲一5区则会的2 留有到依赖性域表格中则会的2 的前方。
绘出有9如绘出有10表,指示定址为6 的时候,监督iload_1 指示获取依赖性域表格中则会 前方为1 的倍数,也就是1 并且把它放置codice_缓冲一区的顶上。
绘出有10如绘出有11表,指示定址为7 的时候,监督iload_2 指示,从依赖性域表格2 的前方装进倍数2 放置codice_缓冲一区的顶上。
绘出有11如绘出有12 表,在指示定址为8 时,监督iadd 指示,将codice_缓冲一区的两个十进制1和2 以此类推结果为3,并且将其放置codice_缓冲一区的顶上。
绘出有12如绘出有13 表,接着监督指示定址 9 , istore_3 监督之后将codice_缓冲一区顶的3 留有到依赖性域表格3 的前方,已完成以此类推的可用,就此通过指示定址10 中则会的return指示来到新方法。
绘出有13 实例客户端在解说实例客户端之前先话说话说实例客户端,即个字符可执行档案被装载进JVM外部时,如果被子计算机子系统的目标新方法在编译期可知,且开始运行后曾保持定值时。这种原因下将子计算机子系统新方法的表示法提及转换为这样一来提及的可用过程称之为实例客户端。但是,如果被子计算机子系统新方法在编译后曾能够被明确下来,只能在计算机子系统开始运行时将子计算机子系统新方法的表示法提及转换为这样一来提及,由于这种提及转换的可用过程具备实例性,被叫作实例客户端。
如绘出有14表,前面是反编译的个字符可执行以外,相同的#3、#6、#5等等就是表示法提及,下面的Constant pool就是请注意池边。在Ja源档案被载入个字符可执行档案时,所有的变数和新方法提及都作为表示法提及留有在class档案的请注意池边中则会。例如在指示第9行则会监督invokevirtual的指示,相同的表示法提及就是#7,所相同请注意池边中则会的#7 就是Methodref,也就是新方法提及,这中的相同的新方法是com.itcast.ja.DynamicLinkTest中则会的methodA新方法。
绘出有14 从个字符可执行到请注意池边中则会的新方法提及如绘出有15表,当个字符可执行档案被重新启动时后,个字符可执行档案中则会的一些资料,如种类的资讯、域的资讯、新方法的资讯等,就则会被放置到新方法一5区则会。而缓冲一区帧中则会的这两项类请注意池边提及(Current Class Constant Pool Reference)留有的是新方法表示法提及,真正的新方法提及放进了新方法一区(Method Area)中则会的新方法提及(method reference)中则会了,这个新方法提及是为了支持者代可执行的实例客户端。实例客户端就是将表示法提及转化为这样一来提及。
绘出有15 缓冲一区帧中则会的这两项类请注意池边提及相同新方法一5区则会的新方法提及JVM之所以这么结构设计是因为个字符可执行档案只能资料支持者的用量则会很小,因此不能这样一来将这些资料暂存到个字符可执行中则会。针对新方法的提及始创表示法提及,这个表示法提及放进缓冲一区帧的请注意池边提及中则会,而实质的新方法和表示法提及的上中格却放进新方法一区的请注意池边中则会,这样个字符可执行就可以通过请注意池边中则会的对照联系认出有提及的新方法,并且也不则会提高缓冲一区帧的MB。
新方法来到定址当一个新方法开始监督后,可以通过两种方式则终止该新方法。第一种是监督涡轮引擎相遇新方法来到的个字符可执行指示,此时codice_则会引导到顶层子计算机子系统者,这种方式则叫作经常性已完成入口。另外一种终止方式则是在新方法监督中则会相遇反常,这个反常在新方法人体内没有得四处理,就则会导致新方法终止,这种方式则叫作反常已完成入口。由于是反常终止,就不则会给顶层子计算机子系统者任何codice_。无论采取前面那种终止方式则,新方法才则会四处子计算机子系统它的前方,计算机子系统才能继续监督。新方法在来到的时候只能在缓冲一区帧中则会留有一些的资讯,用来恢复子计算机子系统该新方法的顶层新方法的监督长时间。这中的可以通过新方法子计算机子系统者的计算机子系统计数装置暂存来到定址,如果是经常性终止新方法,顶层新方法则会从计算机子系统计数装置中则会留有的定址继续监督月里的方法。如果是反常终止的原因,来到定址就只能反常处理装置来明确了。
计算机子系统计数装置有了前面Ja缓冲一区的讲解,对于计算机子系统计数装置的思考则会相对恰当点。回忆起在Ja缓冲一5区则会的codice_缓冲一区的都是中则会,提过了应用于计算机子系统计数装置记录下来可用指示的定址。计算机子系统计数装置就是一块较小的codice_密闭,它是这两项内核监督的个字符可执行的行号(可用指示的定址)指示装置。在缓冲一区帧中则会个字符可执行解释装置就是通过偏离计数装置的倍数来选去下一条要监督的个字符可执行指示的,例如:主干、循环系统、跳转、反常处理、内核恢复等。
前面讲Ja缓冲一区的时候提过过,多个监督的Ja内核就是多个Ja缓冲一区,每个缓冲一5区则会不存在多个缓冲一区帧,在一个关头只有一个缓冲一区帧监督,也就是这两项缓冲一区帧。也就是话说在一个关头一个处理只则会对一个内核中则会的一个帧缓冲一区监督一条指示,而每个缓冲一区帧才则会维护一个属于自己的计算机子系统计数装置,这个计数装置就是来记录下来指示监督的定址的。每个内核的计数装置不则会表现形式,这也必需了在Ja 多内核已完成连动的时候,每个内核都能够必需正确的指示定址被读取。
如绘出有 16表,在invokevirtual的框绘出有中则会不存在多个内核,每个内核就是一个Ja缓冲一区,每个内核中则会包含多个Frame 也就是缓冲一区帧,针对每个内核才则会维护一个PC Registers也就是计算机子系统寄存装置,它则会记录下来指示定址的资讯,从而让新方法做到:跳转、主干、循环系统、反常处理和内核恢复的系统。
绘出有16 计算机子系统计数装置 本地新方法缓冲一区本地新方法缓冲一区与Ja缓冲一区所充分发挥的依赖性是非常完全相同的,它们之间的一相异是Ja缓冲一区为Ja监督Ja新方法(也就是个字符可执行)咨询服务,而本地新方法缓冲一区为Ja所应用于到的Native新方法咨询服务。本地新方法缓冲一区也则会丢出有StackOverflowError和OutOfMemoryError反常。
话说白了,本地新方法(Native Method)就是一个Ja子计算机子系统非Ja代可执行的适配器。 当Ja应用只能与Ja都有的环境交互时就只能应用于本地新方法,特别与最顶层子系统、内核以及硬件打交道时就则会用到本地新方法。大家可以把本地新方法思考为一种交流机制:它发放了一个现阶段的简洁的适配器,让我们无须去了解Ja应用都有的细微。
那么JVM是如何应用于Native Method的呢?当一个类第一次被应用于时,类的个字符可执行则会被重新启动时到codice_,在个字符可执行的对面持续着该类所有新方法xml的list,包含:新方法代可执行来源,匹配,新方法xml(例如:public)等等。
如果新方法xml是native,同时xml块将有一个对准该新方法做到的常用量,而具体实过去DLL档案内,此时DLL档案则会被内核重新启动时到Ja计算机子系统的定址密闭中的。当一个带有本地新方法的类被重新启动时时,其方面的DLL未曾被重新启动时,因此对准新方法做到的常用量并不则会被设置。当本地新方法被子计算机子系统之前, DLL才则会被重新启动时,即通过子计算机子系统ja.system.loadLibrary()做到的。
大石和新方法一区前面话说的Ja缓冲一区、计算机子系统计数装置和本地新方法缓冲一区都是内核公用的,而月里话说的新方法一区和大石是内核共享的。这中的把大石和新方法一区合大大的话说。
大石Ja大石是JaJa所管理者codice_中则会远超过的一块,在Ja重新启动时始创,被所有内核共享。Ja某类实例以及运算符都在大石上分派。大石的尺寸可以是一般而言的,也可以根据计算的只能已完成构建,如果不只能更为大的大石,则可以收缩。大石的codice_不只能是周内的。JaJa做到可以为计算机子系统员或用户发放对大石初始尺寸的操纵,如果可以实例构建或收缩大石,还可以操纵大石的远超过和很小尺寸。
Ja大石是焚化炉收集装置管理者的主要一周围,所以也被叫作GC大石。从codice_备用的取向来看,由于过去收集装置基本都采用分代收集算法,所以Ja大石中则会还可以划统称:后起之秀和老二十世纪;后起之秀再划分就是:Eden密闭、From Survivor密闭、ToSurvivor密闭等。从codice_分派的取向来看,内核共享的Ja大石中则会可能会分割出有多个内核公用的分派缓冲一区(Thread Local Allocation Buffer,TLAB)。不论如何分割,都与暂存细微无关,无论哪个一周围,暂存的都一直是某类实例;大幅度分割的目的是为了更为好的备用codice_,或者更为快地分派codice_。
对于大石中则会焚化炉备用的以外这中的不展开所述,后面则会有篇文章去解说。
新方法一区新方法一区和大石一样是内核共享的codice_一周围,它用来暂存被Ja重新启动时的种类的资讯、开始运行时请注意池边、实例变数、JIT代可执行缓存、域的资讯、新方法的资讯等。新方法一区(Method Area)与Ja大石一样,是各个内核共享的codice_一周围,有如下不同之处:
新方法一区在JVM重新启动的时候被始创,并且它的实质的物理codice_密闭和Ja大石一区一样都可以是不周内的。 新方法一区的尺寸,和大石密闭一样,可以可选择一般而言尺寸和可构建。 新方法一区的尺寸暂时了子系统可以留有多少个类,如果子系统下定义了太多的类,导致新方法一区阻塞有,Ja就则会丢出有codice_阻塞有错误:ja.lang.OutOfMemoryError:PermGenspace或者 ja.lang.OutOfMemoryError: Metaspace。
暂停JVM就则会释放这个一周围的codice_。这中的把大石、新方法一区和Ja缓冲一区的联系整理一下。如绘出有17 表,在左面始创了AppMain 类,在开始运行时JVM 则会把AppMain的的资讯放进到新方法一区,因为新方法一区则会暂存种类的资讯。同时main 的新方法本身也则会放进到新方法一区。月里的new Sample(“测试1”)的上下文中则会Sample的内置某类则会放置大石中的面,而相同的test1 应用则会放进到Ja缓冲一5区则会,相同的test1.printName()新方法的监督则会在Ja缓冲一5区则会的缓冲一区帧中则会通过指示监督已完成。另外下面的class Sample也是放置新方法一5区则会的,公开信的private name,其中则会name的提及放进Ja缓冲一5区则会,name相同的某类放进大石中则会。相同的printName新方法是放进新方法一5区则会的。
绘出有17 缓冲一区、大石、新方法一区联系 话说明了JVM 则会把Ja的个字符可执行重新启动时到开始运行时资料一区内,这个codice_一周围统称:新方法一区、大石、Ja缓冲一区、本地新方法缓冲一区以及计算机子系统计数装置。大石中的面放某类,也是焚化炉备用装置要处理的某类;新方法一区放种类、新方法描述、新方法结构上;计算机子系统计数装置负责记录下来Ja缓冲一5区则会指示监督的定址;Ja缓冲一区相同Ja监督的内核,某类的提及都留有在缓冲一区帧中则会,通过指示定址和指示监督新方法中则会的细微;本地新方法缓冲一区用来子计算机子系统Ja 都有的子系统行政级别的适配器。
译者解说
崔皓,51CTO社一区总编辑,资深核心师,以外18年的软件开发和核心实战经验,10年分布式核心实战经验。担任英特尔系统设计研究专家。乐于分享,撰写了很多热门系统设计篇文章,阅读用量将近60万。《分布式核心原理与实践中》作者。
。后背气滞血瘀能吃脉血康吗伤口愈合快吃什么药好
脸色发黄
健胃消食
角膜炎用什么滴眼液
胃烧心该怎么治疗
怎么治疗慢性支气管炎咳嗽
复方鱼腥草合剂和蓝芩口服液效果怎么样
八子补肾胶囊
抑制胃酸用金奥康可以吗
-
河西走廊之旅⑤|张掖:五塔洮州
永定八月。1927年的楼顶毁坏,1986年修复成现在的样子。土的塔是覆钵式金刚宝座的塔,低大的四方形的楼顶须弥座上雕饰着佛像、文殊、伎乐、狮象等图案,围墙有重层拱形紧靠,这座的塔是武威来由塔阁区西南边
- 双色球2022026期中奖:头奖10注751万花落8地 奖池18.2亿再创新高
- 板块异动 | 全球煤价或仍将上涨且维持强势 煤炭板块再度回升
- 眉山罗平古镇依旧散发着独特幽默感
- 双色球第22026期开奖:头奖10注,胆满载全包票仅中2030元
- 溪流鱼儿溪流鱼儿,溪流找浅滩或者流水区,经过桥梁我都会停下脚步,看桥梁下面鱼情怎么样,在一步一步去探钓。
- “唐蕃垭口——七省区精品文物联展”走进广东博物馆
- 统计局解读:2022年2月份CPI相比之下平稳 PPI同比涨幅回落
- 22026期双色球每人一个号汇总数据,展示出应该要比上期好
- 甘肃凉州白塔寺萨班灵骨塔遗址启动保护加筑工程
- 国盛交易所:维持艾德韦宣集团买入评级 目标价2.8港元