導航:首頁 > 編程語言 > java虛擬機什麼時候載入類

java虛擬機什麼時候載入類

發布時間:2021-10-23 21:11:54

java中的「類」是什麼時候被載入到虛擬機

1、編譯和運行概念要搞清:編譯即javac的過程,負責將.java文件compile成.class文件,主要是類型、格式檢查與編譯成位元組碼文件,而載入是指java *的過程,將.class文件載入到內存中去解釋執行,即運行的時候才會有載入一說。

2、類的載入時機,肯定是在運行時,但並不是一次性全部載入,而是按需動態,依靠反射來實現動態載入,一般來說一個class只會被載入一次,之後就會從jvm的class實例的緩存中獲取,誰用誰取就可以了,不會再去文件系統中載入.class文件了。

② java虛擬機什麼情況下會對java類進行載入

王森的《Java深度歷險》詳細說了這個問題。大致是jvm先載入Object類,再載入該類的超類,再載入該類本身,當該類被指向null時,該類被垃圾回收機制處理,當垃圾回收機制執行時會被清楚。
靜態代碼塊會在類被創建或被調用的時候就被初始化,被創建和被調用是不同的兩個概念,比如User u = new User();這個時候u沒有被調用,不過靜態模塊已經被載入執行,而User.class;這條語句User並沒有創建出實例,不過卻被調用了,這個時候靜態的代碼塊也被載入。不過,靜態代碼塊有一個很特別的地方就是,在同一個應用程序中,只會執行一次。下面是一個Demo,可以看看:
public class User{
static {
System.out.println("It's a static space");
}

public static String name = "Jim Green";
}
另一個類調用,直接寫main方法了。
public static void main(String[] args){
User u = new User();
String name = User.name;
}
這里會輸出一句It's a static space,而注釋掉其中任何一句依然會輸出。不過,如果這個main方法卸載User里時,main方法什麼都不寫都會輸出It's a static space,樓主可以想想是為什麼。

③ Java虛擬機是如何載入Java類的

載入:雙親委派模型,每當一個類的載入器接收到載入請求時,它會先將請求轉發給父載入器。

JAVA9之前,啟動類載入器負責載入最為基礎最為重要的類,比如lib目錄下。除了啟動載入器,另外兩個重要的類載入器
擴展類載入器(lib/ext下的),應用載入器(應用程序路徑下的類)。

④ Java虛擬機載入class

可以,前提是包名不同。

⑤ java什麼時候使用顯式類載入

隱式載入是通過new等途徑生成的對象時jvm把相應的類載入到內存中
顯示載入是通過Class.forName(..)等方式由程序員自己控制載入

