精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

對(duì)JVM還有什么不懂的?帶你深入淺出JVM!

云計(jì)算 虛擬化
JVM的啟動(dòng)是通過bootstrap類加載器來加載一個(gè)用于初始化的類。在publicstatic void main(String[])被執(zhí)行前,該類會(huì)被鏈接以及實(shí)例化。main方法的執(zhí)行,將順序經(jīng)歷加載,鏈接,以及對(duì)額外必要的類跟接口的初始化。

 [[278722]]

JVM

JVM = 類加載器(classloader) + 執(zhí)行引擎(execution engine) + 運(yùn)行時(shí)數(shù)據(jù)區(qū)域(runtime data area)

下面這幅圖展示了一個(gè)典型的JVM(符合JVM Specification Java SE 7 Edition)所具備的關(guān)鍵內(nèi)部組件。

 

對(duì)JVM還有什么不懂的?資深架構(gòu)師一篇文章帶你深入淺出JVM!

 

組件中的多線程處理

多線程處理”或“自由線程處理”指的是一個(gè)程序同時(shí)執(zhí)行多個(gè)操作線程的能力。 作為多線程應(yīng)用程序的一個(gè)示例,某個(gè)程序在一個(gè)線程上接收用戶輸入,在另一個(gè)線程上執(zhí)行多種復(fù)雜的計(jì)算,并在第三個(gè)線程上更新數(shù)據(jù)庫(kù)。 在單線程應(yīng)用程序中,用戶可能會(huì)花費(fèi)時(shí)間等待計(jì)算或數(shù)據(jù)庫(kù)更新完成。 而在多線程應(yīng)用程序中,這些進(jìn)程可以在后臺(tái)進(jìn)行,因此不會(huì)浪費(fèi)用戶時(shí)間。 多線程處理可以是組件編程中的一個(gè)非常強(qiáng)大的工具。通過編寫多線程組件,您可以創(chuàng)建在后臺(tái)執(zhí)行復(fù)雜計(jì)算的組件,它們?cè)试S用戶界面 (UI) 在計(jì)算的過程中自由地響應(yīng)用戶輸入。 雖然多線程處理是一個(gè)強(qiáng)大的工具,但是要將其正確應(yīng)用卻比較困難。 未能正確實(shí)現(xiàn)的多線程代碼可能降低應(yīng)用程序性能,或甚至導(dǎo)致應(yīng)用程序凍結(jié)。 下列主題將向您介紹多線程編程的一些注意事項(xiàng)和最佳做法。.NET Framework 提供幾個(gè)在組件中進(jìn)行多線程處理的選項(xiàng)。 System.Threading 命名空間中的功能是一個(gè)選項(xiàng)。 基于事件的異步模式是另一個(gè)選項(xiàng)。 BackgroundWorker 組件是對(duì)異步模式的實(shí)現(xiàn);它提供封裝在組件中以便于使用的高級(jí)功能。

JVM內(nèi)存管理機(jī)制

(1)內(nèi)存區(qū)域與內(nèi)存溢出異常

(2)垃圾收集器與內(nèi)存分配策略

(3)虛擬機(jī)性能監(jiān)控與故障處理工具

JVM調(diào)優(yōu)

1.JVM執(zhí)行子系統(tǒng)

(1)類文件結(jié)構(gòu)

(2)類加載機(jī)制

(3)字節(jié)碼執(zhí)行引擎

2.程序編譯與代碼優(yōu)化

(1)編譯期優(yōu)化

(2)運(yùn)行期優(yōu)化

3.實(shí)戰(zhàn)調(diào)優(yōu)案例與解決方法

 

對(duì)JVM還有什么不懂的?資深架構(gòu)師一篇文章帶你深入淺出JVM!

 

JVM系統(tǒng)線程

如果你用jconsole或者任何其他的debug工具查看,可能會(huì)看到有許多線程在后臺(tái)運(yùn)行。這些運(yùn)行著的后臺(tái)線程不包含主線程,主線程是基于執(zhí)行publicstatic void main(String[]) 的需要而被創(chuàng)建的。而這些后臺(tái)線程都是被主線程所創(chuàng)建。在HotspotJVM中主要的后臺(tái)系統(tǒng)線程,見下表:

 

對(duì)JVM還有什么不懂的?資深架構(gòu)師一篇文章帶你深入淺出JVM!

 

單個(gè)線程

每個(gè)線程的一次執(zhí)行都包含如下的組件

程序計(jì)數(shù)器(PC)

除非當(dāng)前指令或者操作碼是原生的,否則當(dāng)前指令或操作碼的地址都需要依賴于PC來尋址。如果當(dāng)前方法是原生的,那么該P(yáng)C即為undefined。所有的CPU都有一個(gè)PC,通常PC在每個(gè)指令執(zhí)行后被增加以指向即將執(zhí)行的下一條指令的地址。JVM使用PC來跟蹤正在執(zhí)行的指令的位置。事實(shí)上,PC被用來指向methodarea的一個(gè)內(nèi)存地址。

原生棧

