自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

簡(jiǎn)單介紹Inside JVM體系結(jié)構(gòu)

開發(fā) 后端
JVM的體系結(jié)構(gòu)根據(jù)JVM的規(guī)范可分為類裝載子系統(tǒng),運(yùn)行時(shí)數(shù)據(jù)區(qū),執(zhí)行引擎。本文將為大家介紹Inside JVM體系結(jié)構(gòu)。

當(dāng)Inside JVM運(yùn)行程序時(shí),字節(jié)碼,創(chuàng)建的對(duì)象,傳遞給方法的參數(shù),返回值,局部變量以及運(yùn)算的中間結(jié)果保存在運(yùn)行時(shí)數(shù)據(jù)區(qū)中。規(guī)范本身對(duì)運(yùn)行時(shí)數(shù)據(jù)區(qū)只有抽象的描述,也使得JVM可以容易的在各種計(jì)算機(jī)和設(shè)備上實(shí)現(xiàn)。

Inside JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)

1方法區(qū):

JVM中被裝載的類型信息存儲(chǔ)在一個(gè)邏輯上被稱為方法區(qū)的內(nèi)存中,JVM在裝載完CLASS文件后提取其中的類型信息并將之存儲(chǔ)在方法區(qū)。該類型的靜態(tài)變量同樣也存儲(chǔ)在方法區(qū)中。由于所有的線程共享方法區(qū),所以對(duì)方法區(qū)數(shù)據(jù)的訪問必須考慮到線程的同步。

方法區(qū)的大小是不固定的,JVM可以通過(guò)裝載新類型或者卸載已有類型來(lái)動(dòng)態(tài)的調(diào)整方法區(qū)的大小,即可以改變方法區(qū)所占用的內(nèi)存。方法區(qū)不一定是連續(xù)的,方法區(qū)可以在一個(gè)堆中自由分配。

JVM保存的在方法區(qū)中的存儲(chǔ)類型以下信息

此類型的全限定名

此類型的直接超類的全限定名(除非這個(gè)類型為java.lang.object,它沒有超類)

此類型為接口還是類

此類型的訪問修飾符號(hào)(public,abstact或final的某個(gè)子集)

除以上基本信息,還得存儲(chǔ)以下類型的具體信息

此類型的常量池

字段信息

方法信息

除常量以外的所有靜態(tài)變量

一個(gè)到類classLoader的引用

一個(gè)到Class類的引用

常量池可以理解為本地指針數(shù)組,在JAVA的動(dòng)態(tài)連接中起核心的左右,后邊再做詳細(xì)的介紹。

為了盡可能的提高訪問的效率,必須優(yōu)化存儲(chǔ)在方法區(qū)中的類型信息的數(shù)據(jù)結(jié)構(gòu)。所以,實(shí)現(xiàn)中還可以加如其他數(shù)據(jù)結(jié)構(gòu)以加快訪問原始數(shù)據(jù)的速度,如方法表。JVM為每個(gè)裝載的非抽象類,都生成一個(gè)方法表,把他作為類信息的一部分保存在方法區(qū)。方法表也是一個(gè)本地指針數(shù)組,其元素為方法的入口地址。方法表所指向?qū)嵗椒ǖ臄?shù)據(jù)包括以下信息:

此方法的操作數(shù)棧和局部變量的大小

此方法的字節(jié)碼

異常表

