JVM記憶體分為哪幾部分?各個部分的作用是什麼? JVM記憶體分為哪幾部分?各個部分的作用是什麼? JVM記憶體分為哪幾部分?各個部分的作用是什麼? JVM記憶體分為哪幾部分?各個部分的作用是什麼? 1. Java虛擬機記憶體的五大區域 Java的運行離不開Java虛擬機的支持,今天我就跟大家探討一下Java ...
JVM記憶體分為哪幾部分?各個部分的作用是什麼?
1. Java虛擬機記憶體的五大區域
Java的運行離不開Java虛擬機的支持,今天我就跟大家探討一下Java虛擬機的一些基礎知識。
JVM記憶體區域分為五個部分,分別是堆,方法區,虛擬機棧,本地方法棧,程式計數器。
- 堆。 堆是Java對象的存儲區域,任何用new欄位分配的Java對象實例和數組,都被分配在堆上,Java堆可使用-Xms -Xmx進行記憶體控制,值得一提的是從JDK1.7版本之後,運行時常量池從方法區移到了堆上。
- 方法區。它用於存儲已被虛擬機載入的類信息,常量,靜態變數,即時編譯器編譯後的代碼等數據,方法區在JDK1.7版本及以前被稱為永久代,從JDK1.8永久代被移除。
- 虛擬機棧。虛擬機棧中執行每個方法的時候,都會創建一個棧幀用於存儲局部變數表,操作數棧,動態鏈接,方法出口等信息。
- 本地方法棧。與虛擬機棧發揮的作用相似,相比於虛擬機棧為Java方法服務,本地方法棧為虛擬機使用的Native方法服務,執行每個本地方法的時候,都會創建一個棧幀用於存儲局部變數表,操作數棧,動態鏈接,方法出口等信息。
- 程式計數器。指示Java虛擬機下一條需要執行的位元組碼指令。
以上五個區域是Java虛擬機記憶體劃分情況,其中方法區和堆被JVM中多個線程共用,比如類的靜態常量就被存放在方法區,供類對象之間共用,虛擬機棧,本地方法棧,pc寄存器是每個線程獨立擁有的,不會與其他線程共用。
所以Java在通過new創建一個類對象實例的時候,一方面會在虛擬機棧中創建一個該對象的引用,另一方面會在堆上創建類對象的實例,然後將對象引用指向該對象的實例。對象引用存放在每一個方法對應的棧幀中。