不是所有的JVM都支持原生方法,但那些支持該特性的JVM通常會(huì)對(duì)每個(gè)線程創(chuàng)建一個(gè)原生方法棧。如果對(duì)JVM的JNI(JavaNative Invocation)采用c鏈接模型的實(shí)現(xiàn),那么原生棧也將是一個(gè)C實(shí)現(xiàn)的棧。在這個(gè)例子中,原生棧中參數(shù)的順序 、返回值都將跟通常的C程序相同。一個(gè)原生方法通常會(huì)對(duì)JVM產(chǎn)生一個(gè)回調(diào)(這依賴于JVM的實(shí)現(xiàn))并執(zhí)行一個(gè)Java方法。這樣一個(gè)原生到Java的調(diào)用發(fā)生在棧上(通常在Java棧),與此同時(shí)線程也將離開原生棧,通常在Java棧上創(chuàng)建一個(gè)新的frame。

每個(gè)線程都有屬于它自己的棧,用于存儲(chǔ)在線程上執(zhí)行的每個(gè)方法的frame。棧是一個(gè)后進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),這可以使得當(dāng)前正在執(zhí)行的方法位于棧的頂部。對(duì)于每個(gè)方法的執(zhí)行,都會(huì)有一個(gè)新的frame被創(chuàng)建并被入棧到棧的頂部。當(dāng)方法正常的返回或在方法執(zhí)行的過程中遇到未捕獲的異常時(shí)frame會(huì)被出棧。棧不會(huì)被直接進(jìn)行操作,除了push/ pop frame 對(duì)象。因此可以看出,frame對(duì)象可能會(huì)被分配在堆上,并且內(nèi)存也沒必要是連續(xù)的地址空間(請(qǐng)注意區(qū)分frame的指針跟frame對(duì)象)。

棧的限制

一個(gè)棧可以是動(dòng)態(tài)的或者是有合適大小的。如果一個(gè)線程要求更大的棧,那么將拋出StackOverflowError異常;如果一個(gè)線程要求新創(chuàng)建一個(gè)frame,又沒有足夠的內(nèi)存空間來分配,將會(huì)拋出OutOfMemoryError異常。

Frame

對(duì)于每一個(gè)方法的執(zhí)行,一個(gè)新frame會(huì)被創(chuàng)建并被入棧到棧頂。當(dāng)方法正常返回或在方法執(zhí)行的過程中遇到未捕獲的異常,frame會(huì)被出棧。

局部變量數(shù)組

局部變量數(shù)組包含了在方法執(zhí)行期間所用到的所有的變量。包含一個(gè)對(duì)this的引用,所有的方法參數(shù),以及其他局部定義的變量。對(duì)于類方法(比如靜態(tài)方法),方法參數(shù)的存儲(chǔ)索引從0開始;而對(duì)于實(shí)例方法,索引為0的槽都為存儲(chǔ)this指針而保留。

操作數(shù)棧

操作數(shù)棧在字節(jié)碼指令被執(zhí)行的過程中使用。它跟原生CPU使用的通用目的的寄存器類似。大部分的字節(jié)碼都把時(shí)間花費(fèi)在跟操作數(shù)棧打交道上,通過入棧、出棧、復(fù)制、交換或者執(zhí)行那些生產(chǎn)/消費(fèi)值的操作。對(duì)字節(jié)碼而言,那些在局部變量數(shù)組和操作數(shù)棧之間移動(dòng)值的指令是非常頻繁的。

動(dòng)態(tài)鏈接

每個(gè)frame都包含一個(gè)對(duì)運(yùn)行時(shí)常量池的引用。該引用指向?qū)⒁粓?zhí)行的方法所屬的類的常量池。該引用也用于輔助動(dòng)態(tài)鏈接。

當(dāng)一個(gè)Java類被編譯時(shí),所有對(duì)存儲(chǔ)在類的常量池中的變量以及方法的引用都被當(dāng)做符號(hào)引用。一個(gè)符號(hào)引用僅僅只是一個(gè)邏輯引用而不是最終指向物理內(nèi)存地址的引用。JVM的實(shí)現(xiàn)可以選擇解析符號(hào)引用的時(shí)機(jī),該時(shí)機(jī)可以發(fā)生在當(dāng)類文件被驗(yàn)證后、被加載后,這稱之eager或靜態(tài)分析;不同的是它也可以發(fā)生在當(dāng)符號(hào)引用被首次使用的時(shí)候,稱之為lazy或延遲分析。但JVM必須保證:解析發(fā)生在每個(gè)引用被首次使用前,同時(shí)在該時(shí)間點(diǎn),如果遇到分析錯(cuò)誤能夠拋出異常。綁定是一個(gè)處理過程,它將被符號(hào)引用標(biāo)識(shí)的字段、方法或類替換為一個(gè)直接引用。這個(gè)處理過程只發(fā)生一次,因?yàn)榉?hào)引用需要被完全替換。如果一個(gè)符號(hào)引用關(guān)聯(lián)著一個(gè)類,而該類還沒有被解析,那么該類也會(huì)被立即加載。每個(gè)直接引用都被以偏移的方式存儲(chǔ),該存儲(chǔ)結(jié)構(gòu)關(guān)聯(lián)著變量或方法的運(yùn)行時(shí)位置。

線程之間共享

堆中某個(gè)節(jié)點(diǎn)的值總是不大于或不小于其父節(jié)點(diǎn)的值;

堆總是一棵完全二叉樹。

將根節(jié)點(diǎn)最大的堆叫做最大堆或大根堆,根節(jié)點(diǎn)最小的堆叫做最小堆或小根堆。常見的堆有二叉堆、斐波那契堆等。

堆的定義如下:n個(gè)元素的序列{k1,k2,ki,…,kn}當(dāng)且僅當(dāng)滿足下關(guān)系時(shí),稱之為堆。

(ki <= k2i,ki <= k2i+1)或者(ki >= k2i,ki >= k2i+1), (i = 1,2,3,4...n/2)

若將和此次序列對(duì)應(yīng)的一維數(shù)組(即以一維數(shù)組作此序列的存儲(chǔ)結(jié)構(gòu))看成是一個(gè)完全二叉樹,則堆的含義表明,完全二叉樹中所有非終端結(jié)點(diǎn)的值均不大于(或不小于)其左、右孩子結(jié)點(diǎn)的值。由此,若序列{k1,k2,…,kn}是堆,則堆頂元素(或完全二叉樹的根)必為序列中n個(gè)元素的最小值(或最大值)

非堆式內(nèi)存

有些對(duì)象并不會(huì)創(chuàng)建在堆中,這些對(duì)象在邏輯上被認(rèn)為是JVM機(jī)制的一部分。

非堆式的內(nèi)存包括:

  • 永久代中包含:
  • 方法區(qū)
  • 內(nèi)部字符串
  • 代碼緩存:用于編譯以及存儲(chǔ)方法,這些方法已經(jīng)被JIT編譯成本地代碼

內(nèi)存管理

對(duì)象和數(shù)組永遠(yuǎn)都不會(huì)被顯式釋放,因此只能依靠垃圾回收器來自動(dòng)地回收它們。

通常,以如下的步驟進(jìn)行:

  1. 新對(duì)象和數(shù)組被創(chuàng)建在年輕代
  2. 次垃圾回收器將在年輕代上執(zhí)行。那些仍然存活著的對(duì)象,將被從eden區(qū)移動(dòng)到survivor區(qū)
  3. 主垃圾回收器將會(huì)把對(duì)象在代與代之間進(jìn)行移動(dòng),主垃圾回收器通常會(huì)導(dǎo)致應(yīng)用程序的線程暫停。那些仍然存活著的對(duì)象將被從年輕代移動(dòng)到老年代
  4. 永久代會(huì)在每次老年代被回收的時(shí)候同時(shí)進(jìn)行,它們?cè)趦烧咧衅湟粷M了之后都會(huì)被回收

JIT編譯

JIT具體的做法是這樣的:當(dāng)載入一個(gè)類型時(shí),CLR為該類型創(chuàng)建一個(gè)內(nèi)部數(shù)據(jù)結(jié)構(gòu)和相應(yīng)的函數(shù),當(dāng)函數(shù)第一被調(diào)用時(shí),JIT將該函數(shù)編譯成機(jī)器語(yǔ)言.當(dāng)再次遇到該函數(shù)時(shí)則直接從cache中執(zhí)行已編譯好的機(jī)器語(yǔ)言.

方法區(qū)

所有的線程共享相同的方法區(qū)。所以,對(duì)于方法區(qū)數(shù)據(jù)的訪問以及對(duì)動(dòng)態(tài)鏈接的處理必須是線程安全的。如果兩個(gè)線程企圖訪問一個(gè)還沒有被載入的類(該類必須只能被加載一次)的字段或者方法,直到該類被加載完成,這兩個(gè)線程才能繼續(xù)執(zhí)行。

類的文件結(jié)構(gòu)

一個(gè)被編譯過的類文件包含如下的結(jié)構(gòu):

  1. ClassFile 
  2.  { u4magic; u2minor_version; u2major_version; u2constant_pool_count;  
  3. cp_infocontant_pool[constant_pool_count – 1]; u2access_flags;  
  4. u2this_class; u2super_class; u2interfaces_count;  
  5. u2interfaces[interfaces_count]; u2fields_count;  
  6. field_infofields[fields_count]; u2methods_count;  
  7. method_infomethods[methods_count]; u2attributes_count;  
  8. attribute_infoattributes[attributes_count];} 

 

對(duì)JVM還有什么不懂的?資深架構(gòu)師一篇文章帶你深入淺出JVM!

 

可以使用javap命令查看被編譯后的java類的字節(jié)碼。

下面列出了在該類文件中,使用到的操作碼:

 

對(duì)JVM還有什么不懂的?資深架構(gòu)師一篇文章帶你深入淺出JVM!

 

就像在其他通用的字節(jié)碼中那樣,以上這些操作碼主要用于跟本地變量、操作數(shù)棧以及運(yùn)行時(shí)常量池打交道。

構(gòu)造器有兩個(gè)指令,第一個(gè)將“this”壓入到操作數(shù)棧,接下來該構(gòu)造器的父構(gòu)造器被執(zhí)行,這一操作將導(dǎo)致this被“消費(fèi)”,因此this將從操作數(shù)棧出棧。

 

對(duì)JVM還有什么不懂的?資深架構(gòu)師一篇文章帶你深入淺出JVM!

 

