JVM原理

作者: cici_new_1987  來源: 博客園  發布時間: 2012-12-22 16:00  閱讀: 18822 次  推薦: 4   原文鏈接   [收藏]  

JVM 原理解釋

  JVM 全稱是 Java Virtual Machine ,Java 虛擬機,這個 JVM 你是看不到的,它存在內存中。我們知道計算機的基本構成是:運算器、控制器、存儲器、輸入和輸出設備,那這個 JVM 也是有這成套的元素,運算器是當然是交給硬件 CPU 還處理了,只是為了適應“一次編譯,隨處運行”的情況,需要做一個翻譯動作,于是就用了JVM 自己的命令集,JVM 的命令集則是可以到處運行的,因為 JVM 做了翻譯,根據不同的CPU ,翻譯成不同的機器語言。

  JVM 是一個內存中的虛擬機,那它的存儲就是內存了,我們寫的所有類、常量、變量、方法都在內存中。

  JVM 的組成部分

  Class Loader 類加載器

  類加載器的作用是加載類文件(.class)到內存,Class Loader 加載的 class 文件是有格式要求的。

  類加載的最終產品是位于運行時數據區的堆區的Class對象。

  Class對象封裝了類在方法區內部的數據結構。 

  并且向JAVA程序提供了訪問類在方法區內的數據結構。

  JVM加載class文件的原理機制

  1. Java 中的所有類,必須被裝載到 JMV 中才能運行,這個裝載工作是由 JVM 中的類裝載器完成的,類裝載器所做的工作實質是把類文件從硬盤讀取到內存中。

  2. Java中的類大致分為三種:

  a) 系統類

  b) 擴展類

  c) 由程序員自定義的類

  3. 類裝載方式,有兩種:

  a) 隱式裝載,程序在運行過程中當碰到通過 new 等方式生成對象時,隱式調用類裝載器加載對應的類到jvm中。

  b) 顯式裝載,通過 class.forname() 等方法,顯式加載需要的類。  

  4. 類加載的動態性體現

  一個應用程序總是由n多個類組成,Java 程序啟動時,并不是一次把所有的類全部加載后再運行,它總是先把保證程序運行的基礎類一次性加載到 JVM 中,其它類等到 JVM 用到的時候再加載,這樣的好處是節省了內存的開銷。因為java最早就是為嵌入式系統而設計的,內存寶貴,這是一種可以理解的機制,而用到時再加載這也是 Java 動態性的一種體現。

  5.Java 類裝載器

  Java 中的類裝載器實質上也是類,功能是把類載入 JVM 中,值得注意的是 JVM 的類裝載器并不是一個,而是三個,層次結構如下:

      Bootstrap Loader  - 負責加載系統類
            |
          - - ExtClassLoader  - 負責加載擴展類
                          |
                      - - AppClassLoader  - 負責加載應用類

  為什么要有三個類加載器,一方面是分工,各自負責各自的區塊,另一方面為了實現委托模型。

  6. 類加載器之間是如何協調工作的

  前面說了,Java中有三個類加載器,問題就來了,碰到一個類需要加載時,它們之間是如何協調工作的,即 Java 是如何區分一個類該由哪個類加載器來完成呢。

  在這里Java采用了委托模型機制,這個機制簡單來講,就是“類裝載器有載入類的需求時,會先請示其Parent使用其搜索路徑幫忙載入,如果 Parent 找不到,那么才由自己依照自己的搜索路徑搜索類”,注意喔,這句話具有遞歸性。

  =================================

  資料參考:

  多謝 samuschen 的資料貢獻,http://samuschen.iteye.com/blog/1119539

  =================================

4
0
 
標簽:Java JVM
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()