Java編程究竟什么是Jvm為什么有Jv
首先,我們要先溫習一下jvm的概念。究竟什么是jvm,為什么有jvm?
Jvm是Java虛擬機(Java virtual machine)它實現了“一次編譯,處處運行”的功能。如果沒有jvm的話,我們編寫的Java代碼,如果想要在window上運行,那就需要編寫一套適用于window平臺的編碼。當然如果想在linux中運行就要編寫一套linux能夠識別的編碼語言。
JVM內存共分為虛擬機棧、堆、方法區、程序計數器、本地方法棧五個部分。
類的加載(加載到jvm)
class文件通過類加載器加載到內存
類加載器使用的加載模式:雙親委托機制
當AppClassLoader加載一個class時,它首先不會自己去嘗試加載這個類,而是把類加載請求委托給父類加載器ExtClassLoader去完成。
當ExtClassLoader加載一個class時,它首先也不會自己去嘗試加載這個類,而是把類加載請求委托給bootStrapClassLoader去完成。
如果BootStrapClassLoader加載失敗,會使用ExtClassLoader來嘗試加載。
若ExtClassLoader也加載失敗,則會使用AppClassLoader來加載。
如果AppClassLoader也加載失敗,則會報出異常ClassNotFoundException。
類加載器:
BootStrapClassLoader 啟動類加載器 負責jre/lib/rt.jar
ExtClassLoader 擴展類加載器 jre/lib/*.jar或-Djava.ext.dirs
AppClassLoader 應用類加載器 記載classpath中指定的jar包及目錄中class
UserClassLoader 自定義的類加載器 繼承ClassLoader getClass.ClassLoader可以獲得
在類加載檢查通過后,接下來虛擬機將為新生對象分配內存。
簡單看了一下內存模型,簡單看看每隔區域酒精存儲的是是什么(干的是什么)
堆:存放對象實例,幾乎所有的對象實例都在這里分配內存
本地方法棧:本地方法棧則是為虛擬機使用到的native方法服務。
方法區:存儲已經被虛擬機加載的類元數據信息(元空間)
我來宏觀的講解一下工作流程:
1.通過Java.exe運行JavaTest.class,隨后被加載到jvm中,方法區(元空間)存儲著類的信息(包括類的名稱、方法的信息、字段信息)
2.jvm找到JavaTest的主函數入口(main)為main函數創建棧幀,開始執行main函數
3.main函數的第一條命令是javaTest jt=new JavaTest;就是讓jvm創建一個javaTest對象,但是這時候方法區中沒有JavaTest類的信息,所以jvm馬上加載JavaTest類,把javaTest類的類型信息放到方法區中(元空間)
4.加載完javaTest類之后,Java虛擬機做的第一件事情就是在堆區中為一個新的JavaTest實例分配內存,調用構造函數初始化javaTest實例,這個JavaTest實例持有著指向方法區的JavaTest類的類型信息(其中包含方法表,Java動態綁定的底層實現)的引用。
為setName函數創建棧幀,開始運行setName函數。
本文相關詞條概念解析:
加載
加載,計算機術語,是把硬盤上的有用程序調到內存中的整個過程。現用于電腦及計算機控制設備方面較普遍,如:硬盤上的有用程序調到內存中的整個過程,一般來說我們在啟動程序或安裝程序時都會有加載。
方法
(1)[method;way;means](2)古指量度方形的法則(3)現指為達到某種目的而采取的途徑、步驟、手段等方法的含義較廣泛,一般是指為獲得某種東西或達到某種目的而采取的手段與行為方式。它在哲學,科學及生活中有著不同的解釋與定義。方法和手段是人們成功辦事,或管理者實現管理目的的不可缺少的中介要素。方法雖然也被人們稱之為活動的手段,但它不是物化了的手段,是人類認識客觀世界和改造客觀世界應遵循的某種方式、途徑和程序的總和。方法的一個同義詞是技術,給人的感覺,方法通俗一些,技術高雅一些。