面試準備 - JVM面試準備

整理一下JVM的面試題,別讓自己在面試官面籤懵逼了就好。。。

1. JVM虛擬機

1.1 什麼是java虛擬機

Java虛擬機是一個可以執行Java字節碼的虛擬機進程。Java源文件被編譯成能被Java虛擬機執行的字節碼文件。

1.2 平臺無關性

一次編譯,到處執行(Write Once ,Run Anywhere)。
Java被設計成允許應用程序可以運行在任意的平臺,而不需要程序員爲每一個平臺單獨重寫或者是重新編譯。Java虛擬機讓這個變爲可能,因爲它知道底層硬件平臺的指令長度和其他特性。

1.3 JVM 的主要組成部分?及其作用?

  • 類加載器(ClassLoader)
  • 運行時數據區(Runtime Data Area)
  • 執行引擎(Execution Engine)
  • 本地庫接口(Native Interface)

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

1.4 引用的分類

  • 強引用:GC時不會被回收
  • 軟引用:描述有用但不是必須的對象,在發生內存溢出異常之前被回收
  • 弱引用:描述有用但不是必須的對象,在下一次GC時被回收
  • 虛引用(幽靈引用/幻影引用):無法通過虛引用獲得對象,用PhantomReference實現虛引用,虛引用用來在GC時返回一個通知。

1.5 垃圾回收機制算法

  1. 標記 -清除算法,“標記-清除”(Mark-Sweep)算法,如它的名字一樣,算法分爲“標記”和“清除”兩個階段:首先標記出所有需要回收的對象,在標記完成後統一回收掉所有被標記的對象。
  2. 複製算法,“複製”(Copying)的收集算法,它將可用內存按容量劃分爲大小相等的兩塊,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活着的對象複製到另外一塊上面,然後再把已使用過的內存空間一次清理掉。
  3. 標記-壓縮算法,標記過程仍然與“標記-清除”算法一樣,但後續步驟不是直接對可回收對象進行清理,而是讓所有存活的對象都向一端移動,然後直接清理掉端邊界以外的內存
  4. 分代收集算法,“分代收集”(Generational Collection)算法,把Java堆分爲新生代和老年代,這樣就可以根據各個年代的特點採用最適當的收集算法。

1.6 JVM性能調優方法

  1. 設定堆內存大小
    -Xmx:堆內存最大限制。
  2. 設定新生代大小。 新生代不宜太小,否則會有大量對象湧入老年代
    -XX:NewSize:新生代大小
    -XX:NewRatio 新生代和老生代佔比
    -XX:SurvivorRatio:伊甸園空間和倖存者空間的佔比
  3. 設定垃圾回收器
    年輕代用 -XX:+UseParNewGC
    老生代用-XX:+UseConcMarkSweepGC

1.7 JVM調優工具

常用調優工具分爲兩類:
  1. jdk自帶監控工具:jconsole和jvisualvm
  2. 第三方有:MAT(Memory Analyzer Tool)、GChisto。
詳細描述爲:
  • jconsole,Java Monitoring and Management Console是從java5開始,在JDK中自帶的java監控和管理控制檯,用於對JVM中內存,線程和類等的監控
  • jvisualvm,jdk自帶全能工具,可以分析內存快照、線程快照;監控內存變化、GC變化等。
  • MAT,Memory Analyzer Tool,一個基於Eclipse的內存分析工具,是一個快速、功能豐富的Java heap分析工具,它可以幫助我們查找內存泄漏和減少內存消耗
  • GChisto,一款專業分析gc日誌的工具

1.8 麼判斷對象是否可以被回收

  • 引用計數器:爲每個對象創建一個引用計數,有對象引用時計數器 +1,引用被釋放時計數 -1,當計數器爲 0 時就可以被回收。它有一個缺點不能解決循環引用的問題;
  • 可達性分析:從 GC Roots 開始向下搜索,搜索所走過的路徑稱爲引用鏈。當一個對象到 GC Roots 沒有任何引用鏈相連時,則證明此對象是可以被回收的。

1.9 什麼是雙親委派機制

當某個類加載器需要加載某個.class文件時,它首先把這個任務委託給他的上級類加載器,遞歸這個操作,如果上級的類加載器沒有加載,自己纔會去加載這個類。

1.10 雙親委派機制的作用

  1. 防止重複加載同一個.class。通過委託去向上面問一問,加載過了,就不用再加載一遍。保證數據安全。
  2. 保證核心.class不能被篡改。通過委託方式,不會去篡改核心.class,即使篡改也不會去加載,即使加載也不會是同一個.class對象了。不同的加載器加載同一個.class也不是同一個Class對象。這樣保證了Class執行安全。

1.11 堆棧

功能方面:堆是用來存放對象的,棧是用來執行程序的。
共享性:堆是線程共享的,棧是線程私有的。
空間大小:堆大小遠遠大於棧。

個人網站

http://www.zhouzhaodong.xyz

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章