Java虛擬機(虛擬機內存分析)

java虛擬機是java程序員的操作系統,所以掌握java虛擬機對於java程序員來說很有必要。在接下來的時間裏,我將重點總結和分析java虛擬機的相關知識。參看書籍選擇《java虛擬機規範》和周志明老師的《深入理解java虛擬機》,這兩本書是學習java虛擬機的必備書籍。

虛擬機內存分析

java虛擬機內存組成部分
如上圖所示,java虛擬機內存分爲方法區、堆內存、虛擬機棧、本地方法棧,程序計數器幾個部分,下面分別介紹每個部分的作用。

程序計數器
程序計數器的作用是用來記錄程序運行的行數,可以看作是當前線程所執行的字節碼的行號指示器,字節碼指示器通過修改這個計數器的值來改變下一條需要執行的字節碼。分支、循環、條件語句的實現都依賴於這個程序計數器。
在進行多線程操作時,需要再不同的線程之間進行切換,實現不同線程的切換需要依賴程序計數器,爲了使每條線程能夠互不影響地執行,每個線程都擁有自己的程序計數器,所以程序計數器是“線程私有的”。


“堆”是一塊非常重要的內存,所有的對象實例都存在於該區域,《java虛擬機規範》這樣描述堆:所有的對象實例以及數組都要再堆上進行分配。“堆”也是垃圾收集器的重點工作區域,不再使用的對象實例都要被垃圾收集器清理。爲了便於垃圾收集器管理,所以堆又可以分爲“新生代”和“老年代”。無論如何劃分,”堆“內所存儲的都是對象實例和數組。進一步劃分的主要目的是便於垃圾收集以及內存分配。

方法區
方法區同樣屬於”堆“。但方法區與”堆“又有所不同。方法區與java堆一樣,是各個線程共享的內存區域,它用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯過的代碼數據。方法區被稱爲”永久代“是因爲該區域的數據不會被垃圾收集器回收。但這並不絕對,不同的虛擬機有不同的實現方式。

java虛擬機棧
java虛擬機棧是線程私有的。虛擬機棧描述的是java方法執行的內存模型:每個方法在執行的同時都會創建一個棧幀用於存儲局部變量表、操作數棧、動態鏈接、方法出口等信息。存儲局部變量表存放了編譯器可知的各種數據類型(int, boolean, double, float, short, byte,char),對象引用類型等。

本地方法棧
本地方法棧與java虛擬機棧的作用相類似,不同之處在於java虛擬機棧爲java方法服務,而本地方法棧爲native方法服務。

每個內存區域都有其特定作用,java在運行的過程中,有不同的概念,比如對象實例、引用、靜態變量、類信息所具備不同的功能,有的需要定期清理,有的需要被各個線程共享。java的不同作用決定了要分爲不同的內存區域。但每個區域是如何配合運行的還需進一步學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章