一、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系統視頻免費學習地址
歡迎關注微信公眾號:碼邦主