從Java文件到程序運行起來的場景分析

整體流程

  • 1.我們寫完代碼,是以一個xxx.java的文件存儲代碼的,這就是Java的源代碼文件
  • 2.2.有了源代碼文件還不夠,這是面向程序開發者的語言,而不是面向JVM的語言,所以還有一個編譯的過程,將xxx.Java → xxx.class,這個class文件就是所謂的字節碼文件,是可以供JVM來識別運行的。
  • 3.有了class文件,還需要將文件加載到JVM中,這裏就使用到了classloader來將class加載到JVM中。
  • 4.好了,現在class文件加載進來了,但是還不能直接讓JVM執行,因爲JVM有一套規範,如果不遵守這套規範,JVM是不會運行文件的,所以這裏有一個階段叫做驗證,就是用來做這個事情的。
  • 5.解析完畢,就可以實際開始操作了,這時候將class文件中所提到的各種field給分配內存,並提供初始值,例如0。所以這裏有一個階段,準備就是來做這個事情的
  • 6.既然已經準備好了,但是這時候這些值其實並不知道對方的存在,也不知如何去訪問對方,這時候就需要將這些值得引用轉化爲直接內存地址,以便於訪問,所以這裏有這麼一個過程,解析,就是來做這麼一個事情的。
  • 7.然後解析也已經完畢了,這時候就進行初始化了,將class文件中,程序開發人員所定製的值進行賦值。
  • 8.到這時候,整個大的準備過程纔算完,可以開始使用字節碼引擎進行執行了。
  • 9.接下來就涉及到代碼執行了。

Jvm 內存區域分析

在Java裏面,代碼是以線程爲單位來執行的,所以,先來看看那代碼到線程裏都需要些什麼?首先得有一個地方存方法以便於用來執行,這個地方就是Java方法棧,這裏又要說了,Java線程裏執行可不止一個方法,那麼在方法幀要有更細麗都的執行單位,這就是棧幀。還有一點,就是你多線程之間的切換,cpu不執行當前線程去執行別的線程裏,總得有個地方保存,當前線程執行位置吧,之後cpu切換回來之後,以便於恢復上下文,所以這裏還有個線程獨有的區域,程序計數器。

講到這裏,整個Java從寫代碼到運行起來的大致思路都有了。我們也可以從整個流程很容易推斷出Java的內存區域,接下來就將它們推出來,方便記憶: 1.之前說到過class需要被加載到內存裏吧,所以,有一個地方是專門用來存儲class等類相關文件,這就是方法區,也可以說永久代。 2.然後你class得創建對象吧,所以這裏有個存放對象的區域,堆內存。 3.有了對象,得執行方法吧,所以執行方法得有一個區域,Java虛擬棧 4.Java以線程爲單位執行,所以遇到多線程總有線程上下文切換吧,所以這裏有個保存執行狀態的程序計數器。 5.其他,Java支持Jni,可以與其他例如C/C++等native語言交互,所以有個本地方法區等本地相關的內存區域。

具體如圖:
運行流程

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