Paste_Image.png
運行時數據區
要討論的就是:運行時數據區。一般,我們叫它java內存。
關于這個,普遍的圖示是這樣的:
Paste_Image.png
但是我覺得,應該畫成:
Paste_Image.png
程序計數器:就是一個記錄當前程序運行到哪一行
占用空間小 (每次別人畫那么大,很容易誤會)方法區和堆
#方法區
存儲了
* 每個類的信息(包括類的名稱、方法信息、字段信息)
* 靜態變量
* 常量
* 編譯器編譯后的代碼等
#堆
Java中的堆是用來存儲對象本身的以及數組(當然,數組引用是存放在Java棧中的)。
堆是被所有線程共享的,在JVM中只有一個堆。
垃圾回收機制,就是搞這個的。
#個人觀點
堆和方法區,其實都是真正存放了信息的內存區域。
真正存放信息的意思是,存放了有內容的數據,而不是指針或是引用等等。
#差別是:
方法區是給執行引擎用的。
(額,也可能不是執行引擎,可能是虛擬機自己用,
總之,是整個java的本身運行機制需要用到的信息,存在方法區。)
而堆中的數據是給線程用的。
(也就是我們業務邏輯關注的那部分數據。)
- 本地方法棧和java虛擬機棧
#java虛擬機棧
就是我們常說的棧。用于存儲,函數調用,而導致需要存儲的內容。
簡單舉個例子:
函數A(){
函數B();
}
從函數A 跳到函數B,
等函數B運行完成,需要回到函數B,
那么怎么回去,就是從棧頭pop信息出來。
這個信息包括:各種數據信息:esp,dsp,pc 等等一系列的信息。
都是由于函數調用導致的信息。具體要看看操作系統。
#本地方法棧
本地方法棧與Java棧的作用和原理非常相似。
區別只不過是Java棧是為執行Java方法服務的,而本地方法棧則是為執行本地方法(Native Method)服務的。
在JVM規范中,并沒有對本地方法棧的具體實現方法以及數據結構作強制規定,虛擬機可以自由實現它。
在HotSopt虛擬機中直接就把本地方法棧和Java棧合二為一。