常見的JVM 面試題

1、講一講JVM的跨平台與跨語言

跨平台

我們寫的一個類,在不同的作業系統上(Linux、windows、Mac OS)執行,效果是一樣的。這就是JVM的跨平台性。

跨語言

JVM只識別位元組碼,JVM不是翻譯Java文件,而是識別class文件,把它編譯成位元組碼在JVM上跑。這就是JVM的跨語言特徵。

2、什麼是JVM、與JDK有什麼區別

JVM(Java虛擬機)+ Java標準開發庫 = JRE (JAVA的運行時環境)

JRE (JAVA的運行時環境) + 開發調試診斷工具 = JDK

總結 : JDK 包含了 JVM

3、JVM運行時數據區有那些

運行時數據區

Java虛擬機在執行Java程式的過程中會將它所管理的記憶體劃分為若干個不同的數據區域

JVM運行時數據區包括:

  • 程式計數器
  • Java虛擬機
  • 本地方法棧
  • 記憶體堆
  • 方法區
  • 運行時常量池

4、什麼是記憶體堆?堆記憶體包含那些部分?

記憶體堆

**堆 **是JVM上最大的記憶體區域,我們申請的幾乎所有的對象,都存儲在這裡

堆空間劃分

  • 新生代(Eden + S0 + S1)
  • 老年代

5、什麼是記憶體溢出

記憶體溢出

指JVM可用記憶體不足

常見的記憶體溢出

  • 棧溢出 –> 死遞歸
  • 堆溢出
  • 方法區溢出
  • 本機直接記憶體溢出

6、什麼是記憶體泄漏?與記憶體溢出有什麼關係?

記憶體泄漏(memory Leak)

指無用的對象繼續佔用記憶體,你沒有再恰當的時機釋放記憶體

與記憶體溢出的關係

如果存在嚴重的記憶體泄漏問題,隨著時間的推移,則必然會引起記憶體溢出

記憶體泄漏一般是資源管理問題和程式BUG,記憶體溢出則是記憶體空間不足和記憶體泄漏的最終結果

7、對象頭包含那些部分?

對象頭一部分:用於存儲對象自身的運行時數據(Mark Word)。另一部分是類型指針

如果對象是一個Java數組,那麼再對象頭中還有一塊用於記錄數組長度的數據

8、Java 8 中默認使用的垃圾手機器是什麼?

Java 8默認情況下使用的是並行垃圾收集器(Parallel GC)