天天看點

jvm記憶體模型_Java性能優化之JVM記憶體模型JVM記憶體模型JVM的記憶體劃分和各區域職責

jvm記憶體模型_Java性能優化之JVM記憶體模型JVM記憶體模型JVM的記憶體劃分和各區域職責

JVM記憶體模型

首先介紹下Java程式具體執行的過程:Java源代碼檔案(.java字尾)會被Java編譯器編譯為位元組碼檔案(.class字尾);

由JVM中的類加載器加載各個類的位元組碼檔案,加載完畢之後,交由JVM執行引擎執行

在整個程式執行過程中,JVM會用==一段空間==來存儲程式執行期間需要用到的資料和相關資訊,這段空間一般被稱作為==Runtime Data Area(運作時資料區)==,也就是我們常說的JVM記憶體;

是以,在Java中我們常常說到的記憶體管理就是針對這段空間進行管理(如何配置設定和回收記憶體空間)

jvm記憶體模型_Java性能優化之JVM記憶體模型JVM記憶體模型JVM的記憶體劃分和各區域職責

JVM的記憶體劃分和各區域職責

程式計數器:程式計數器是指CPU中的寄存器,它儲存的是==程式目前執行的指令的位址==(也可以說儲存下一條指令的所在存儲單元的位址),當CPU需要執行指令時,需要從程式計數器中得到目前需要執行的指令所在存儲單元的位址,然後根據得到的位址擷取到指令,在得到指令之後,程式計數器便自動加1或者根據轉移指針得到下一條指令的位址,如此循環,直至執行完所有的指令;

注:JVM中的程式計數器并不像彙編語言中的程式計數器一樣是實體概念上的CPU寄存器,但是邏輯作用上是等同的,在JVM中多線程是通過線程輪流切換來獲得CPU執行時間的,在任一具體時刻,一個CPU的核心隻會執行一條線程中的指令,為了能夠使得每個線程都線上程切換後能夠恢複在切換之前的程式執行位置,每個線程都需要有自己獨立的程式計數器,并且不能互相被幹擾,否則就會影響到程式的正常執行次序。==是以,可以這麼說,程式計數器是每個線程所私有的==

Java棧:Java棧是Java方法執行的記憶體模型,Java棧中存放的是一個個的棧幀,每個棧幀(包括:局部變量表、操作數棧、運作時常量池(在下文中提到的方法區内)的引用、方法傳回位址和一些額外的附加資訊)對應一個被調用的方法,當線程執行一個方法時,就會随之建立一個對應的棧幀,并将建立的棧幀壓棧。當方法執行完畢之後,便會将棧幀出棧;

注:由于每個線程正在執行的方法可能不同,是以每個線程都會有一個自己的Java棧,互不幹擾

本地方法棧:Java棧是為執行Java方法服務的,而本地方法棧則是為執行本地方法(Native Method)服務的;

堆:Java中的堆是用來存儲對象本身的以及數組;

方法區:它與堆一樣,是被線程共享的區域,存儲了每個類的資訊(包括類的名稱、方法資訊、字段資訊)、靜态變量、常量以及編譯器編譯後的代碼等。

注:在方法區中有一個非常重要的部分就是運作時常量池,它是每一個類或接口的常量池的運作時表示形式,在類和接口被加載到JVM後,對應的運作時常量池就被建立出來。當然并非Class檔案常量池中的内容才能進入運作時常量池,在運作期間也可将新的常量放入運作時常量池中,比如String的intern方法。

jvm記憶體模型_Java性能優化之JVM記憶體模型JVM記憶體模型JVM的記憶體劃分和各區域職責

繼續閱讀