操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    文章內容過長,文末有彩蛋!希望大家多多關注

    在面試java工程師的時候,這道題經常被問到,故需特別注意。

    認真閱讀本文后,方可做到心中有數,面試談笑風生。

    1,JVM簡介(簡單了解)

    JVM 全稱是Java ,Java 虛擬機,也就是在計算機上再虛擬一個計算機,這和我們使用 不一樣,那個虛擬的東西你是可以看到的,這個JVM 你是看不到的,它存在內存中。我們知道計算機的基本構成是:運算器、控制器、存儲器、輸入和輸出設備,那這個JVM 也是有這成套的元素,運算器是當然是交給硬件CPU 還處理了,只是為了適應“一次編譯,隨處運行”的情況,需要做一個翻譯動作,于是就用了JVM 自己的命令集,這與匯編的命令集有點類似,每一種匯編命令集針對一個系列的CPU ,比如8086 系列的匯編也是可以用在8088 上的,但是就不能跑在8051 上,而JVM 的命令集則是可以到處運行的,因為JVM 做了翻譯,根據不同的CPU ,翻譯成不同的機器語言。

    JVM 中我們最需要深入理解的就是它的存儲部分,存儲?硬盤?NO ,NO , JVM 是一個內存中的虛擬機,那它的存儲就是內存了,我們寫的所有類、常量、變量、方法都在內存中,這決定著我們程序運行的是否健壯、是否高效,接下來的部分就是重點介紹之。

    2,JVM組成(認真閱讀)

    該圖參考了網上廣為流傳的JVM 構成圖,大家看這個圖,整個JVM 分為四部分:

    Class 類加載器

    類加載器的作用是加載類文件到內存,比如編寫一個.java 程序,然后通過javac 編譯成class 文件,那怎么才能加載到內存中被執行呢?Class 承擔的就是這個責任,那不可能隨便建立一個.class 文件就能被加載的,Class 加載的class 文件是有格式要求,在《JVM 》中式這樣定義Class 文件的結構:

    ClassFile {
          u4 magic;
          u2 minor_version;
           u2 major_version;
          u2 constant_pool_count;
          cp_info constant_pool[constant_pool_count-1];
          u2 access_flags;
          u2 this_class;
          u2 super_class;
          u2 interfaces_count;
          u2 interfaces[interfaces_count];
          u2 fields_count;
          field_info fields[fields_count];
          u2 methods_count;
          method_info methods[methods_count];
          u2 attributes_count;
          attribute_info attributes[attributes_count];
        }
    

    需要詳細了解的話,可以仔細閱讀《JVM 》的第四章“The class File ”,這里不再詳細說明。

    友情提示:Class 只管加載,只要符合文件結構就加載程序員都該知道存儲器,至于說能不能運行,則不是它負責的,那是由 負責的。

    執行引擎

    執行引擎也叫做解釋器() ,負責解釋命令,提交操作系統執行。

    本地接口

    本地接口的作用是融合不同的編程語言為Java 所用,它的初衷是融合C/C++ 程序,Java 誕生的時候是C/C++ 橫行的時候,要想立足,必須有一個聰明的、睿智的調用C/C++ 程序,于是就在內存中專門開辟了一塊區域處理標記為 的代碼,它的具體做法是 Stack 中登記 方法,在 執行時加載 。目前該方法使用的是越來越少了,除非是與硬件有關的應用,比如通過Java 程序驅動打印機,或者Java 系統管理生產設備,在企業級應用中已經比較少見,因為現在的異構領域間的通信很發達,比如可以使用 通信,也可以使用Web 等等,不多做介紹。

    data area 運行數據區

    運行數據區是整個JVM 的重點。我們所有寫的程序都被加載到這里,之后才開始運行,Java 生態系統如此的繁榮,得益于該區域的優良自治。

    整個JVM 框架由加載器加載文件,然后執行器在內存中處理數據,需要與異構系統交互是可以通過本地接口進行,瞧,一個完整的系統誕生了!

    3、JVM加載class文件的原理機制 (好好記住)

    Java中的所有類,都需要由類加載器裝載到JVM中才能運行。類加載器本身也是一個類,而它的工作就是把class文件從硬盤讀取到內存中。在寫程序的時候,我們幾乎不需要關心類的加載,因為這些都是隱式裝載的,除非我們有特殊的用法,像是反射,就需要顯式的加載所需要的類。

    類裝載方式,有兩種

    1.隱式裝載程序員都該知道存儲器, 程序在運行過程中當碰到通過new等方式生成對象時,隱式調用類裝載器加載對應的類到jvm

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

    真相信息超載時代如何知道該相信_導訴員該了解什么_程序員都該知道存儲器

    隱式加載與顯式加載的區別:兩者本質是一樣? Java類的加載是動態的,它并不會一次性將所有類全部加載后再運行,而是保證程序運行的基礎類(像是基類)完全加載到jvm中,至于其他類,則在需要的時候才加載。這當然就是為了節省內存開銷。

    Java的類加載器有三個

    對應Java的三種類:

    1.系統類

    2.擴展類

    3.由程序員自定義的類

     Bootstrap Loader  // 負責加載系統類 (指的是內置類,像是String,對應于C#中的System類和C/C++標準庫中的類)
            | 
          - - ExtClassLoader   // 負責加載擴展類(就是繼承類和實現類)
                          | 
                      - - AppClassLoader   // 負責加載應用類(程序員自定義的類)
    

    三個加載器各自完成自己的工作,但它們是如何協調工作呢?哪一個類該由哪個類加載器完成呢?為了解決這個問題,Java采用了委托模型機制。

    委托模型機制的工作原理很簡單:當類加載器需要加載類的時候,先請示其(即上一層加載器)在其搜索路徑載入,如果找不到,才在自己的搜索路徑搜索該類。這樣的順序其實就是加載器層次上自頂而下的搜索,因為加載器必須保證基礎類的加載。之所以是這種機制,還有一個安全上的考慮:如果某人將一個惡意的基礎類加載到jvm,委托模型機制會搜索其父類加載器,顯然是不可能找到的,自然就不會將該類加載進來。

    我們可以通過這樣的代碼來獲取類加載器:

    ClassLoader loader = ClassName.class.getClassLoader();
    ClassLoader ParentLoader = loader.getParent();
    

    注意一個很重要的問題,就是Java在邏輯上并不存在的實體!因為它是用C++編寫的,所以打印其內容將會得到null。

    前面是對類加載器的簡單介紹,它的原理機制非常簡單,就是下面幾個步驟:

    1.裝載:查找和導入class文件;

    2.連接:

      (1)檢查:檢查載入的class文件數據的正確性;
      (2)準備:為類的靜態變量分配存儲空間;
      (3)解析:將符號引用轉換成直接引用(這一步是可選的)
    

    3.初始化:初始化靜態變量,靜態代碼塊。

    這樣的過程在程序調用類的靜態成員的時候開始執行,所以靜態方法main()才會成為一般程序的入口方法。類的構造器也會引發該動作。

    稍微詳細說下,加載步驟

    裝載

    簡單描述:在Java程序運行之前JVM會把編譯完成的.class二進制文件加載到內存,后續提供程序使用,用到的就是類加載器 。加載階段與連接階段的部分內容(如一部分字節碼文件格式驗證動作)是交叉進行的,加載階段尚未結束,連接階段就可能開始了。但是夾在加載階段進行的動作,仍然屬于連接階段的內容。

    連接

    文件格式檢驗:檢驗字節流是否符合Class文件格式的規范,并且能被當前版本的虛擬機處理。
    元數據檢驗:對字節碼描述的信息進行語義分析,以保證其描述的內容符合Java語言規范的要求.
    字節碼檢驗:通過數據流和控制流分析,確定程序語義是合法、符合邏輯的。
    符號引用檢驗:符號引用檢驗可以看作是對類自身以外(常量池中的各種符號引用)的信息進行匹配性校驗。
    

    初始化

    這是類加載的最后一步,真正執行類中定義的字節碼,也就是.class文件。 初始化階段是執行類構造器方法的過程,以及真正初始化類變量和其他資源的過程。

    鏈接:

網站首頁   |    關于我們   |    公司新聞   |    產品方案   |    用戶案例   |    售后服務   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區    電話:010-     郵箱:@126.com

備案號:冀ICP備2024067069號-3 北京科技有限公司版權所有