大宇java面試系列(二):jvm組成部分

  • . 說一下 JVM 的主要組成部分?及其做用?程序員

       類加載器(ClassLoader)微信

  • 運行時數據區(Runtime Data Area)學習

  • 執行引擎(Execution Engine)spa

  • 本地庫接口(Native Interface)操作系統

  • 組件的做用: 首先經過類加載器(ClassLoader)會把 Java 代碼轉換成字節碼,運行時數據區(Runtime Data Area)再把字節碼加載到內存中,而字節碼文件只是 JVM 的一套指令集規範,並不能直接交個底層操做系統去執行,所以須要特定的命令解析器執行引擎(Execution Engine),將字節碼翻譯成底層系統指令,再交由 CPU 去執行,而這個過程當中須要調用其餘語言的本地庫接口(Native Interface)來實現整個程序的功能。線程

  • 2. 說一下 JVM 運行時數據區?翻譯

  • 不一樣虛擬機的運行時數據區可能略微有所不一樣,但都會聽從 Java 虛擬機規範, Java 虛擬機規範規定的區域分爲如下 5 個部分:對象

  • 程序計數器(Program Counter Register):當前線程所執行的字節碼的行號指示器,字節碼解析器的工做是經過改變這個計數器的值,來選取下一條須要執行的字節碼指令,分支、循環、跳轉、異常處理、線程恢復等基礎功能,都須要依賴這個計數器來完成;接口

  • Java 虛擬機棧(Java Virtual Machine Stacks):用於存儲局部變量表、操做數棧、動態連接、方法出口等信息;隊列

  • 本地方法棧(Native Method Stack):與虛擬機棧的做用是同樣的,只不過虛擬機棧是服務 Java 方法的,而本地方法棧是爲虛擬機調用 Native 方法服務的;

  • Java 堆(Java Heap):Java 虛擬機中內存最大的一塊,是被全部線程共享的,幾乎全部的對象實例都在這裏分配內存;

  • 方法區(Methed Area):用於存儲已被虛擬機加載的類信息、常量、靜態變量、即時編譯後的代碼等數據。

  • 3. 說一下堆棧的區別?

  • 功能方面:堆是用來存放對象的,棧是用來執行程序的。

  • 共享性:堆是線程共享的,棧是線程私有的。

  • 空間大小:堆大小遠遠大於棧。

  • 4. 隊列和棧是什麼?有什麼區別?

  • 隊列和棧都是被用來預存儲數據的。

  • 隊列容許先進先出檢索元素,但也有例外的狀況,Deque 接口容許從兩端檢索元素。

  • 棧和隊列很類似,但它運行對元素進行後進先出進行檢索。

  • 5. 什麼是雙親委派模型?

  • 在介紹雙親委派模型以前先說下類加載器。對於任意一個類,都須要由加載它的類加載器和這個類自己一同確立在 JVM 中的惟一性,每個類加載器,都有一個獨立的類名稱空間。類加載器就是根據指定全限定名稱將 class 文件加載到 JVM 內存,而後再轉化爲 class 對象。

  • 類加載器分類:

  • 啓動類加載器(Bootstrap ClassLoader),是虛擬機自身的一部分,用來加載Java_HOME/lib/目錄中的,或者被 -Xbootclasspath 參數所指定的路徑中而且被虛擬機識別的類庫;

  • 其餘類加載器:

  • 擴展類加載器(Extension ClassLoader):負責加載\lib\ext目錄或Java. ext. dirs系統變量指定的路徑中的全部類庫;

  • 應用程序類加載器(Application ClassLoader)。負責加載用戶類路徑(classpath)上的指定類庫,咱們能夠直接使用這個類加載器。通常狀況,若是咱們沒有自定義類加載器默認就是用這個加載器。

  • 雙親委派模型:若是一個類加載器收到了類加載的請求,它首先不會本身去加載這個類,而是把這個請求委派給父類加載器去完成,每一層的類加載器都是如此,這樣全部的加載請求都會被傳送到頂層的啓動類加載器中,只有當父加載沒法完成加載請求(它的搜索範圍中沒找到所需的類)時,子加載器纔會嘗試去加載類。

  • 6. 說一下類裝載的執行過程?

  • 類裝載分爲如下 5 個步驟:

  • 加載:根據查找路徑找到相應的 class 文件而後導入;

  • 檢查:檢查加載的 class 文件的正確性;

  • 準備:給類中的靜態變量分配內存空間;

  • 解析:虛擬機將常量池中的符號引用替換成直接引用的過程。符號引用就理解爲一個標示,而在直接引用直接指向內存中的地址;

  • 初始化:對靜態變量和靜態代碼塊執行初始化工做。

  • 7. 怎麼判斷對象是否能夠被回收?

  • 通常有兩種方法來判斷:

  • 引用計數器:爲每一個對象建立一個引用計數,有對象引用時計數器 +1,引用被釋放時計數 -1,當計數器爲 0 時就能夠被回收。它有一個缺點不能解決循環引用的問題;

  • 可達性分析:從 GC Roots 開始向下搜索,搜索所走過的路徑稱爲引用鏈。當一個對象到 GC Roots 沒有任何引用鏈相連時,則證實此對象是能夠被回收的。

  • 8. Java 中都有哪些引用類型?

  • 強引用:發生 gc 的時候不會被回收。

  • 軟引用:有用但不是必須的對象,在發生內存溢出以前會被回收。

  • 弱引用:有用但不是必須的對象,在下一次GC時會被回收。

  • 虛引用(幽靈引用/幻影引用):沒法經過虛引用得到對象,用 PhantomReference 實現虛引用,虛引用的用途是在 gc 時返回一個通知。

若是您感受文章對您有所幫助,請讓更多人看到!

1.點贊此篇文章,並評論一句!

2.轉發此篇文章 給予做者支持!

3.微信搜索 ~ 關注微信公衆號:程序員知識碼頭  獲取全套學習資料一份!

微信掃碼關注:天天準時發技術文章!還能加入專屬的學習交流社羣!

相關文章
相關標籤/搜索