運行時數據區域
JVM在執行Java程序的過程中會把說管理的內存分爲不同的數據區域。有的區域是在虛擬機啓動而創建,有的區域則是跟隨線程的啓動和結束而建立銷燬。如下圖,在JVM GC調優中通常都是堆、方法區。
1.程序計數器(Pc Register)
每個線程都有自己的Pc Register,它的作用是當前線程所執行的指令地址。
2.Java虛擬器棧(statck)
Java虛擬機棧是線程私有的,每個線程都有自己的虛擬機棧,它的生命週期與線程相同。虛擬機棧描述的是Java方法執行的內存模型:每個方法被執行時,都會創建一個棧幀,用於存儲局部變量,操作數棧,動態鏈接,方法出口等信息。每一個方法從調用直至執行完成的過程,就對應着一個棧幀在虛擬機棧中入棧到出棧的過程。後續會詳細講一下虛擬機棧中的操作數棧。
3.堆(heap)
Java堆是Jvm內存管理中內存最大的一塊,堆是所有線程共享的內存區域,它用於存放所有實例對象,也是GC回收的主要對象,後續會講到GC。
4.方法區(Method Area)
方法區也是所有線程共享的內存區域,它主要存放被虛擬機加載的類信息,常量,靜態變量等。
5.本地方法棧
與虛擬機棧類似,不過它爲使用Native方法服務。
6.運行時常量池
它屬於方法區中的一部分。在Class常量池中,用於存放編譯期生成的字面量和符號引用,在類加載後,這部分將會存放到運行時常量池中。運行時常量池一個重要特徵是具有動態性,在運行期間也可能將有新的常量放入到池中(如String類的intern()方法)。後續會講到Class常量池,String常量池,運行時常量池的區別。