天天看點

當裡個當

(1)、JVM如何加載一個類的過程,雙親委派模型中有哪些方法?

虛拟機把描述類的資料從Class檔案加載到記憶體,并對資料進行校驗、轉換解析、初始化,最終形成可以被虛拟機直接使用的Java類型,這就是虛拟機的類加載機制。從類被加載到虛拟機記憶體中開始,到解除安裝出記憶體為止,類的生命周期包括七個階段:

加載(Loading);

驗證(Verification);

準備 (Preparation);

解析(Resolution);

初始化(Initialization);

使用(Using)

解除安裝 (Unloading)

其中驗證、準備和解析三部分稱為連接配接,在Java語言中,類型的加載和連接配接過程都是在程式運作期間完成的(Java可以動态擴充的語言特性就是依賴運作期動态加載、動态連接配接這個特點實作的),這樣會在類加載時稍微增加一些性能開銷,但是卻為Java應用程式提供高度的靈活性。

加載、驗證、準備、初始化和解除安裝這5個階段的順序是固定的(即:加載階段必須在驗證階段開始之前開始,驗證階段必須在準備階段開始之前開始等。這些階段都是互相交叉地混合式進行的,通常會在一個階段的執行過程中調用或激活另一個階段),解析階段則不一定,在某些情況下,解析階段有可能在初始化階段結束後開始,以支援Java的動态綁定(動态綁定是指在執行期間(非編譯期)判斷所引用對象的實際類型,根據其實際的類型調用其相應的方法。程式運作過程中,把函數(或過程)調用與響應調用所需要的代碼相結合的過程稱為動态綁定。)

加載

在加載階段,虛拟機主要完成三件事:

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

      2.将這個位元組流所代表的靜态存儲結構轉化為方法區域的運作時資料結構。

      3.在Java堆中生成一個代表這個類的java.lang.Class對象,作為方法區域資料的通路入口

驗證

 驗證階段作用是保證Class檔案的位元組流包含的資訊符合JVM規範,不會給JVM造成危害。如果驗證失敗,就會抛出一個java.lang.VerifyError異常或其子類異常。驗證過程分為四個階段

     1.檔案格式驗證:驗證位元組流檔案是否符合Class檔案格式的規範,并且能被目前虛拟機正确的處理。

     2.中繼資料驗證:是對位元組碼描述的資訊進行語義分析,以保證其描述的資訊符合Java語言的規範。

     3.位元組碼驗證:主要是進行資料流和控制流的分析,保證被校驗類的方法在運作時不會危害虛拟機。

     4.符号引用驗證:符号引用驗證發生在虛拟機将符号引用轉化為直接引用的時候,這個轉化動作将在解析階段中發生。

準備

準備階段為變量配置設定記憶體并設定類變量的初始化。在這個階段配置設定的僅為類的變量(static修飾的變量),而不包括類的執行個體變量。對已非final的變量,JVM會将其設定成“零值”,而不是其指派語句的值:

        pirvate static int size = 12;

        那麼在這個階段,size的值為0,而不是12。 final修飾的類變量将會指派成真實的值。

解析

解析過程是将常量池内的符号引用替換成直接引用。主要包括四種類型引用的解析。類或接口的解析、字段解析、方法解析、接口方法解析。
初始化

在準備階段,類變量已經經過一次初始化了,在這個階段,則是根據程式員通過程式制定的計劃去初始化類的變量和其他資源。這些資源有static{}塊,構造函數,父類的初始化等。

        至于使用和解除安裝階段階段,這裡不再過多說明,使用過程就是根據程式定義的行為執行,解除安裝由GC完成。

使用 新線程---程式計數器----jvm棧執行(對象引用)-----堆記憶體(直接引用)----方法區
解除安裝 GC垃圾回收

  2)、雙親委派機制、意義、方法

機制

啟動(Bootstrap)類加載器----->标準擴充(Extension)類加載器--->系統(System)類加載器---->上下文(Custom)類加載器

從左到右加載:首先将加載任務委托給父類加載器,依次遞歸,如果父類加載器可以完成類加載任務,就成功傳回;隻有父類加載器無法完成此加載任務時,才自己去加載。

意義

 防止記憶體中出現多份同樣的位元組碼 

使用委托機制,會遞歸的向父類查找,如果類A中引用了類B,Java虛拟機将使用加載類A的類加載器去加載類B,如果A加載器已加載類A,那麼B使用A的類加載器進行加載時,就不會在加載類A的位元組碼了

方法

《1》啟動(Bootstrap)類加載器

《2》标準擴充(Extension)類加載器

《3》應用程式類加載器(Application )

《4》上下文(Custom)類加載器

(2)HashMap如何實作的?

(3)HashMap和Concurrent HashMap差別, Concurrent HashMap 線程安全嗎, Concurrent HashMap如何保證 線程安全?

(4)HashMap和HashTable 差別,HashTable線程安全嗎?

(5)程序間通信有哪幾種方式?

(6)JVM分為哪些區,每一個區幹嗎的?

(7)JVM如何GC,新生代,老年代,持久代,都存儲哪些東西?

(8)GC用的引用可達性分析算法中,哪些對象可作為GC Roots對象?

(9)快速排序,過程,複雜度?

(10)什麼是二叉平衡樹,如何插入節點,删除節點,說出關鍵步驟。

(11)TCP如何保證可靠傳輸?三次握手過程?

(12)TCP和UDP差別?

(13)滑動視窗算法?

(14)Linux下如何進行程序排程的?

(15)Linux下你常用的指令有哪些?

(16)作業系統什麼情況下會死鎖?

(17)常用的hash算法有哪些?

(18)什麼是一緻性哈希?

(19)如何了解分布式鎖?

(20)資料庫中的範式有哪些?

(21)資料庫中的索引的結構?什麼情況下适合建索引?

(22)Java中的NIO,BIO,AIO分别是什麼?

(23)用什麼工具調試程式?JConsole,用過嗎?

(24)現在JVM中有一個線程挂起了,如何用工具查出原因?

(25)線程同步與阻塞的關系?同步一定阻塞嗎?阻塞一定同步嗎?

(26)同步和異步有什麼差別?

(27)線程池用過嗎?

(28)如何建立單例模式?說了雙重檢查,他說不是線程安全的。如何高效的建立一個線程安全的單例?

(29)concurrent包下面,都用過什麼?

(30)常用的資料庫有哪些?redis用過嗎?

(31)了解hadoop嗎?說說hadoop的元件有哪些?hdfs,hive,hbase,zookeeper。說下mapreduce程式設計模型。

(32)開源協定有哪些?

(33)開源軟體有哪些?

(34)了解哪些設計模式?說說都用過哪些設計模式

(35)如何判斷一個單連結清單是否有環?

(36)作業系統如何進行分頁排程?

(37)匿名内部類是什麼?如何通路在其外面定義的變量?