Java JVM中數據區

一,數據區分類。

棧、堆、方法區、本地方法棧和程序計算器。

二,數據區詳解。

1,棧幀:一個棧幀隨着一個方法的調用而創建,調用完成而銷燬。棧幀內存放着方法中的局部變量,操作數棧等數據。
:Java棧只對棧幀進行存儲、壓棧和出棧操作。Java棧是Java方法執行的內存模型。
棧內存的大小可以有兩種設置,固定值和根據線程需要動態增長。
在JVM棧這個數據區可能會發生拋出兩種錯誤。

  1. StackOverflowError 出現在棧內存設置成固定值的時候,當程序執行需要的棧內存超過設定的固定值會拋出這個錯誤。
  2. OutOfMemoryError 出現在棧內存設置成動態增長的時候,當JVM嘗試申請的內存大小超過了其可用內存時會拋出這個錯誤。

總結

  1. 每個線程包含一個棧區,棧中只保存基礎數據類型的對象和自定義對象的引用(不是對象)。對象都存放在堆區中。
  2. 每個戰中的數據(基礎數據類型和對象引用)都是私有的,其他棧不能訪問。
  3. 棧分爲3個部分:基本類型變量,執行環境上下文,操作指令區(存放操作指令).
  4. 在函數中定義的一些基本類型的變量數據和對象的引用變量都在函數的棧內存中分配。
  5. 當在一段代碼塊定義一個變量時,Java就在棧中爲這個變量分配內存空間,當該變量退出該作用域後,Java會自動釋放掉爲該變量所分配的內存空間,該內存空間可以立即被另作他用。

2,堆內存(Heap Memory)
堆數據區是用來存儲對象和數組(特殊的對象)。堆內存有多個線程共享,堆內存隨着JVM啓動而創建。
總結

  1. 存儲的全部是對象,每個對象包含一個與之對應的class信息–class的目的是得到操作指令。
  2. jvm只有一個堆區(heap)被所有線程共享,堆區中不存放基本類型和對象引用,只存放對象本身。
  3. 堆的優勢是可以動態地分配內存大小,生存期也不必事先告訴編譯器,因爲它是在運行時動態分配內存的,Java的垃圾收集器會自動收走這些不再使用的數據。
  4. 缺點是,由於要在運行時動態分配內存,存取速度較慢。當堆內存剩餘的內存不足以滿足於對象創建,JVM會拋出OutOfMemoryError錯誤。

3,方法區
方法區在JVM中也是一個非常重要的區域,它與堆一樣,是被線程共享的區域。在方法區中,存儲了每個類的信息(包括類的名稱、方法、信息、字段信息)、靜態變量、常量以及編譯器編譯後的代碼等。
在Class文件中除了類的字段、方法、接口等描述信息外,還有一項信息是常量池,用來存儲編譯期間生成的字面量和符號引用。
在方法區中有一個非常重要的部分就是運行時常量池,它是每一個類或接口的常量池的運行時表示形式,在類和接口被加載到JVM後,對應的運行時常量池被創建出來。當然並非Class文件常量池中的內容才能進入運行時常量池,在運行期間也可將新的常量放入運行時常量池中。

4,本地方法棧
一個支持native方法調用的JVM實現,需要有這樣一個數據區,就是本地方法棧。本地方法棧基本和JVM棧一樣,其大小也是可以設置爲固定值或者動態增加,因此也會對應拋出StackOverflowError和OutOfMemoryError錯誤。

5,程序計算器
程序計算器用來記錄當前正在執行的指令,爲線程私有,所以當一個新的線程創建時,程序計算器也會創建。由於java是支持多線程,Java中的程序計算器用來記錄當前線程中正在執行的指令。如果當前正在執行的方法是本地方法,那麼此刻程序計算器的值爲undefined。注意這個區域是唯一一個不拋出OutOfMemoryError的運行時數據區。

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