成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

《深入理解Java虛擬機(jī)》(二)Java虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)

draveness / 3534人閱讀

摘要:虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)分為以下幾個部分。程序計數(shù)器也是在虛擬機(jī)規(guī)范中唯一沒有規(guī)定任何異常情況的區(qū)域。在方法運(yùn)行期間不會改變局部變量表的大小。長度在位和位的虛擬機(jī)中,分別為官方稱它為。

Java虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū) 詳解 2.1 概述

本文參考的是周志明的 《深入理解Java虛擬機(jī)》第二章 ,為了整理思路,簡單記錄一下,方便后期查閱。

2.2 運(yùn)行時數(shù)據(jù)區(qū)域
Java虛擬機(jī)在Java程序運(yùn)行時會將內(nèi)存區(qū)域劃分成若干個不同的區(qū)域,各自負(fù)責(zé)不同的職責(zé),這些區(qū)域都有各自的用途。

Java虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)分為以下幾個部分。

方法區(qū)、虛擬機(jī)棧、本地方法棧、堆、程序計數(shù)器,如下圖所示:

圖片來源于網(wǎng)絡(luò)如有侵權(quán)請私信刪除

2.2.1 程序計數(shù)器

程序計數(shù)器是一塊較小的內(nèi)存空間,可以看作當(dāng)前線程所執(zhí)行的字節(jié)碼行號指示器。需要注意以下幾點(diǎn)內(nèi)容:

程序計數(shù)器是線程私有,各線程之間互不影響。

在任何一個確定的時刻,一個處理器都只會執(zhí)行一條線程中的指令。

如果正在執(zhí)行java方法,計數(shù)器記錄的是正在執(zhí)行的虛擬機(jī)字節(jié)碼指令地址。

如果是native方法,則計數(shù)器值為空(native 方法 指得就是Java程序調(diào)用了非Java代碼,算是一種引入其它語言程序的接口)。

程序計數(shù)器也是在Java虛擬機(jī)規(guī)范中唯一沒有規(guī)定任何OutOfMemoryError異常情況的區(qū)域。

2.2.2 java虛擬機(jī)棧

可通過參數(shù) 棧幀是方法運(yùn)行期的基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)棧容量可由-Xss設(shè)置

Java虛擬機(jī)棧是線程私有的,它的生命周期與線程相同。

每一個方法被調(diào)用直至執(zhí)行完成的過程,就對應(yīng)著一個棧幀在虛擬機(jī)棧中從入棧到出棧的過程。

虛擬機(jī)棧是執(zhí)行Java方法的內(nèi)存模型(也就是字節(jié)碼)服務(wù):每個方法在執(zhí)行的同時都會創(chuàng)建一個棧幀,用于存儲 局部變量表操作數(shù)棧、動態(tài)鏈接方法出口等信息。

局部變量表:32位變量槽,存放了編譯期可知的各種基本數(shù)據(jù)類型、對象引用、returnAddress類型。

操作數(shù)棧:基于棧的執(zhí)行引擎,虛擬機(jī)把操作數(shù)棧作為它的工作區(qū),大多數(shù)指令都要從這里彈出數(shù)據(jù)、執(zhí)行運(yùn)算,然后把結(jié)果壓回操作數(shù)棧。

動態(tài)連接:每個棧幀都包含一個指向運(yùn)行時常量池(方法區(qū)的一部分)中該棧幀所屬方法的引用。持有這個引用是為了支持方法調(diào)用過程中的動態(tài)連接。Class文件的常量池中有大量的符號引用,字節(jié)碼中的方法調(diào)用指令就以常量池中指向方法的符號引用為參數(shù)。這些符號引用一部分會在類加載階段或第一次使用的時候轉(zhuǎn)化為直接引用,這種轉(zhuǎn)化稱為靜態(tài)解析。另一部分將在每一次的運(yùn)行期間轉(zhuǎn)化為直接應(yīng)用,這部分稱為動態(tài)連接

方法出口:返回方法被調(diào)用的位置,恢復(fù)上層方法的局部變量和操作數(shù)棧,如果無返回值,則把它壓入調(diào)用者的操作數(shù)棧。

局部變量表所需的內(nèi)存空間在編譯期間完成分配,當(dāng)進(jìn)入一個方法時,這個方法需要在幀中分配多大的局部變量空間是完全確定的。

在方法運(yùn)行期間不會改變局部變量表的大小。主要存放了編譯期可知的各種基本數(shù)據(jù)類型、對象引用 (reference類型)、returnAddress類型)。

java虛擬機(jī)棧,規(guī)定了兩種異常狀況:

