一、JVM的運行制概要
如果要運行Java程式,首先要撰寫Java的源檔案(*.java)之Java的編譯器將源檔案編譯成對應的位元組碼檔案(*.class檔案),之后再通過類加載器將位元組碼檔案(*.class)加載到jvm中,其中在 jvm 中與程式運行最密切的是運行時資料區( Runtime data area),

要把class檔案加載到jvm中的運行時資料區進行處理,
二、運行時資料區(JVM記憶體模型)
程式的運行最為重要的一塊區域就是運行時資料區,其中運行時資料區可以分為如下幾個子區域:

- 程式計數器:
程式計數器是用于存放下一條指令所在單元的地址的地方,
程式執行必須知道指令(計算機要通過指令才能執行),此時就需要從程式計數器中讀取即將執行的指令的地址,通過這個地址就可以得到指令從而執行,
比如執行緒即將執行一個Java方法,此時要先從程式計數器中取得即將執行的虛擬機位元組碼指令的地址,
- 虛擬機堆疊:
該區域是執行緒私有的,虛擬機堆疊的生命周期和執行緒相同,在執行一個Java方法的時候會在該區域創建一個堆疊幀,堆疊幀用來保存區域變數表(在方法中定義的變數或者方法的引數都是方法的區域變數)、動態鏈接、方法出口、運算元堆疊等等資訊,其實每個方法從執行到執行完畢就是一個入堆疊與出堆疊的程序,當入堆疊的速度大于出堆疊的速度的時候會出現堆疊記憶體溢位( Exception in thread "main" java.lang.StackOverflowError),
- 本地方法堆疊:
本地方法堆疊和虛擬機堆疊的作用很相似,不同點是虛擬堆疊是為Java方法服務的,本地方法堆疊是為native方法服務的(這種本地方法是沒有方法體的,可以算是一個抽象方法,具體的實作是本地作業系統的c語言寫的一些函式庫中的方法實作的)
- 堆:
堆是運行時資料區中最大的一塊子區域,創建的實體物件和陣列都需要在堆記憶體開辟空間,堆空間是執行緒共享的區域,該區域也是gc (垃圾回收)重要從貍的一個區,所以堆又被稱為“GC堆”,
- 方法區:
永久代實作了方法區,永久代是在JDK1.8之前出現的概念,在JDK1.8開始就沒有了永久代,而是使用了元空間代替了,
方法區也是一塊執行緒共享的區域,該區域主要保存的是已經加載到jvm 中的類的資訊、常量、靜態變數等等,
有完整的Java初級,高級對應的學習路線和資料!專注于java開發,分享java基礎、原理性知識、JavaWeb實戰、spring全家桶、設計模式、分布式及面試資料、開源專案,助力開發者成長!
詳細的java系統視頻免費學習地址
歡迎關注微信公眾號:碼邦主

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/266577.html
標籤:Java
上一篇:Java并發編程之執行緒的停止
