久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長(zhǎng)資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      JAVA虛擬機(jī)(JVM)詳細(xì)講解(二)——內(nèi)存的劃分

      我們知道,在C++語(yǔ)言里,如果想使用一個(gè)對(duì)象,需要對(duì)其進(jìn)行new操作;如果不用這個(gè)對(duì)象了,需要對(duì)其進(jìn)行delete操作。一旦開(kāi)發(fā)人員忘記寫delete語(yǔ)句了,就會(huì)造成內(nèi)存泄露?!緝?nèi)存被對(duì)象占用著不還,就叫內(nèi)存泄露?!?/p>

      而java就聰明了,它從“手動(dòng)”進(jìn)化成了“自動(dòng)”,把內(nèi)存的控制權(quán)力交給了虛擬機(jī)。下面我們就來(lái)窺探一下jvm是怎么進(jìn)行自動(dòng)內(nèi)存管理的。

      JAVA虛擬機(jī)(JVM)詳細(xì)講解(二)——內(nèi)存的劃分

      自動(dòng)內(nèi)存管理分為兩部分

      給對(duì)象分配內(nèi)存和回收分配給對(duì)象的內(nèi)存。在本篇我們說(shuō)說(shuō)前者,也就是內(nèi)存劃分和內(nèi)存分配。下篇再說(shuō)GC(垃圾回收)。

      1、內(nèi)存劃分

      我們來(lái)看看虛擬機(jī)內(nèi)存里都有什么東西。JVM的內(nèi)存區(qū)域大致分為Class文件、類裝載子系統(tǒng)、運(yùn)行時(shí)數(shù)據(jù)區(qū)、執(zhí)行引擎。今天我們只說(shuō)說(shuō)運(yùn)行時(shí)數(shù)據(jù)區(qū)?!具@張圖是基于JDK7的。JDK7以前,常量池是存放在方法區(qū)的。從JDK7以后,常量池放到了堆中?!?/p>

      JAVA虛擬機(jī)(JVM)詳細(xì)講解(二)——內(nèi)存的劃分

      線程公有

      在運(yùn)行時(shí)數(shù)據(jù)區(qū)中,方法區(qū)和堆是屬于線程公有的,也就是這兩塊區(qū)域是“循環(huán)利用”的,所以要對(duì)其進(jìn)行垃圾回收。其是在虛擬機(jī)啟動(dòng)時(shí)創(chuàng)建。

      線程私有

      虛擬機(jī)棧、本地方法棧、程序計(jì)數(shù)器是屬于線程私有的,其與線程“同生死”,屬于“一次性”的,所以不用對(duì)其進(jìn)行垃圾回收。

      (一)方法區(qū)

      存儲(chǔ)已被虛擬機(jī)加載的類信息,常量,靜態(tài)變量,即時(shí)編譯器編譯后的代碼等數(shù)據(jù)。
      其中有一個(gè)運(yùn)行時(shí)常量池。其存儲(chǔ)的是Class文件中描述的符號(hào)引用,直接引用。在編譯期和運(yùn)行期都可以將新的常量放入此池子中。

      (2) 堆

      概念:如果說(shuō)棧解決的是程序運(yùn)行問(wèn)題,即程序如何處理數(shù)據(jù);則堆解決的是數(shù)據(jù)存儲(chǔ)問(wèn)題,即數(shù)據(jù)怎么放,放在哪。

      特點(diǎn):

      a、堆是虛擬機(jī)內(nèi)存中最大的一塊,大概占內(nèi)存的四分之三。比如一個(gè)32位windows平臺(tái)中每個(gè)進(jìn)程有2GB的內(nèi)存,則一般將1.5GB的內(nèi)存劃分給堆。可見(jiàn)堆的所占空間之大。
      b、可處于物理上不連續(xù)的內(nèi)存空間中,只要邏輯上是連續(xù)的即可。

      作用:

      存放對(duì)象實(shí)例,幾乎所有的對(duì)象實(shí)例都在這里分配內(nèi)存。

      分類:

      從內(nèi)存回收的角度看,分為新生代和老年代。
      從內(nèi)存分配的角度看,可劃分出多個(gè)線程私有的分配緩沖區(qū)。

      (3)虛擬機(jī)棧

      虛擬機(jī)棧里面存儲(chǔ)的是棧幀,棧幀里面存儲(chǔ)的是局部變量表,操作數(shù)棧,動(dòng)態(tài)鏈接,方法出口等信息。

      JAVA虛擬機(jī)(JVM)詳細(xì)講解(二)——內(nèi)存的劃分

      棧中的棧幀

      每個(gè)方法在執(zhí)行的同時(shí)都會(huì)創(chuàng)建一個(gè)棧幀,一個(gè)方法從調(diào)用到執(zhí)行完成的過(guò)程,就對(duì)應(yīng)著一個(gè)棧幀在虛擬機(jī)棧中入棧到出棧的過(guò)程。

      棧幀中的局部變量表

      存放的是編譯期可知的各種基本數(shù)據(jù)類型,對(duì)象引用,returnAddress類型。所以其所需的內(nèi)存空間在編譯期間就能完成分配,在運(yùn)行期間不會(huì)改變其大小。

      在分配基本數(shù)據(jù)類型所占的空間時(shí),除了64位的long和double類型的數(shù)據(jù)會(huì)占用2個(gè)局部變量空間,其余的數(shù)據(jù)類型只占用1個(gè)。

      (4)本地方法棧

      本地方法棧和虛擬機(jī)棧的作用是相同的,只不過(guò)虛擬機(jī)棧執(zhí)行的是java方法,本地方法棧執(zhí)行的是Native方法。
      java方法就是開(kāi)發(fā)人員寫的java代碼,Native方法就是一個(gè)java調(diào)用非java代碼的接口。

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

      程序計(jì)數(shù)器中存放的是當(dāng)前線程所執(zhí)行的字節(jié)碼的行號(hào)。jvm工作時(shí),就是通過(guò)改變這個(gè)計(jì)數(shù)器的值來(lái)選取下一條需要執(zhí)行的字節(jié)碼指令。

      2、內(nèi)存分配

      這部分我們說(shuō)說(shuō)對(duì)象在java堆中是如何分配,布局和訪問(wèn)的,以及內(nèi)存分配的原則。

      對(duì)象的創(chuàng)建

      我們用new來(lái)創(chuàng)建對(duì)象,來(lái)看看系統(tǒng)運(yùn)行到new時(shí),虛擬機(jī)在干什么。此時(shí)的類就像一塊肉,他要經(jīng)過(guò)層層安檢,才能到達(dá)人類的飯桌。第一步:查看在常量池中是否有對(duì)應(yīng)的符號(hào)引用?!驹诜椒▍^(qū)中進(jìn)行】

      第二步:查看此類是否被加載,解析和初始化過(guò)?!驹诜椒▍^(qū)中進(jìn)行】

      第三步:領(lǐng)取新生對(duì)象的內(nèi)存。有兩種方式:指針碰撞和空閑列表?!驹诙阎羞M(jìn)行】

      第四步:將分配到的內(nèi)存空間初始化為零值。

      第五步:對(duì)對(duì)象進(jìn)行必要的設(shè)置,比如其是哪個(gè)類的實(shí)例,對(duì)象的哈希碼之類的。這些信息存放在對(duì)象的對(duì)象頭之中

      第六步:如果java代碼中對(duì)對(duì)象進(jìn)行了賦初值,則會(huì)進(jìn)行第六步:執(zhí)行< init >方法。此方法的作用就是對(duì)對(duì)象進(jìn)行初始化。

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

      對(duì)象在內(nèi)存中的存儲(chǔ)布局分為3部分:對(duì)象頭+實(shí)例數(shù)據(jù)+對(duì)齊填充

      對(duì)象頭

      對(duì)象頭里面有兩部分信息:

      (1)運(yùn)行時(shí)數(shù)據(jù),包括哈希碼,GC分代年齡,鎖狀態(tài)標(biāo)志等。

      (2)類型指針,虛擬機(jī)通過(guò)這個(gè)指針來(lái)確定這個(gè)對(duì)象是哪個(gè)類的實(shí)例。

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

      實(shí)例數(shù)據(jù)中存放的是代碼中定義的各種類型的字段內(nèi)容。

      對(duì)齊填充

      對(duì)齊填充起的是占位符的作用,不是必然存在的。其只要保證對(duì)象的大小是8字節(jié)的整數(shù)倍即可。

      對(duì)象的訪問(wèn)定位

      建立完對(duì)象后,我們就可以使用對(duì)象了。在使用時(shí),怎么才能找到想找的對(duì)象?有兩種方式:句柄和直接指針

      句柄:

      句柄訪問(wèn)就是在java堆中劃分出一塊內(nèi)存來(lái)作為句柄池,句柄中包含了對(duì)象實(shí)例數(shù)據(jù)和類型數(shù)據(jù)各自具體的地址信息。

      JAVA虛擬機(jī)(JVM)詳細(xì)講解(二)——內(nèi)存的劃分

      直接指針:

      直接指針之所以“直接”,是因?yàn)樗コ司浔@個(gè)中介。所以在速度上比句柄快。在HotSpot虛擬機(jī)中,使用的是這種方式。

      JAVA虛擬機(jī)(JVM)詳細(xì)講解(二)——內(nèi)存的劃分

      說(shuō)完了對(duì)象在java堆中是如何分配,布局和訪問(wèn)的,接下來(lái)我們說(shuō)說(shuō)內(nèi)存分配的原則

      內(nèi)存分配的原則:

      JAVA虛擬機(jī)(JVM)詳細(xì)講解(二)——內(nèi)存的劃分

      堆大致分為新生代,老年代,永久代。對(duì)象的內(nèi)存分配主要分配在新生代的Eden區(qū),少數(shù)情況下會(huì)直接分配到老年代中。分配的規(guī)則不是100%固定的,取決于垃圾收集器組合和參數(shù)設(shè)置等。下面有幾條分配原則可供參考。

      (1)對(duì)象優(yōu)先在Eden分配。

      (2)大對(duì)象直接進(jìn)入老年代。

      (3)長(zhǎng)期存活的對(duì)象將進(jìn)入老年代。

      (4)動(dòng)態(tài)對(duì)象年齡判定。

      (5)空間分配擔(dān)保。

      以上便是JAVA虛擬機(jī)中關(guān)于內(nèi)存的劃分部分,

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)