<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          JVM內(nèi)存模型分析(通俗易懂)

          共 1652字,需瀏覽 4分鐘

           ·

          2022-04-27 22:57

          ?JVM(Java虛擬機)主要包括五塊區(qū)域,分別是程序計數(shù)器、虛擬機棧、本地方法棧、堆、方法區(qū)。在JVM當(dāng)中堆和方法區(qū)各有一個,一條線程有一個棧和一個程序計數(shù)器五塊區(qū)域中當(dāng)中變化最頻繁是棧,最先有數(shù)據(jù)的是方法區(qū),垃圾回收器主要針對的是堆。


          1.程序計數(shù)器(PC寄存器)

          ????????由于在JVM中多線程是通過線程輪流切換來換取CPU執(zhí)行時間的,在任何一個確定的時刻,一個CPU只會執(zhí)行一條線程的指令。因此,為了線程切換后能恢復(fù)到正確的執(zhí)行位置,每條線程都需要一個獨立的程序計數(shù)器。

          ????????程序計數(shù)器占用內(nèi)存空間非常小,是線程私有的,每個線程運行的時候都會有一個獨立的計數(shù)器,是Java虛擬機規(guī)范中唯一一個沒有規(guī)定任何OutOfMemoryError情況的區(qū)域。如果程序執(zhí)行的時候線程執(zhí)行的是一個Java方法,計數(shù)器是有值的,其記錄的是程序正在執(zhí)行的字節(jié)碼指令的地址;如果執(zhí)行的是Natvie方法,計數(shù)器的值則為空(Undefined)。

          2.虛擬機棧

          ???????? Java虛擬機棧是線程私有的,生命周期和線程一致,存儲的是一個個棧幀,每個棧幀對應(yīng)著一個被調(diào)用的方法。方法調(diào)用的時候,該方法所需的內(nèi)存空間在棧內(nèi)存中分配,稱為壓棧。方法執(zhí)行結(jié)束之后,該方法所屬的內(nèi)存空間釋放,稱為彈棧(棧內(nèi)存遵循先進后出,后進先出的原則)。虛擬機棧中主要存儲的是局部變量、引用、操作數(shù)棧、動態(tài)鏈接、方法的出口等信息。

          Java虛擬機規(guī)范中,對這個區(qū)域規(guī)定了兩個異常情況:

          • StackOverflowError:線程請求的棧深度大于虛擬機所允許的深度。

          • OutOfMemoryError:如果虛擬機棧可以動態(tài)擴展,而擴展時無法申請到足夠的內(nèi)存。



          3.本地方法棧

          ????????本地方法棧與Java虛擬機棧的的作用和原理非常相似,其區(qū)別只不過是虛擬機棧為虛擬機執(zhí)行Java方法(也就是字節(jié)碼)服務(wù),而本地方法棧則是為虛擬機使用到的Native方法服務(wù)。

          本地方法棧區(qū)域也會拋出StackOverflowError和OutOfMemoryError異常。


          4.堆

          ????????對于大多數(shù)應(yīng)用來說,這塊區(qū)域是JVM所管理的內(nèi)存中最大的一塊。堆是被所有線程共享的一塊區(qū)域,在虛擬機創(chuàng)建時啟動。堆當(dāng)中主要存儲的是對象實例和數(shù)組,在程序執(zhí)行過程中使用new運算符創(chuàng)建的Java對象,存儲在堆內(nèi)存當(dāng)中。對象內(nèi)部有實例變量,所以實例變量存儲在堆內(nèi)存當(dāng)中。是垃圾回收機制主要管理的區(qū)域。

          Java虛擬機規(guī)范中,對這個區(qū)域規(guī)定了一個異常情況:

          • OutOfMemoryError:如果堆中沒有內(nèi)存完成實例分配,并且堆也無法再擴展時,拋出該異常。

          5.方法區(qū)

          ????????方法區(qū)與堆一樣是各個線程共享的區(qū)域,主要存儲了類信息(類的名稱、方法信息、字段信息)、靜態(tài)變量、常量以及編譯后的代碼片段(在類被加載的時候代碼片段會載入)等。

          ????????在Class文件中除了類的字段、方法、接口等描述信息外,還有一項信息是常量池,用來存儲編譯期間生成的字面量和符號引用。

          ????????在方法區(qū)中有一個非常重要的部分就是運行時常量池,它是每一個類或接口的常量池的運行時表示形式,在類和接口被加載到JVM后,對應(yīng)的運行時常量池就被創(chuàng)建出來。當(dāng)然并非Class文件常量池中的內(nèi)容才能進入運行時常量池,在運行期間也可將新的常量放入運行時常量池中,比如String的intern方法。內(nèi)存有限,無法申請時拋出 OutOfMemoryError異常。





          6.垃圾回收器【自動垃圾回收機制、GC機制】什么時候會考慮將某個Java對象的內(nèi)存回收呢?

          • 當(dāng)堆中的Java對象成為垃圾數(shù)據(jù)的時候,會被垃圾回收器回收。

          • 什么時候堆內(nèi)存中Java對象會變成垃圾呢?

          ?????????沒有更多的引用指向它的時候。

          ?????????這個對象無法被訪問,因為訪問對象只能通過引用的方式訪問。




          如果此篇文章幫助到了你,看完文章請幫忙點個贊和在看,感謝!


          瀏覽 24
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  麻豆网站-麻豆午夜在线-成人AV | 东京热视频专区 | 久久国产精品伦子伦 | 黄网在线播放 | 日本动漫操逼一区二区 |