常見的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)