

用于存儲已被虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯后的代碼等數據。雖然java虛擬機規范把方法區描述為堆得一個邏輯部分,但是他卻有一個別名叫做Non-Heap,目的應該是與java堆區分開來。
Class文件中除了有類的版本,字段,方法,接口等描述信息外,還有一項信息是常量池,用于存放編譯期生成的各種字面量和符號引用,這部分內容將在類加載后存放到方法區的運行時常量池中。 一般來說,除了保存在Class文件中描述的符號引用外,還會把翻譯出來的直接引用也存儲在運行時常量池中。
存儲java實例或者對象的地方。這塊是GC的主要區域。從存儲的內容我們可以很容易知道,方法區和堆是被所有java線程共享的。
~線程獨有~
java棧總是和線程關聯在一起,每當創建一個線程時,JVM就會為這個線程創建一個對應的java棧。
在這個java棧中又會包含多個棧幀,每個方法被執行的時候都會同時創建一個棧幀(Stack Frame)用于存儲局部變量表、操作棧、動態鏈接、方法出口。 每一個方法從調用直至執行完成的過程,就對應一個棧幀在java棧中入棧到出棧的過程。 當進入一個方法時,這個方法需要在幀中分配多大的局部變量空間是完全確定的,在方法運行期間不會改變局部變量表的大小。
局部變量表存放了編譯期可知的各種基本數據類型(boolean、byte、char、short、int、float、long、double)、對象引用(reference類型),它不等同于對象本身,根據不同的虛擬機實現,它可能是一個指向對象起始地址的引用指針,也可能指向一個代表對象的句柄或者其他與此對象相關的位置)和returnAddress類型(指向了一條字節碼指令的地址)。
用于保存當前線程執行的內存地址。由于JVM程序是多線程執行的(線程輪流切換),所以為了保證線程切換回來后,還能恢復到原先狀態,就需要一個獨立的計數器,記錄之前中斷的地方,可見程序計數器也是線程私有的。
和java棧的作用差不多,只不過是為JVM使用到的native方法服務的。
新聞熱點
疑難解答