JVM內存結構

在思考Java內存結構之前,首先要知道 Java 啓動後也作爲一個進程運行在操作系統中,那麼這個進程有哪些部分需要分配內存空間呢?

Java中哪些組件需要使用內存

  1. Java堆
            Java堆是用於存儲Java對象的內存區域,堆的大小在JVM啓動時就一次向操作系統申請完成,通過-Xmx 和 -Xms 兩個選項來控制大小,Xms表示堆的最大大小,
    Xms表示初始大小。一旦分配完成,堆的大小就將固定,不能再內存不夠時再向操作系統重新申請,同時當內存空閒時也不能將多餘的空間交還給操作系統。
             Java堆中內存空間的管理由JVM控制,對象創建有Java程序控制,但是對象所佔的空間釋放由管理堆內存的垃圾回收器來完成。根據垃圾收集(GC)算法的不
    同,內存回收的方式和時機也會不同。
  2. 線程
             JVM運行實際程序的實體是線程,當然線程需要內存空間來存儲一些必要的數據。每個線程創建時JVM都會爲它創建一個堆棧,堆棧的大小根據不同的
    JVM實現而不同,通常在256KB~756KB之間。
  3. 類和類加載器
             Java中的類和加載類的類加載器本身同樣需要存儲空間,在Sun JDK中它們也被存儲在棧中,這個區域叫做永久代(PermGen)。
  4. JNI
            Java運行時本身也依賴於JNI代碼來實現類庫功能,如文件操作、網絡I/O操作或者其它系統調用。所以JNI也會增
    加Java運行時的本機內存佔用。
明白了Java中的哪些組件需要使用內存,就不難明白JVM的內存結構了。
JVM在運行時將數據劃分爲了6個區域來存儲,而不僅僅是我們熟知的Heap區域,這6個區域圖示如下:



JVM內存的分配結構示意圖

1.PC寄存器

PC 寄存器嚴格來說是一個數據結構,它用於保存當前正常執行的程序的內存地址。同時Java程序是多線程執行的,所以不可能
一直都是按照線性執行下去的,當有多個線程交叉執行時,必然那個被中斷線程的程序當前執行到哪條的內存地址就要保存下來,
以便於它被恢復執行時再按照被中斷時的指令地址繼續執行下去。

2.Java棧

Java棧總是和線程關聯在一起,每當創建一個線程時,JVM就會爲這個線程創建一個對應的Java棧,這個Java棧總又會有多個
棧偵,這些棧偵是與每個方法關聯起來的,每運行一個方法就創建一個一個棧偵,每個棧偵會含有一些內部變量(在方法中定
義的變量),操作棧和方法返回值等信息。

3.堆

堆是存儲Java對象的地方,它是JVM管理Java對象的核心存儲區域,堆是Java程序員最應該關係的,因爲它是我們的應用程與
內存關係最密切的存儲區域。
每一個存儲在堆中的Java對象都會是這個對象的類的一個副本,它會複製包括繼承自它父類的所有非靜態屬性。
堆是被所有Java線程所共享的,所以對它的訪問需要注意同步問題,方法和對應的屬性都需要保證一致性。

4.方法區

JVM方法區是用於存儲類結構信息的地方。

5.運行時常量池

6.本地方法棧

本地方法棧是爲JVM運行native方法準備的空間,它和前面介紹的Java棧的作用是類似的。

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