JVM可以為每個(gè)對(duì)象生成一份方法表的copy(這樣比較耗內(nèi)存,但能提高訪問的速度)或只在對(duì)象里保存到方法區(qū)中方法表的引用。這和C++中的VTBL很象,在C++中,對(duì)象有實(shí)例數(shù)據(jù)和一組指向?qū)ο罂梢哉{(diào)用的虛擬函數(shù)指針組成。

2堆

Java程序在運(yùn)行時(shí)創(chuàng)建的所有類室例或數(shù)組都放在同一個(gè)堆中,而一個(gè)JVM實(shí)例只有一個(gè)堆空間,所有線程都共享這個(gè)堆。堆空間可以自由的伸縮,也不必是連續(xù)的。

常見的堆空間的設(shè)計(jì):

a.把堆空間分為兩部分:句柄池和對(duì)象池,對(duì)象的引用為指向句柄池的本地指針,句柄池里的每個(gè)條目分為兩部分,一部分為指向?qū)ο蟪氐谋镜刂羔?,一部分為指向方法區(qū)類數(shù)據(jù)區(qū)的本地指針。對(duì)象池里保存的是實(shí)例對(duì)象的數(shù)據(jù),此數(shù)據(jù)是實(shí)例私有的。這種設(shè)計(jì)的好處有利于內(nèi)存碎片的整理,當(dāng)移動(dòng)對(duì)象池中的對(duì)象時(shí),句柄部分只需要修改指向?qū)ο蟪貤l目的地址。缺點(diǎn)就是兩級(jí)指針的訪問。

b.使對(duì)象指針直接的指向?qū)ο髷?shù)據(jù),該數(shù)據(jù)包括指向方法區(qū)方法區(qū)數(shù)據(jù)類類型的指針和對(duì)象的實(shí)例數(shù)據(jù)。這樣的優(yōu)缺點(diǎn)正好和前邊的方法相反。當(dāng)移動(dòng)堆中的對(duì)象時(shí),對(duì)象的指針也得跟著改變,這就必須在整個(gè)運(yùn)行時(shí)數(shù)據(jù)區(qū)中更新被移動(dòng)對(duì)象的引用。

以上兩種方法的思想可以類比為對(duì)鏈表和數(shù)組的刪除和加入操作。

在Java中,數(shù)組和其他對(duì)象一樣,總是存儲(chǔ)在堆中并擁有一個(gè)與他們的類向關(guān)聯(lián)的CLASS實(shí)例,所有具有相同維度和類型的數(shù)組都是一個(gè)類的實(shí)例,而不管數(shù)組的長(zhǎng)度。

3程序記數(shù)器

每個(gè)線程都有自己的程序記數(shù)器,它的內(nèi)容總是下一條將被執(zhí)行指令的地址。

4Java棧

當(dāng)一個(gè)線程被創(chuàng)建時(shí)都將得到自己的程序記數(shù)器和Java棧,Java棧以幀為單位保存調(diào)用信息。當(dāng)線程調(diào)用一個(gè)方法時(shí),JVM會(huì)壓如一新的棧幀到Java棧,反之則彈出。也就是說(shuō),JVM只會(huì)對(duì)Java棧執(zhí)行兩種操作:以幀為單位的壓棧和彈棧。幀的大小根據(jù)調(diào)用信息是可變的,后邊做詳細(xì)的介紹。由于Java棧上的數(shù)據(jù)是此線程私有的,因此不需考慮多線程下的棧數(shù)據(jù)的線程安全問題。

Inside JVM棧幀由三部分組成:局部變量區(qū),操作數(shù)棧和幀數(shù)據(jù)區(qū)。

a.局部變量區(qū)

局部變量區(qū)的大小由調(diào)用方法的參數(shù)和方法的局部變量所決定。編譯器按聲名順序?qū)⑺麄兎诺骄植孔兞繑?shù)組,此數(shù)組以字長(zhǎng)為單位,從0開始記數(shù)。如果是實(shí)例方法,數(shù)組的第一個(gè)元素為實(shí)例的this指針。

在Java中,所有的對(duì)象都按引用傳遞,并且對(duì)象存儲(chǔ)在堆中,在局部變量或操作數(shù)棧中不會(huì)有對(duì)象的COPY,只有對(duì)象引用。

b操作數(shù)棧