new是硬編碼,然而在大部分情況下,new這種硬編碼夠用了。
Class.forName(String)可以動態載入,這增強了java的動態性。也就是說你可以在運行時選擇載入A類或者B類。
if (condition_a) {
Class cls = Class.forName("A");
else if (condition_b) {
Class cls = Class.forName("B");
} else {
Class cls = Class.forName("Other");
}

⑥ 只要正常編譯類文件類就會載入嗎java類到底是什麼時候載入的

除了先把保證程序運行的基礎類一次性載入到jvm別的都是用到了才會載入.好像是這樣,前幾天看的,也沒專心記

⑦ class 類 什麼 時候被 載入 java虛擬機內存

編寫的java文件經過編譯之後形成位元組碼文件,當你的程序在運行中調用到該class類的時候,通過ClassLoader進行載入。下面詳細介紹下。
class文件從載入到jvm內存中開始,到卸載出內存為止,他的整個生命周期(整個載入過程)包括:載入,驗證,准備,解析,初始化,使用和卸載。其中驗證,准備,解析三個合稱為連接。下面重點說一下載入過程。

載入過程:

1、通過一個類的全限定名來獲取定義此類的二進制位元組流

2、將位元組流所代表的靜態存儲結構轉化為方法區的運行時存儲結構

3、在java堆中生成一個代表該類的對象,作為方法區這些數據的訪問入口

驗證:

1、文件格式驗證:是否以魔數0xCAFEBABE開頭,class文件的主次版本號是否在當前jvm處理范圍之內,常量池的常量中是否有不被支持的類型,指向常量中的索引值有無不存在的常量,等

2、元數據驗證:對位元組碼描述的信息進行語義分析,保證符合java規范。如是否有父類,是否繼承了不允許繼承的類,如果不是抽象類,是否實現了所有未實現的方法。等

3、位元組碼驗證:數據流和控制流分析。主要針對類的方法體。

4、符號引用驗證:如符號引用中通過字元串描述的全限定名是否能夠找到對應的類等

准備:

該階段正式為類變數分配內存並設置初始值。內存在方法區中分配。這里說的初始值是通常情況下說的零值。

解析:

虛擬機將常量池中的符號引用替換為直接引用的過程。包括:

1、類或介面的解析

2、欄位解析

3、類方法解析

4、介面方法解析

初始化:

類初始化階段是類載入過程的最後一步,除了載入階段用戶可以通過自定義載入器參與外,其餘動作完全由虛擬機指導控制。到了初始化階段,才真正開始執行類中定義的java程序代碼(位元組碼)。在准備階段,變數已經賦過一次系統默認值,而在初始化階段,則是根據程序制定的主觀計劃去初始化類變數和其他資源,即初始化階段是執行類構造器<clinit>()方法的過程。<clinit>是在編譯java源碼時,按照靜態塊和靜態變數賦值語句的順序生成的。如果類沒有靜態塊也沒有為靜態變數賦值,就不會生成<clinit>方法,該方法只能被虛擬機調用。

⑧ 描述java虛擬機載入類的過程,要詳盡!

先將class文件讀到JVM,找到static
的變數並初始化,在找到static代碼段執行,在初始化普通變數,然後是構造方法。最後載入其他方法。

⑨ Java中的類是什麼時候被載入到虛擬機

這個問題java的比較核心的一個難題,我就針對問題做簡要回答,不做深入討論了:
1、編譯和運行概念要搞清:編譯即javac的過程,負責將.java文件compile成.class文件,主要是類型、格式檢查與編譯成位元組碼文件,而載入是指java *的過程,將.class文件載入到內存中去解釋執行,即運行的時候才會有載入一說。

2、類的載入時機,肯定是在運行時,但並不是一次性全部載入,而是按需動態,依靠反射來實現動態載入,一般來說一個class只會被載入一次,之後就會從jvm的class實例的緩存中獲取,誰用誰取就可以了,不會再去文件系統中載入.class文件了。

明白1,2點就夠了,再深入要等一段才能明白了。

⑩ java中什麼時候類第一次載入

建議樓主在類中增加一段靜態代碼,然後跟蹤一下,這樣有助於您理解類的載入時間。
例如
public class Test
{
static{System.out.println("Load Test");}
...
}

閱讀全文

與java虛擬機什麼時候載入類相關的資料

熱點內容
shs文件怎麼刪除 瀏覽:913
什麼優app黃色 瀏覽:292
大人變小孩的電影 瀏覽:852
想做老師有什麼app好用 瀏覽:485
七星彩網購app有哪些 瀏覽:713
js12和K9 瀏覽:69
手機越獄看片 瀏覽:359
小米2s能刷安卓60 瀏覽:673
李彩潭性感勾魂 瀏覽:965
全民網課app哪個最好 瀏覽:560
韓劇電影在線免費 瀏覽:263
電影新空房禁地在線 瀏覽:14
蘋果平板電腦mimi432g 瀏覽:211
ios百度網盤本地文件怎麼打開 瀏覽:491
日常型常量數據用什麼符號引起 瀏覽:198
黑人英語課作弊播放 瀏覽:602
有劇情的露點電影 瀏覽:799
家旺家俊阿梅是哪個電影 瀏覽:318
皮皮陪練app怎麼發布動態 瀏覽:565
什麼app可以批量添加自定義水印 瀏覽:885

友情鏈接