而對(duì)于sayHello()方法,它的執(zhí)行將更為復(fù)雜。因?yàn)樗坏貌煌ㄟ^運(yùn)行時(shí)常量池,解析符號(hào)引用到真實(shí)的引用。第一個(gè)操作數(shù)getstatic,用來入棧一個(gè)指向System類的靜態(tài)字段out的引用到操作數(shù)棧。接下來的操作數(shù)ldc,入棧一個(gè)字符串字面量“Hello”到操作數(shù)棧。最后,invokevirtual操作數(shù),執(zhí)行System.out的println方法,這將使得“Hello”作為一個(gè)參數(shù)從操作數(shù)棧出棧,并為當(dāng)前線程創(chuàng)建一個(gè)新的frame。

 

對(duì)JVM還有什么不懂的?資深架構(gòu)師一篇文章帶你深入淺出JVM!

 

以及高并發(fā),分布式,spring源碼,mybatis源碼,大數(shù)據(jù),Netty等多個(gè)技術(shù)知識(shí)點(diǎn)全面講解的架構(gòu)視頻資料

類加載器

JVM的啟動(dòng)是通過bootstrap類加載器來加載一個(gè)用于初始化的類。在publicstatic void main(String[])被執(zhí)行前,該類會(huì)被鏈接以及實(shí)例化。main方法的執(zhí)行,將順序經(jīng)歷加載,鏈接,以及對(duì)額外必要的類跟接口的初始化。

加載: 加載是這樣一個(gè)過程:查找表示該類或接口類型的類文件,并把它讀到一個(gè)字節(jié)數(shù)組中。接著,這些字節(jié)會(huì)被解析以確認(rèn)它們是否表示一個(gè)Class對(duì)象以及是否有正確的主、次版本號(hào)。任何被當(dāng)做直接superclass的類或接口也一同被加載。一旦這些工作完成,一個(gè)類或接口對(duì)象將會(huì)從二進(jìn)制表示中創(chuàng)建。

鏈接: 鏈接包含了對(duì)該類或接口的驗(yàn)證,準(zhǔn)備類型以及該類的直接父類跟父接口。簡(jiǎn)而言之,鏈接包含三個(gè)步驟:驗(yàn)證、準(zhǔn)備以及解析(optional)

驗(yàn)證:該階段會(huì)確認(rèn)類以及接口的表示形式在結(jié)構(gòu)上的正確性,同時(shí)滿足Java編程語(yǔ)言以及JVM語(yǔ)義上的要求。

在驗(yàn)證階段執(zhí)行這些檢查意味著在運(yùn)行時(shí)可以免去在鏈接階段進(jìn)行這些動(dòng)作,雖然拖慢了類的加載速度,然而它避免了在執(zhí)行字節(jié)碼的時(shí)候執(zhí)行這些檢查。

準(zhǔn)備:包含了對(duì)靜態(tài)存儲(chǔ)的內(nèi)存分配以及JVM所使用的任何數(shù)據(jù)結(jié)構(gòu)(比如方法表)。靜態(tài)字段都被創(chuàng)建以及實(shí)例化為它們的默認(rèn)值。然而,沒有任何實(shí)例化器或代碼在這個(gè)階段被執(zhí)行,因?yàn)檫@些任務(wù)將會(huì)發(fā)生在實(shí)例化階段。

解析:是一個(gè)可選的階段。該階段通過加載引用的類或接口來檢查符號(hào)引用是否正確。如果在這個(gè)點(diǎn)這些檢查沒發(fā)生,那么對(duì)符號(hào)引用的解析會(huì)被推遲到直到它們被字節(jié)碼指令使用之前。

實(shí)例化 類或接口,包含執(zhí)行類或接口的實(shí)例化方法:

 

對(duì)JVM還有什么不懂的?資深架構(gòu)師一篇文章帶你深入淺出JVM!

 

在JVM中存在多個(gè)不同職責(zé)的類加載器。每一個(gè)類加載器都代理其已被加載的父加載器(除了bootstrap類加載器,因?yàn)樗歉虞d器)。

Bootstrap類加載器:當(dāng)java程序運(yùn)行時(shí),java虛擬機(jī)需要裝載java類,這個(gè)過程需要一個(gè)類裝載器來完成。而類裝載器本身也是一個(gè)java類,這就出現(xiàn)了類似人類的第一位母親是如何產(chǎn)生出來的問題。

其實(shí),java虛擬機(jī)中內(nèi)嵌了一個(gè)稱為Bootstrap的類裝載器,它是用特定于操作系統(tǒng)的本地代碼實(shí)現(xiàn)的,屬于java虛擬機(jī)的內(nèi)核,這個(gè)Bootstrap類裝載器不用專門的類裝載器去裝載。Bootstrap類裝載器負(fù)責(zé)加載java核心包中的類。

Extension 類加載器:從標(biāo)準(zhǔn)的Java擴(kuò)展API中加載類。例如,安全的擴(kuò)展功能集。

System 類加載器:這是應(yīng)用程序默認(rèn)的類加載器。它從classpath中加載應(yīng)用程序類。

用戶定義的類加載器:可以額外得定義類加載器來加載應(yīng)用程序類。用戶定義的類加載器可用于一些特殊的場(chǎng)景,比如:在運(yùn)行時(shí)重新加載類或?qū)⒁恍┨厥獾念惛綦x為多個(gè)不同的分組(通常web服務(wù)器中都會(huì)有這樣的需求,比如Tomcat)。

更快的類加載

一個(gè)稱之為類數(shù)據(jù)共享(CDS)的特性自HotspotJVM 5.0開始被引進(jìn)。在安裝JVM期間,安裝器加載一系列的Java核心類(如rt.jar)到一個(gè)經(jīng)過映射過的內(nèi)存區(qū)進(jìn)行共享存檔。CDS減少了加載這些類的時(shí)間從而提升了JVM的啟動(dòng)速度,同時(shí)允許這些類在不同的JVM實(shí)例之間共享。這大大減少了內(nèi)存碎片。

方法區(qū)的位置

JVM Specification Java SE 7 Edition清楚地聲明:盡管方法區(qū)是堆的一個(gè)邏輯組成部分,但最簡(jiǎn)單的實(shí)現(xiàn)可能是既不對(duì)它進(jìn)行垃圾回收也不壓縮它。然而矛盾的是利用jconsole查看Oracle的JVM的方法區(qū)(以及CodeCache)是非堆形式的。OpenJDK代碼顯示CodeCache相對(duì)ObjectHeap而言是VM中一個(gè)獨(dú)立的域。

類加載器引用

類通常是按需加載,即第一次使用該類時(shí)才加載。由于有了類加載器,Java運(yùn)行時(shí)系統(tǒng)不需要知道文件與文件系統(tǒng)。

運(yùn)行時(shí)常量池

JVM對(duì)每個(gè)類型維護(hù)著一個(gè)常量池,它是一個(gè)跟符號(hào)表相似的運(yùn)行時(shí)數(shù)據(jù)結(jié)構(gòu),但它包含了更多的數(shù)據(jù)。Java的字節(jié)碼需要一些數(shù)據(jù),通常這些數(shù)據(jù)會(huì)因?yàn)樘蠖y以直接存儲(chǔ)在字節(jié)碼中。取而代之的一種做法是將其存儲(chǔ)在常量池中,字節(jié)碼包含一個(gè)對(duì)常量池的引用。運(yùn)行時(shí)常量池主要用來進(jìn)行動(dòng)態(tài)鏈接。

幾種類型的數(shù)據(jù)會(huì)存儲(chǔ)在常量池中,它們是:

  • 數(shù)值字面量
  • 字符串字面量
  • 類的引用
  • 字段的引用
  • 方法的引用

如果你編譯下面的這個(gè)簡(jiǎn)單的類:

  1. package org.jvminternals;public class SimpleClass { public void sayHello() {System.out.println("Hello");}} 

生成的類文件的常量池,看起來會(huì)像下圖所示:

  1. Constant 
  2.  pool: #1 = Methodref #6.#17 // java/lang/Object."<init>":()V#2 =  
  3. Fieldref #18.#19 // java/lang/System.out:Ljava/io/PrintStream;#3 =  
  4. String #20 // "Hello"#4 = Methodref #21.#22 //  
  5. java/io/PrintStream.println:(Ljava/lang/String;)V#5 = Class #23 //  
  6. org/jvminternals/SimpleClass#6 = Class #24 // java/lang/Object#7 = Utf8  
  7. <init> #8 = Utf8 ()V #9 = Utf8 Code #10 = Utf8 LineNumberTable #11 
  8.  = Utf8 LocalVariableTable #12 = Utf8 this #13 = Utf8  
  9. Lorg/jvminternals/SimpleClass; #14 = Utf8 sayHello #15 = Utf8 SourceFile 
  10.  #16 = Utf8 SimpleClass.java #17 = NameAndType #7:#8 //  
  11. "<init>":()V#18 = Class #25 // java/lang/System#19 = NameAndType  
  12. #26:#27 // out:Ljava/io/PrintStream;#20 = Utf8 Hello #21 = Class #28 //  
  13. java/io/PrintStream#22 = NameAndType #29:#30 //  
  14. println:(Ljava/lang/String;)V#23 = Utf8 org/jvminternals/SimpleClass #24 
  15.  = Utf8 java/lang/Object#25 = Utf8 java/lang/System #26 = Utf8 out#27 =  
  16. Utf8 Ljava/io/PrintStream; #28 = Utf8 java/io/PrintStream #29 = Utf8  
  17. println #30 = Utf8 (Ljava/lang/String;)V 

常量池中包含了下面的這些類型:

 

對(duì)JVM還有什么不懂的?資深架構(gòu)師一篇文章帶你深入淺出JVM!

 

異常表

異常表存儲(chǔ)了每個(gè)異常處理器的信息:

  • 起始點(diǎn)
  • 終止點(diǎn)
  • 處理代碼的PC偏移量
  • 被捕獲的異常類的常量池索引

如果一個(gè)方法定義了try-catch或try-finally異常處理器,那么一個(gè)異常表將會(huì)被創(chuàng)建。它包含了每個(gè)異常處理器的信息或者finally塊以及正在被處理的異常類型跟處理器代碼的位置。

當(dāng)一個(gè)異常被拋出,JVM會(huì)為當(dāng)前方法尋找一個(gè)匹配的處理器。如果沒有找到,那么該方法最終會(huì)唐突地出棧當(dāng)前stackframe而異常會(huì)被重新拋出到調(diào)用鏈(新的frame)。如果在所有的frame都出棧之前還是沒有找到異常處理器,那么當(dāng)前線程將會(huì)被終止。當(dāng)然這也可能會(huì)導(dǎo)致JVM被終止,如果異常被拋出到最后一個(gè)非后臺(tái)線程的話,比如該線程就是主線程。