操作數(shù)棧也是以字長(zhǎng)為單位的數(shù)組,但不同于局部變量數(shù)組以索引去訪問,它是通過(guò)標(biāo)準(zhǔn)的棧操作,壓棧和彈棧來(lái)訪問的。JVM沒有寄存器,程序記數(shù)器也無(wú)法被程序指令直接訪問。JVM的運(yùn)行方式是基于棧的而非基于寄存器的,JVM的指令是從操作數(shù)棧中而不是寄存器中取得操作數(shù)的。雖然指令也可以從其他地方取得操作數(shù),比如從字節(jié)碼流中跟隨在操作碼之后的字節(jié)中或從常量池中,但主要還是從操作數(shù)棧中獲取操作數(shù)。

JVM把操作數(shù)棧作為它的工作區(qū),大多數(shù)指令都要從這里彈出數(shù)據(jù),執(zhí)行運(yùn)算,然后把結(jié)果壓回操作數(shù)棧,然后等相關(guān)的指令將結(jié)果再次彈出。操作數(shù)棧扮演了暫存操作數(shù)的角色。

C幀數(shù)據(jù)區(qū)

除局部變量區(qū)和操作數(shù)棧外,Java棧幀還數(shù)據(jù)來(lái)支持常量池的解析、正常方法的返回以及異常派發(fā)機(jī)制。這些信息都保存在Java棧幀的幀數(shù)據(jù)區(qū)中。JVM可以通過(guò)幀數(shù)據(jù)區(qū)中指向常量池的指針來(lái)執(zhí)行某個(gè)需要用到常量池?cái)?shù)據(jù)的指令。

5本地方法棧

當(dāng)線程調(diào)用本地方法時(shí),JVM會(huì)保持Java棧不變,不再在線程的Java棧中壓入新的幀,Inside JVM只是簡(jiǎn)單地動(dòng)態(tài)連接并直接調(diào)用本地方法。但是,本地方法有可能回調(diào)JVM中的Java方法,此時(shí)該線程會(huì)保存本地方法棧的狀態(tài)并進(jìn)入Java棧,在Java棧壓入新的棧幀。

【編輯推薦】

  1. 淺談Sun JVM內(nèi)存管理及調(diào)優(yōu)
  2. 監(jiān)視JSP中JVM可用內(nèi)存
  3. JDK、JRE、JVM之間的關(guān)系
  4. 手把手教你刪除MS JVM的幾種方法
  5. Java虛擬機(jī)(JVM)中的內(nèi)存設(shè)置詳解
責(zé)任編輯:彭凡 來(lái)源: spaces.live.com
相關(guān)推薦

2010-09-25 13:38:23

Inside JVM

2010-04-23 09:13:05

Oracle體系結(jié)構(gòu)

2010-09-16 15:22:30

JVM體系結(jié)構(gòu)

2020-04-15 21:43:22

JVMJavaVMware

2010-09-27 09:43:07

JVM體系結(jié)構(gòu)

2009-02-05 11:07:27

Sybase SQL SybaseSQL Server

2017-08-03 14:01:07

大數(shù)據(jù)深度學(xué)習(xí)體系結(jié)構(gòu)

2011-11-30 14:12:05

JavaJVM虛擬機(jī)

2009-07-02 15:50:36

JSP體系結(jié)構(gòu)

2018-09-11 12:41:42

HadoopJava工具

2009-06-26 15:58:28

EJB

2009-09-11 10:38:03

LINQ體系結(jié)構(gòu)

2009-07-15 13:46:26

Swing體系結(jié)構(gòu)

2012-02-06 17:22:44

MySQL

2014-07-23 09:33:52

2009-12-31 10:16:45

ADO.NET體系結(jié)構(gòu)

2010-03-18 13:53:48

無(wú)線USB體系結(jié)構(gòu)

2010-04-08 10:02:15

Oracle體系結(jié)構(gòu)

2009-12-30 15:56:05

MPLS體系結(jié)構(gòu)

2016-12-26 10:29:01

Spring框架結(jié)構(gòu)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)