若是要運行Java程序,首先要編寫Java的源文件(*.java)之Java的編譯器將源文件編譯成對應的字節碼文件(*.class文件),以後再經過類加載器將字節碼文件(*.class)加載到jvm中,其中在 jvm 中與程序運行最密切的是運行時數據區( Runtime data area)。java
要把class文件加載到jvm中的運行時數據區進行處理。面試
程序的運行最爲重要的一塊區域就是運行時數據區,其中運行時數據區能夠分爲以下幾個子區域:spring
程序計數器是用於存放下一條指令所在單元的地址的地方。設計模式
程序執行必須知道指令(計算機要經過指令才能執行),此時就須要從程序計數器中讀取即將執行的指令的地址,經過這個地址就能夠獲得指令從而執行。數組
好比線程即將執行一個Java方法,此時要先從程序計數器中取得即將執行的虛擬機字節碼指令的地址。微信
該區域是線程私有的,虛擬機棧的生命週期和線程相同,在執行一個Java方法的時候會在該區域建立一個棧幀,棧幀用來保存局部變量表(在方法中定義的變量或者方法的參數都是方法的局部變量)、動態連接、方法出口、操做數棧等等信息,其實每一個方法從執行到執行完畢就是一個入棧與出棧的過程。當入棧的速度大於出棧的速度的時候會出現棧內存溢出( Exception in thread "main" java.lang.StackOverflowError)。jvm
本地方法棧和虛擬機棧的做用很類似,不一樣點是虛擬棧是爲Java方法服務的,本地方法棧是爲native方法服務的(這種本地方法是沒有方法體的,能夠算是一個抽象方法,具體的實現是本地操做系統的c語言寫的一些函數庫中的方法實現的)分佈式
堆是運行時數據區中最大的一塊子區域,建立的實例對象和數組都須要在堆內存開闢空間,堆空間是線程共享的區域,該區域也是gc (垃圾回收)重要從狸的一個區,因此堆又被稱爲「GC堆」。ide
永久代實現了方法區,永久代是在JDK1.8以前出現的概念,在JDK1.8開始就沒有了永久代,而是使用了元空間代替了。函數
方法區也是一塊線程共享的區域,該區域主要保存的是已經加載到jvm 中的類的信息、常量、靜態變量等等。
有完整的Java初級,高級對應的學習路線和資料!專一於java開發。分享java基礎、原理性知識、JavaWeb實戰、spring全家桶、設計模式、分佈式及面試資料、開源項目,助力開發者成長!
詳細的java系統視頻免費學習地址
歡迎關注微信公衆號:碼邦主