Java基本知識點
jvm將.class類文件信息加載到內(nèi)存并解析成對應(yīng)的class對象的過程,注意:jvm并不是一開始就把所有的類加載進內(nèi)存中,只是在第一次遇到某個需要運行的類才會加載,并且只加載一次
主要分為三部分:1、加載,2、鏈接(1.驗證,2.準(zhǔn)備,3.解析),3、初始化
1:加載
類加載器包括 BootClassLoader、ExtClassLoader、APPClassLoader
2:鏈接
驗證:(驗證class文件的字節(jié)流是否符合jvm規(guī)范)
準(zhǔn)備:為類變量分配內(nèi)存,并且進行賦初值
解析:將常量池里面的符號引用(變量名)替換成直接引用(內(nèi)存地址)過程,在解析階段,jvm會把所有的類名、方法名、字段名、這些符號引用替換成具體的內(nèi)存地址或者偏移量。
3:初始化
主要對類變量進行初始化,執(zhí)行類構(gòu)造器的過程,換句話說,只對static修試的變量或者語句進行初始化。
范例:Person person = new Person();為例進行說明。
Java編程思想中的類的初始化過程主要有以下幾點:
找到class文件,將它加載到內(nèi)存
在堆內(nèi)存中分配內(nèi)存地址
初始化
將堆內(nèi)存地址指給棧內(nèi)存中的p變量
2、String、StringBuilder、StringBuffer
StringBuffer里面的很多方法添加了synchronized關(guān)鍵字,是可以表征線程安全的,所以多線程情況下使用它。
執(zhí)行速度:
StringBuilder > StringBuffer > String
StringBuilder犧牲了性能來換取速度的,這兩個是可以直接在原對象上面進行修改,省去了創(chuàng)建新對象和回收老對象的過程,而String是字符串常量(final)修試,另外兩個是字符串變量,常量對象一旦創(chuàng)建就不可以修改,變量是可以進行修改的,所以對于String字符串的操作包含下面三個步驟:
1、創(chuàng)建一個新對象,名字和原來的一樣
2、在新對象上面進行修改
3、原對象被垃圾回收掉
3、JVM內(nèi)存結(jié)構(gòu)
Java對象實例化過程中,主要使用到虛擬機棧、Java堆和方法區(qū)。Java文件經(jīng)過編譯之后首先會被加載到j(luò)vm方法區(qū)中,jvm方法區(qū)中很重的一個部分是運行時常量池,用以存儲class文件類的版本、字段、方法、接口等描述信息和編譯期間的常量和靜態(tài)常量。
3.1、JVM基本結(jié)構(gòu)
類加載器classLoader,在JVM啟動時或者類運行時將需要的.class文件加載到內(nèi)存中。
執(zhí)行引擎,負(fù)責(zé)執(zhí)行class文件中包含的字節(jié)碼指令。
本地方法接口,主要是調(diào)用C/C++實現(xiàn)的本地方法及返回結(jié)果。
內(nèi)存區(qū)域(運行時數(shù)據(jù)區(qū)),是在JVM運行的時候操作所分配的內(nèi)存區(qū),
主要分為以下五個部分,如下圖:

方法區(qū):用于存儲類結(jié)構(gòu)信息的地方,包括常量池、靜態(tài)變量、構(gòu)造函數(shù)等。
Java堆(heap):存儲Java實例或者對象的地方。這塊是gc的主要區(qū)域。
Java棧(stack):Java??偸呛途€程關(guān)聯(lián)的,每當(dāng)創(chuàng)建一個線程時,JVM就會為這個線程創(chuàng)建一個對應(yīng)的Java棧。在這個java棧中又會包含多個棧幀,每運行一個方法就創(chuàng)建一個棧幀,用于存儲局部變量表、操作棧、方法返回值等。每一個方法從調(diào)用直至執(zhí)行完成的過程,就對應(yīng)一個棧幀在java棧中入棧到出棧的過程。所以java棧是線程私有的。
程序計數(shù)器:用于保存當(dāng)前線程執(zhí)行的內(nèi)存地址,由于JVM是多線程執(zhí)行的,所以為了保證線程切換回來后還能恢復(fù)到原先狀態(tài),就需要一個獨立的計數(shù)器,記錄之前中斷的地方,可見程序計數(shù)器也是線程私有的。
本地方法棧:和Java棧的作用差不多,只不過是為JVM使用到的native方法服務(wù)的。
3.2、JVM源碼分析
原文鏈接:https://blog.csdn.net/xiangzhihong8/java/article/details/96280254
點擊下方鏈接免費獲取Android進階資料: