2012-06-06 42 views
2

何時在JVM中加載類?它們是否在服務器啓動時或者有類參考時加載?我的假設是,所有的類都會像jboss這樣的服務器啓動,然後有一個叫做lazyloading的東西被加載。在JVM中加載類

實際上加載的含義是什麼?這是否意味着在JVM內存中存在此.class以及所有方法,變量(包括實例,靜態變量方法)並且可用於執行。我知道ClassLoader爲需要加載的Java類定位字節碼,讀取字節碼,檢查在particualr類中使用的其他類的refrencces,並通過創建java.lang.Class類的實例來加載它們。這使得該類可用於JVM執行

方法是否也隨類一起加載到JVM中?我的假設是方法只在線程的堆棧內存中。那麼什麼是方法記憶?它是堆棧還是堆棧的一部分?

是否只有靜態方法與類加載一起加載而不是實例方法?我知道,靜態的bock在類被獲取時被執行,並且所有的靜態變量都被初始化。

如果這些疑惑得到解決,請提前致謝。

回答

2

這些都是關於JVM的基本問題,Google肯定可以幫你解答。

對於大家的一些問題(特別是關於實際裝載過程中的問題),你可以看看這裏,例如:http://www.securingjava.com/chapter-two/chapter-two-7.html

短,剛開始時,只是基本的(和信任)類由JVM加載。接下來,根據需要創建其他類加載器(例如引導類加載器),它們將加載更多的類。在成功加載類之前,必須加載它所依賴的所有類。

加載的類以各種形式(這是特定於JVM)存儲在內存中,但總是暴露一個Class對象。類中的所有東西(方法,變量等)都會被加載。這並不意味着該類也被編譯(稍後編譯,需要執行某個方法時)。

方法變量的分配發生在棧(原語)或堆上。

靜態變量的初始化和靜態塊的執行發生在類被加載之後,在它的任何實例被創建之前。