謝邀~
關于JVM的知識,一直令很多Java程序員頭疼,不過JVM也是值得我們深入學習的內容,下面我就談談自己對JVM內存劃分的理解。
什么是Java的內存
學習Java的朋友應該都知道,Java程序是在JVM上運行的,所以我們一般談的Java內存劃分事實上都是指的JVM內存區域的劃分。在討論JVM內存劃分之前,我們需要知道Java程序的執行過程(手動畫圖,有點兒丑):
通過這個圖可以看到,JVM在執行Java程序的時候,要用到一塊空間來存儲運行期間用到的數據,這塊區域就是我們經常用的運行時區域,也就是常說的JVM內存。
Java的內存的組成
程序計數器(ProgramCounterRegister)、Java棧(VMStack)、本地方法棧(NativeMethodStack)、方法區(MethodArea)、堆(Heap)。
這個是Java虛擬機規范規定好的,但是具體怎么實現還是由廠商決定的。
運行的時候,每一個區域存的是什么數據的,先看一張圖:
程序計數器
保存指令地址,也就是存的是下一條執行所在的存儲地址。如果是多線程的時候,因為一個CPU在一個時刻只能執行一條命令,為了能夠讓每一個線程在切換之后能夠恢復切換之前的位置,每個線程就需要有自己的計數器,所以說:
虛擬機棧
就是Stack,存放的是一個個的棧幀,每個棧幀對應一個被調用的方法。在棧幀中存著局部變量表、操作數棧、指向當前方法所屬的類的運行時常量池的引用、方法返回地址和一些額外的附加信息。(這幾個東西都是干啥的,可以單獨寫篇文章說了...)
每個線程都會有一個自己的Java棧,也是線程私有的。
本地方法棧
本地方法棧與Java棧的作用和原理非常相似。區別只不過是Java棧是為執行Java方法服務的,而本地方法棧則是為執行本地方法(NativeMethod)服務的。
在HotSopt虛擬機中直接就把本地方法棧和Java棧合二為一。堆
存儲對象本身的以及數組,
方法區
存儲了每個類的信息(包括類的名稱、方法信息、字段信息)、靜態變量、常量以及編譯器編譯后的代碼等,也是