最終異常處理器會(huì)匹配所有的異常類型并且無論什么時(shí)候該類型的異常被拋出總是會(huì)得到執(zhí)行。在沒有異常拋出的例子中,finally塊仍然會(huì)在方法的最后被執(zhí)行。一旦return語(yǔ)句被執(zhí)行就會(huì)立即跳轉(zhuǎn)到finally代碼塊繼續(xù)執(zhí)行。

字符比較

字符比較(character comparison)是指按照字典次序?qū)蝹€(gè)字符或字符串進(jìn)行比較大小的操作,一般都是以ASCII碼值的大小作為字符比較的標(biāo)準(zhǔn)。

符號(hào)表

符號(hào)表在編譯程序工作的過程中需要不斷收集、記錄和使用源程序中一些語(yǔ)法符號(hào)的類型和特征等相關(guān)信息。這些信息一般以表格形式存儲(chǔ)于系統(tǒng)中。如常數(shù)表、變量名表、數(shù)組名表、過程名表、標(biāo)號(hào)表等等,統(tǒng)稱為符號(hào)表。對(duì)于符號(hào)表組織、構(gòu)造和管理方法的好壞會(huì)直接影響編譯系統(tǒng)的運(yùn)行效率。

在JVM中,內(nèi)部字符串被存儲(chǔ)在字符串表中。字符串表是一個(gè)hashtable映射對(duì)象指針到符號(hào)(比如:Hashtable

當(dāng)類被加載時(shí),字符串字面量會(huì)被編譯器自動(dòng)“內(nèi)部化”并且被加入到字符表。另外字符串類的實(shí)例可以通過調(diào)用String.intern()來明確地內(nèi)部化。當(dāng)String.intern()被調(diào)用,如果符號(hào)表里已經(jīng)包含該字符串,那么指向該字符串的引用將被返回。如果該字符串沒有包含在字符表,則會(huì)被加入到字符串表同時(shí)返回其引用

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2021-10-05 20:29:55

JVM垃圾回收器

2023-05-05 18:33:15

2024-12-02 09:01:23

Java虛擬機(jī)內(nèi)存

2021-03-16 08:54:35

AQSAbstractQueJava

2011-07-04 10:39:57

Web

2024-12-12 09:00:28

2019-11-11 14:51:19

Java數(shù)據(jù)結(jié)構(gòu)Properties

2009-11-30 16:46:29

學(xué)習(xí)Linux

2022-12-02 09:13:28

SeataAT模式

2021-07-20 15:20:02

FlatBuffers阿里云Java

2017-07-02 18:04:53

塊加密算法AES算法

2019-01-07 15:29:07

HadoopYarn架構(gòu)調(diào)度器

2012-05-21 10:06:26

FrameworkCocoa

2022-09-26 09:01:15

語(yǔ)言數(shù)據(jù)JavaScript

2022-03-18 09:48:35

微服務(wù)架構(gòu)運(yùn)作

2014-08-05 09:27:20

TCP網(wǎng)絡(luò)協(xié)議

2023-03-20 09:48:23

ReactJSX

2009-12-25 15:49:43

Linux rescu

2019-11-14 09:53:30

Set集合存儲(chǔ)

2022-11-09 08:06:15

GreatSQLMGR模式
點(diǎn)贊
收藏

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

欧美日韩一级大片| 久久美女福利视频| 亚洲精品久久久久久动漫器材一区 | 国产日韩一区在线| 欧美丰满熟妇bbbbbb| 久草精品视频| 欧美日韩激情在线| 欧美亚洲日本一区二区三区| av在线收看| 成人一区二区三区| 国产精品丝袜久久久久久高清| 国产乱国产乱老熟300| 最新国产一区| 日韩久久精品一区| 亚洲第一中文av| 超碰91在线观看| 最新国产成人在线观看| 蜜桃传媒视频麻豆第一区免费观看| 91成品人影院| 久久天堂成人| 97福利一区二区| 欧美专区中文字幕| 国产91在线看| 精品va天堂亚洲国产| 国产av无码专区亚洲精品| 国产三区在线观看| 久久精品人人做人人综合| 宅男噜噜噜66一区二区66| 日韩国产高清污视频在线观看| 亚洲午夜在线观看| 午夜小视频在线播放| 国产精品影视在线观看| 国产精品福利观看| 亚洲天堂视频网站| 亚洲国产91| 久久国产精品久久久| xxxxx99| 精品一区毛片| 日韩成人xxxx| 亚洲国产精品自拍视频| 2020最新国产精品| 日韩一区二区电影在线| 亚洲精品成人在线播放| 精品福利在线| 欧美日韩在线播放一区| 欧美日韩在线成人| 欧美色网一区| 欧美性生活影院| 欧美国产日韩在线播放| 视频在线日韩| 色av综合在线| 手机看片福利日韩| 在线天堂新版最新版在线8| 黄色精品在线看| 无码中文字幕色专区| 岛国av免费在线观看| 亚洲午夜精品在线| 霍思燕三级露全乳照| 天堂av在线| 91国在线观看| 天天色综合社区| 亚洲青青一区| 日韩免费成人网| 黑森林av导航| 日本亚洲不卡| 亚洲一区二区国产| 制服丨自拍丨欧美丨动漫丨| 91一区二区三区四区| 久久精品国产久精国产一老狼| 久草手机视频在线观看| 艳女tv在线观看国产一区| 欧美精品亚洲一区二区在线播放| www.com操| 在线不卡一区| 欧美sm美女调教| 丰满少妇一区二区三区| 国产亚洲电影| 久久天堂av综合合色| 久久黄色免费视频| 国产精品亚洲产品| 国产精品综合久久久| 国产免费无遮挡| 成人网男人的天堂| 日韩精品电影网站| 超碰porn在线| 欧美日韩午夜剧场| www.99r| 久久影院资源站| 在线午夜精品自拍| 欧美黄色免费观看| 久久一区二区三区超碰国产精品| 成人xvideos免费视频| 午夜免费福利视频| 久久噜噜亚洲综合| 久久香蕉视频网站| 桃花岛成人影院| 欧美一卡二卡在线| av网站免费在线看| 欧美日韩一区二区三区四区在线观看| 欧美一区二粉嫩精品国产一线天| 在线视频1卡二卡三卡| 国产+成+人+亚洲欧洲自线| 欧美中日韩免费视频| 91精品久久| 色播五月激情综合网| 美女日批在线观看| 成人亚洲一区| 5566成人精品视频免费| 国产精品人人妻人人爽| 久久久国产午夜精品 | ass极品水嫩小美女ass| 丝袜av一区| 欧美另类精品xxxx孕妇| 日韩精品在线一区二区三区| 国产成人午夜99999| 亚洲高清在线观看一区| 成入视频在线观看| 日韩一区二区三区四区| 男人的天堂av网| 国产欧美91| 国产精品 日韩| 免费黄色在线看| 91成人免费电影| 少妇一级淫片免费放播放| 综合天堂av久久久久久久| 国产精品美女在线| 蜜芽tv福利在线视频| 亚洲国产一区视频| 91精产国品一二三| 亚洲va在线| 国产综合久久久久| 亚洲天天影视| 欧美无乱码久久久免费午夜一区| 亚洲制服丝袜在线播放| 亚洲视频综合| 国产精品久久亚洲| 欧美videossex| 日韩欧美一区电影| 69xx绿帽三人行| 国产酒店精品激情| 久久国产精品免费观看| 亚洲精品一区av| www高清在线视频日韩欧美| 老熟妇一区二区三区啪啪| 国产亚洲视频系列| 亚洲色图38p| 精品国产精品国产偷麻豆| 欧美最顶级丰满的aⅴ艳星| 午夜视频www| 欧美午夜片欧美片在线观看| 国产又黄又粗又猛又爽的视频| 亚洲激情欧美| 精品一区二区日本| 在线天堂中文资源最新版| 亚洲欧美日韩天堂一区二区| 日韩欧美三级在线观看| 久久久综合激的五月天| 日本三区在线观看| 欧洲乱码伦视频免费| 国产91在线播放九色快色| 九色网友自拍视频手机在线| 在线一区二区视频| 欧美巨胸大乳hitomi| 久久国产综合精品| 九九久久九九久久| 欧美精品影院| 97在线精品国自产拍中文| 暖暖视频在线免费观看| 欧美视频日韩视频| 中文字幕另类日韩欧美亚洲嫩草| 国产99一区视频免费| xxxx18hd亚洲hd捆绑| 色综合久久中文| 国产精品三级| 一本久道综合久久精品| 欧美又大又硬又粗bbbbb| 欧洲一级在线观看| 国产成a人无v码亚洲福利| 欧美在线国产精品| 国产一级二级三级在线观看| 欧美男人的天堂一二区| 麻豆亚洲av成人无码久久精品| 北岛玲一区二区三区四区| 蜜臀av午夜一区二区三区| 97在线精品| 国产欧美日韩一区二区三区| 久久久一本精品| 久久九九免费视频| 欧美综合视频在线| 欧美熟乱第一页| 九九在线观看视频| 国产色综合久久| 师生出轨h灌满了1v1| 久久狠狠婷婷| 久久久久久久久网| 国产精品欧美日韩一区| yy111111少妇影院日韩夜片| 88xx成人永久免费观看| 麻豆一区二区在线观看| 加勒比一区二区三区在线| 日韩一级片网址| 欧美男女性生活在线直播观看| 久久久午夜精品福利内容| 美女视频一区免费观看| 日本午夜精品电影| 成人资源在线播放| 国产又爽又黄的激情精品视频 | 成人黄色片在线观看| 亚洲欧美区自拍先锋| 男女做爰猛烈刺激| 成人黄色大片在线观看| 亚洲欧美天堂在线| 日韩av电影免费观看高清完整版| 久久99久久99精品| 忘忧草精品久久久久久久高清| 久久手机视频| 国产欧美三级电影| 91在线视频导航| h1515四虎成人| 欧美亚洲成人网| 丰乳肥臀在线| 欧美另类极品videosbest最新版本| 国产免费av在线| 日韩不卡中文字幕| 无码国产伦一区二区三区视频| 91精品蜜臀在线一区尤物| 97人妻精品视频一区| 欧美日韩人人澡狠狠躁视频| 国产精品日日夜夜| 一区二区三区不卡视频| 日韩在线视频网址| 《视频一区视频二区| 成人性视频免费看| 日本一二三四高清不卡| 非洲一级黄色片| 国产日韩av一区| 性猛交娇小69hd| 国产亚洲欧洲997久久综合 | 国产精品免费久久| 欧美成人另类视频| 国产日韩精品一区二区三区| av女人的天堂| 超碰一区二区三区| 国产在线日韩精品| 亚洲国产精品久久久久| 国产精品欧美激情在线| 欧美日韩中文一区| 亚洲成人av网址| 天天影视涩香欲综合网| 精品无码一区二区三区电影桃花| 亚洲欧美区自拍先锋| 无码人妻精品一区二区三区夜夜嗨| 国产精品久久三区| 五月天色婷婷丁香| 亚洲女女做受ⅹxx高潮| 91n在线视频| 亚洲人成在线观看一区二区| 日韩国产第一页| 亚洲欧美日韩一区| 麻豆国产尤物av尤物在线观看 | 亚洲成人中文字幕| 亚洲AV无码成人片在线观看| 日韩视频免费直播| 粉嫩av一区二区夜夜嗨| 亚洲国产成人久久| 三区在线观看| 亚洲片在线资源| 国产一级二级三级视频| 亚洲乱码一区二区三区在线观看| 九九热这里有精品视频| 精品久久久久久久久久久久| 国产又粗又爽视频| 欧美性一级生活| 国产黄色片网站| 日韩精品中文字| av中文天堂在线| 久久国产色av| 男人av在线播放| 国产精品视频1区| 日韩亚洲精品在线观看| 精品一区二区三区国产| 日韩在线看片| 丁香六月激情网| 日韩综合一区二区| 久久久久久国产精品日本| 97国产一区二区| 亚洲区一区二区三| 亚洲成人免费看| 在线观看亚洲国产| 欧美精品一区二区三区在线 | 88av在线视频| 亚洲第一精品夜夜躁人人爽 | 亚洲欧洲日产国码二区| 亚洲国产综合久久| 欧美三级午夜理伦三级中视频| 亚洲国产成人一区二区| 中文字幕在线看视频国产欧美在线看完整 | 黄色av免费观看| 中文字幕免费精品一区| wwwww亚洲| 成人信息集中地欧美| 蜜桃a∨噜噜一区二区三区| 99久re热视频精品98| 老司机精品视频网站| 国产视频精品视频| 亚洲欧美综合在线精品| www.久久久久久久| 欧美草草影院在线视频| 免费大片在线观看www| 欧美亚洲国产精品| www.亚洲一二| 正在播放亚洲| 青娱乐精品视频| 五级黄高潮片90分钟视频| 亚洲在线观看免费视频| 97caocao| 色先锋资源久久综合5566| 欧美男人天堂| 国产欧美一区二区视频| 欧美~级网站不卡| 91在线码无精品| 极品尤物一区二区| 一本一道波多野结衣一区二区| 国产精品羞羞答答在线| 一区二区三区高清国产| 中文字幕 在线观看| 国产精品一区而去| 狠狠色丁香久久综合频道| 免费精品99久久国产综合精品应用| 久久久www成人免费毛片麻豆| 亚洲国产综合久久| 亚洲成人黄色在线| 日本高清成人vr专区| 3d动漫精品啪啪一区二区三区免费| 国产一区二区三区站长工具| 国产又大又硬又粗| 97se亚洲国产综合在线| 日本少妇全体裸体洗澡| 精品国产一区二区精华| 色婷婷视频在线观看| 97netav| 欧美天堂亚洲电影院在线观看| 中文字幕1234区| 亚洲免费在线视频| 国产日本精品视频| 欧美精品在线极品| 精品三级国产| www婷婷av久久久影片| 国产成人精品一区二| 妺妺窝人体色www聚色窝仙踪 | 污污网站在线免费观看| 国外成人在线视频| 欧洲vs亚洲vs国产| 国产偷人视频免费| 亚洲国产精品传媒在线观看| 日本欧美www| 久久久97精品| 高清日韩欧美| 国产精品97在线| 国产免费久久精品| 一区二区三区精彩视频| 日韩有码在线电影| 中文在线综合| 男女视频网站在线观看| 久久九九久久九九| 91九色蝌蚪91por成人| 欧美日本精品在线| 欧美巨大xxxx| 美女网站视频黄色| 亚洲三级在线看| 亚洲精品国偷拍自产在线观看蜜桃| 91精品国产91久久久久久| 欧洲乱码伦视频免费| 欧美性猛交乱大交| 欧美色xxxx| 欧美精品日韩少妇| 官网99热精品| 三级不卡在线观看| 国产精品嫩草影院俄罗斯| 精品国产一区二区亚洲人成毛片| 欧美激情网站| 一个色的综合| 不卡免费追剧大全电视剧网站| 黄色av一级片| 欧美成人中文字幕| 自拍偷拍精品| 性生交大片免费看l| 色综合色狠狠天天综合色| 蜜桃视频在线观看www社区 | 深夜影院在线观看| 91精品免费看| 亚洲欧美视频| 日本在线一级片| 亚洲美女视频网| 亚洲va欧美va人人爽成人影院| 欧美 激情 在线| 亚洲综合免费观看高清完整版在线 | 国产精品www在线观看| 国产日韩精品一区二区三区| 亚洲精品久久久久久久久久|