如果線程請求的深度大于虛擬機(jī)所允許的深度,將拋出StackOverflowError異常。

如果虛擬機(jī)棧動態(tài)擴(kuò)展,而擴(kuò)展時無法申請到足夠的內(nèi)存,就會拋出OutOfMemoryError異常。

2.2.3 本地方法棧

可通過參數(shù) 棧容量可由-Xss設(shè)置

虛擬機(jī)棧為虛擬機(jī)執(zhí)行Java方法(也就是字節(jié)碼)服務(wù)。

本地方法棧則是為虛擬機(jī)使用到的Native方法服務(wù)。有的虛擬機(jī)(譬如Sun HotSpot虛擬機(jī))直接就把本地方法棧和虛擬機(jī)棧合二為一。

2.2.4 java堆

可通過參數(shù) -Xms 初始堆大小-Xmx 最大堆大小-Xmn 新生代` 設(shè)置

Java堆是被所有線程共享,是Java虛擬機(jī)所管理的內(nèi)存中最大的一塊 Java堆在虛擬機(jī)啟動時創(chuàng)建。

Java堆唯一的目的是存放對象實例,幾乎所有的對象實例和數(shù)組都在這里。

Java堆為了便于更好的回收和分配內(nèi)存,可以細(xì)分為,新生代和老年代

 **再細(xì)致一點(diǎn)的有Eden空間、From Survivor空間、To Survivor區(qū)**。

新生代:包括Eden區(qū)、From Survivor區(qū)、To Survivor區(qū),系統(tǒng)默認(rèn)大小Eden:Survivor=8:1:1。

老年代:在年輕代中經(jīng)歷了N次垃圾回收后仍然存活的對象,就會被放到老年代中。因此,可以認(rèn)為老年代中存放的都是一些生命周期較長的對象。

Survivor空間等Java堆可以處在物理上不連續(xù)的內(nèi)存空間中,只要邏輯上是連續(xù)的即可(就像我們的磁盤空間一樣。在實現(xiàn)時,既可以實現(xiàn)成固定大小的,也可以是可擴(kuò)展的)。

據(jù)Java虛擬機(jī)規(guī)范的規(guī)定,當(dāng)方法區(qū)無法滿足內(nèi)存分配需求時,將拋出OutOfMemoryError異常。

2.2.5 方法區(qū)

可通過參數(shù)-XX:MaxPermSize設(shè)置

線程共享內(nèi)存區(qū)域,用于儲存已被虛擬機(jī)加載的類信息、常量、靜態(tài)變量,即編譯器編譯后的代碼,方法區(qū)也稱持久代(Permanent Generation)。

雖然Java虛擬機(jī)規(guī)范把方法區(qū)描述為堆的一個邏輯部分,但是它卻有一個別名叫做Non-Heap(非堆),目的應(yīng)該是與Java堆區(qū)分開來。

如何實現(xiàn)方法區(qū),屬于虛擬機(jī)的實現(xiàn)細(xì)節(jié),不受虛擬機(jī)規(guī)范約束。

方法區(qū)主要存放java類定義信息,與垃圾回收關(guān)系不大,方法區(qū)可以選擇不實現(xiàn)垃圾回收,但不是沒有垃圾回收。

方法區(qū)域的內(nèi)存回收目標(biāo)主要是針對常量池的回收和對類型的卸載。

運(yùn)行時常量池,也是方法區(qū)的一部分,虛擬機(jī)加載Class后把常量池中的數(shù)據(jù)放入運(yùn)行時常量池。

2.2.6 運(yùn)行時常量池

可通過參數(shù)-XX:PermSize-XX:MaxPermSize設(shè)置

常量池(Constant Pool):常量池數(shù)據(jù)編譯期被確定,是Class文件中的一部分。存儲了類、方法、接口等中的常量,當(dāng)然也包括字符串常量。

字符串池/字符串常量池(String Pool/String Constant Pool):是常量池中的一部分,存儲編譯期類中產(chǎn)生的字符串類型數(shù)據(jù)。

運(yùn)行時常量池(Runtime Constant Pool):方法區(qū)的一部分,所有線程共享。虛擬機(jī)加載Class后把常量池中的數(shù)據(jù)放入到運(yùn)行時常量池。常量池:可以理解為Class文件之中的資源倉庫,它是Class文件結(jié)構(gòu)中與其他項目資源關(guān)聯(lián)最多的數(shù)據(jù)類型。

常量池中主要存放兩大類常量:字面量(Literal)和符號引用(Symbolic Reference)。

字面量:文本字符串、聲明為final的常量值等;。

符號引用:類和接口的完全限定名(Fully Qualified Name)、字段的名稱和描述符(Descriptor)、方法的名稱和描述符。

JDK1.6之前字符串常量池位于方法區(qū)之中。

JDK1.7字符串常量池已經(jīng)被挪到堆之中

2.2.7 直接內(nèi)存

可通過-XX:MaxDirectMemorySize指定,如果不指定,則默認(rèn)與Java堆的最大值(-Xmx指定)一樣。

直接內(nèi)存(Direct Memory)并不是虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)的一部分,也不是Java虛擬機(jī)規(guī)范中定義的內(nèi)存區(qū)域,但是這部分內(nèi)存也被頻繁地使用,而且也可能導(dǎo)致OutOfMemoryError異常出現(xiàn)。

2.3 hotspot虛擬機(jī)對象探秘 2.3.1 對象的創(chuàng)建

主要探討HotSpot虛擬機(jī)在Java堆中對象分配、布局和訪問的全過程

虛擬機(jī)遇到new指令時

首先去檢查這個指令的參數(shù)能否在常量池中定位到一個類的符號引用,并且檢查引用代表的類是否已被加載、解析和初始化過。如果沒有,則執(zhí)行類加載過程(第7章 虛擬機(jī)類加載機(jī)制)。

加載檢查通過后,分配內(nèi)存(內(nèi)存在類加載完成后便可完全確定)。

內(nèi)存分配完成后,虛擬機(jī)對對象進(jìn)行必要的設(shè)置,如對象是哪個類的實例、如何找到類的元數(shù)據(jù)信息等(都放在對象的對象頭中)。

從虛擬機(jī)角度看,一個新的對象產(chǎn)生了,但從java程序視角看,對象創(chuàng)建才剛剛開始,因為方法還沒有執(zhí)行,,所有字段為零。執(zhí)行new指令之后會接著執(zhí)行方法(構(gòu)造方法),進(jìn)行初始化,這樣一個真正可用的對象才算完成產(chǎn)生。

2.3.2 對象的內(nèi)存布局

對象在內(nèi)存中存儲的布局可以分為3塊區(qū)域:對象頭、實例數(shù)據(jù)、對齊填充

對象頭包含兩部分(Header)

存儲對象自身的 運(yùn)行時數(shù)據(jù),如哈希碼、GC分代年齡等。長度在32位和64位的虛擬機(jī)中,分別為32bit、 64bit,官方稱它為“Mark Word”。

類型指針,對象指向它的類元數(shù)據(jù)的指針,虛擬機(jī)通過這個指針來確定這個對象是哪個類的實例。

注:如果對象是一個java數(shù)組,對象頭中還必須有一塊記錄數(shù)據(jù)長度的數(shù)據(jù)

實例數(shù)據(jù)(InstanceData)

對象真正存儲的有用信息,也是程序中定義的各種類型的字段內(nèi)容。

對齊填充(Padding)

由于HotSpot虛擬機(jī)要求對象的起始地址必須是8字節(jié)的整數(shù)倍,通俗的說,就是對象大小必須是8字節(jié)的整數(shù)倍。對象頭正好是8字節(jié)的倍數(shù)。當(dāng)實例數(shù)據(jù)部分沒有對齊時,需要通過對齊填充來補(bǔ)全。

2.3.3 對象的訪問定位

Java程序通過棧上的reference數(shù)據(jù)來操作堆上的具體對象。

不同虛擬機(jī)實現(xiàn)的對象訪問方式會有所不同,目前主流的訪問方式有兩種:使用句柄和直接指針。

使用句柄 是間接訪問,優(yōu)點(diǎn)是reference中存儲的是穩(wěn)定的句柄地址,對象移動時只會改變句柄中的實例數(shù)據(jù)指針。

使用直接指針 是直接訪問,優(yōu)點(diǎn)就是速度快。

最后上一張本章結(jié)構(gòu)圖
圖片來源于網(wǎng)絡(luò)如有侵權(quán)請私信刪除

《深入理解Java虛擬機(jī):JVM高級特性與最佳實踐_周志明.高清掃描版.pdf》

下載地址:鏈接:http://pan.baidu.com/s/1miBQCBY 密碼:9kbn

推薦閱讀

《深入理解Java虛擬機(jī)》(一)Java虛擬機(jī)發(fā)展史

《深入理解Java虛擬機(jī)》(二)Java虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)

《深入理解Java虛擬機(jī)》(三)垃圾收集器與內(nèi)存分配策略

《深入理解Java虛擬機(jī)》(四)虛擬機(jī)性能監(jiān)控與故障處理工具

《深入理解Java虛擬機(jī)》(五)JVM調(diào)優(yōu) - 工具

《深入理解Java虛擬機(jī)》(六)堆內(nèi)存使用分析,GC 日志解讀

Contact

作者:鵬磊

出處:http://www.ymq.io

Email:[email protected]

版權(quán)歸作者所有,轉(zhuǎn)載請注明出處

Wechat:關(guān)注公眾號,搜云庫,專注于開發(fā)技術(shù)的研究與知識分享

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67529.html

相關(guān)文章

  • 【JVM從小白學(xué)成大佬】2.Java虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)

    摘要:虛擬機(jī)在執(zhí)行程序的過程中會把它所管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域。棧幀棧幀是用于支持虛擬機(jī)進(jìn)行方法調(diào)用和方法執(zhí)行的數(shù)據(jù)結(jié)構(gòu),它是虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)中的虛擬機(jī)棧的棧元素。棧幀的概念結(jié)構(gòu)如下運(yùn)行時數(shù)據(jù)區(qū)腦圖高 這里我們先說句題外話,相信大家在面試中經(jīng)常被問到介紹Java內(nèi)存模型,我在面試別人時也會經(jīng)常問這個問題。但是,往往都會令我比較尷尬,我還話音未落,面試者就會背誦一段(Java虛擬...

    shuibo 評論0 收藏0
  • 深入理解JVM》讀書筆記

    摘要:抽時間重新讀了一遍深入理解一書。驗證確保文件的字節(jié)流中包含的信息符合當(dāng)前虛擬機(jī)的要求,并且不會危害虛擬機(jī)自身的安全??梢娦钥梢娦允侵府?dāng)一個線程修改了共享變量的值,其他線程能夠立即得知這個修改。 抽時間重新讀了一遍《深入理解JVM》一書。以下為摘錄內(nèi)容。 1 java內(nèi)存區(qū)域 showImg(https://segmentfault.com/img/bVboDgk?w=617&h=365...

    idealcn 評論0 收藏0
  • java虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)

    摘要:虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū)虛擬機(jī)在執(zhí)行程序的過程中會把它管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域。此內(nèi)存區(qū)域是唯一一個在虛擬機(jī)規(guī)范中沒有規(guī)定任何情況的區(qū)域。 showImg(https://segmentfault.com/img/bVbvueY?w=1600&h=800); java虛擬機(jī)運(yùn)行時數(shù)據(jù)區(qū) java虛擬機(jī)在執(zhí)行java程序的過程中會把它管理的內(nèi)存劃分為若干個不同的數(shù)據(jù)區(qū)域。根據(jù)《Ja...

    sunnyxd 評論0 收藏0
  • 深入理解Java虛擬機(jī)》(一)Java虛擬機(jī)發(fā)展史

    摘要:虛擬機(jī)發(fā)展史注本文大部分摘自深入理解虛擬機(jī)第二版作為一名開發(fā)人員,不能局限于語言規(guī)范,更需要對虛擬機(jī)規(guī)范有所了解。虛擬機(jī)規(guī)范有多種實現(xiàn),其中是和中所帶的虛擬機(jī),也是目前使用范圍最廣的虛擬機(jī)。世界第一款商用虛擬機(jī)。號稱世界上最快的虛擬機(jī)。 Java虛擬機(jī)發(fā)展史 注:本文大部分摘自《深入理解Java虛擬機(jī)(第二版)》 作為一名Java開發(fā)人員,不能局限于Java語言規(guī)范,更需要對Java虛...

    張春雷 評論0 收藏0
  • 深入理解虛擬機(jī)Java內(nèi)存區(qū)

    摘要:深入理解虛擬機(jī)高級特性與最佳實踐第二版讀書筆記與常見面試題總結(jié)本節(jié)常見面試題介紹下內(nèi)存區(qū)域運(yùn)行時數(shù)據(jù)區(qū)。運(yùn)行時數(shù)據(jù)區(qū)域虛擬機(jī)在執(zhí)行程序的過程中會把它管理的內(nèi)存劃分成若干個不同的數(shù)據(jù)區(qū)域。 《深入理解Java虛擬機(jī):JVM高級特性與最佳實踐(第二版》讀書筆記與常見面試題總結(jié) 本節(jié)常見面試題: 介紹下Java內(nèi)存區(qū)域(運(yùn)行時數(shù)據(jù)區(qū))。 對象的訪問定位的兩種方式。 1 概述 對于Java...

    lavnFan 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<