一、Java程序從源文件創建到程序運行要經過兩大步驟:
1、編譯期:編譯器把 .java 源代碼文件編譯成 .class 字節碼文件
2、運行期:Java類加載器將 .class 字節碼文件加載到內存,在 JVM 中進行解釋並生成可執行代碼。
因為 Java 程序既要編譯同時也要經過 JVM 的解釋運行,所以說Java被稱為半解釋語言( “semi-interpreted” language)。
編譯期
創建完源文件之后,程序先要被 JVM中 的 Java 編譯器進行編譯為 .class 文件。Java 編譯一個類時,如果這個類所依賴的類還沒有被編譯,編譯器會自動的先編譯這個所依賴的類,然后引用。如果 Java 編譯器在指定的目錄下找不到該類所依賴的類的 .class 文件或者 .java 源文件,就會報 “Cant found sysbol” 的異常錯誤。
編譯后的字節碼文件格式主要分為兩部分:常量池和方法字節碼。常量池記錄的是代碼出現過的(常量、類名、成員變量等)以及符號引用(類引用、方法引用,成員變量引用等);方法字節碼中放的是各個方法的字節碼。
運行期
Java 類運行的過程大概分為:類的加載和類的執行。需要說明的一點的是:JVM 並不是在運行時就會把所有使用到的類都加載到內存中,JVM主要在程序第一次運行時主動使用類的時候,才會立即去加載。
在 Java 中,JVM可以理解的代碼就叫做字節碼(即擴展名為 .class 的文件),它不面向任何特定的處理器,只面向虛擬機。Java 語言通過字節碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點。所以 Java 程序運行時比較高效,而且,由於字節碼並不針對一種特定的機器,因此,Java程序無須重新編譯便可在多種不同操作系統的計算機上運行。
二、對象的創建和使用:內存解析
1、堆(Heap),此內存區域的唯一目的就是存放對象實例,幾乎所有的對象實例都在這里分配內存。這一點在Java虛擬機規范中的描述是:所有的對象實例以及數組都要在堆上分配。
2、通常所說的棧(Stack),是指虛擬機棧。虛擬機棧用於存儲局部變量等。
局部變量表存放了編譯期可知長度的各種基本數據類型(boolean、byte、char 、 short 、 int 、 float 、 long 、double)、對象引用(reference類型,它不等同於對象本身,是對象在堆內存的首地址)。 方法執行完,自動釋放。
3、方法區(Method Area),用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯器編譯后的代碼等數據。加載完類之后,在堆內存的方法區中就產生了一個Class類型的對象(一個類只有一個Class對象),這個對象就包含了完整的類的結構信息。我們可以通過這個對象看到類的結構。這個對象就像一面鏡子,透過這個鏡子看到類的結構,所以,我們形象的稱之為:反射。
4、一個進程有多個線程,每個線程有自己的棧和計數器但共用方法區和堆。
三、 Java語言運行機制及運行過程
核心機制—Java虛擬機
1、JVM是一個虛擬的計算機,具有指令集並使用不同的存儲區域。負責執行指
令,管理數據、內存、寄存器。
2、對於不同的平台,有不同的虛擬機。
3、只有某平台提供了對應的java虛擬機,java程序才可在此平台運行
4、Java虛擬機機制屏蔽了底層運行平台的差別,實現了“一次編譯,到處運行”
核心機制—垃圾回收
1、不再使用的內存空間應回收—— 垃圾回收。
2、在C/C++等語言中,由程序員負責回收無用內存。
3、Java 語言消除了程序員回收無用內存空間的責任:它提供一種系統級線程跟蹤存儲空間的分配情況。並在JVM空閑時,檢查並釋放那些可被釋放的存儲空間。
4、垃圾回收在Java程序運行過程中自動進行,程序員無法精確控制和干預。
————————————————
版權聲明:本文為CSDN博主「MysteryCY」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_42146136/article/details/109045985