2020 年 Java 面試題(中高級)

自我面試

  • 背書式的學習對技術的提升幫助很小。

  • 本篇內容不涉及答案,答案需要去相關專欄學習。

  • 把面試看作是費曼學習法中的回顧、授課環節。首先我們能講給自己聽,如果不滿意再回爐學習總結,如此反覆。

專欄學習地址:

一、併發編程面試題

內存模型

  • 內存模型
    • 定義
    • 爲什麼要有內存模型
    • 爲什麼要重排序,重排序在什麼時候排
    • 如何約束重排序規則
    • happens-before
  • 什麼是順序一致性
  • CAS 實現的原理,是阻塞還是非阻塞方式?什麼時候用,使用時需要考慮的問題
  • 處理器和 Java 分別怎麼保證原子操作
  • 保證了原子性就能保證可見性嗎?
  • final 內存語義?什麼時候用,使用時需要考慮的問題
  • volatile 內存語義,什麼時候用,用的時候需要考慮什麼問題
  • synchronized 內存語義,什麼時候用,和鎖比較一下優缺點
  • synchronized 中涉及的鎖升級流程
  • 鎖的內存語義,舉例說明,加鎖失敗時候的處理流程
  • 比較下 CAS 、volatile 、synchronized、Lock 區別
  • 原子操作類底層實現機制?自增操作是怎麼保證原子性的?

線程

  • 線程的狀態有哪些
  • 如何在 Java 中實現線程?
  • 如何在 Java 中啓動一個線程?
  • 設計線程中斷的意義是什麼
  • Java 中 interrupted 和 isInterrupted 方法的區別?
  • 如何停止一個線程?
  • 線程 join 方法幹什麼用?
  • 有三個線程 T1,T2,T3,怎麼確保它們按順序執行?
  • 線程的等待通知機制實現機制?
  • 爲什麼應該在循環中檢查等待條件?
  • 爲什麼 wait 和 notify 方法要在同步塊中調用?
  • 爲什麼 wait, notify 和 notifyAll 這些方法不在 thread 類裏面?
  • ThreadLocal 是什麼,怎麼實現的
  • 線程池是什麼,提交一個任務進去,處理流程?
  • Executor 框架介紹
  • JUC 包中提供了哪些配置好的線程池,差異化是什麼
  • 什麼是 FutureTask?

  • Lock 接口提供了哪些實現類
  • AQS 是什麼,提供了哪些方法
  • AQS 中獨佔鎖和共享鎖的操作流程大體描述一下
  • 重入鎖有什麼好處,什麼時候考慮用
  • 讀寫鎖有什麼好處,什麼時候考慮用?讀鎖是什麼類型的鎖,寫鎖呢?
  • 說下讀寫鎖裏的鎖降級流程,什麼時候可以考慮用這個機制
  • park 方法是怎麼實現的
  • 鎖的等待通知機制 Condition 是怎麼實現的,有了線程的等待通知機制爲什麼還要設計 Condition?
  • 死鎖怎麼產生的,如何避免
  • 說說 Java 中有哪些鎖
  • sleep、wait、park、Condition 都能讓線程等待,有什麼區別?
  • 所謂 sleep 不會釋放鎖,wait 會釋放鎖,釋放鎖後重新獲取時它的上下文數據如何處理的?
  • 釋放鎖會讓 CPU 進行上下文切換嗎?

容器與工具

  • 阻塞和非阻塞有什麼區別,他們可以用什麼方式實現
  • 隊列(Queue)提供哪些操作
  • 阻塞隊列提供了哪些獲取元素的方法,有什麼區別?
  • 阻塞隊列有哪些實現?爲什麼要分有界無界?
  • CountDownLatch 怎麼實現的,什麼時候考慮用?
  • CyclicBarrier 怎麼實現的,什麼時候考慮用?
  • Semaphore 怎麼實現的,什麼時候考慮用?
  • 如何在兩個線程間共享數據?
  • Exchanger 怎麼實現的,什麼時候考慮用?
  • ConcurrentHashMap 實現?
  • fork/join 框架是什麼?

二、JVM 虛擬機面試題

內存管理

  • 爲什麼需要 JVM?
  • 簡單描述 JMM 和 JVM 兩個概念
  • JVM 內存管理
  • 永久代、元空間、方法區的關係
  • 類加載過程
  • 雙親委派模式有什麼好處
  • 如何覆蓋 JDK 提供的組件,比如覆蓋 ArrayList 的實現
  • new 一個對象的過程發生了什麼(類加載、變量初始化、內存分配)
  • 對象的死亡過程
  • JVM 可能會拋出哪些 OOM
  • 垃圾回收算法有哪些?優缺點比較
  • 熟知的垃圾回收器有哪些,簡單描述每個應用場景
  • CMS 和 G1 的垃圾回收步驟是?
  • G1 相對於 CMS 的優缺點

性能監控與調優

  • 如何監控 GC
  • 常見 OutOfMemoryError 有哪些
  • 常見的 JDK 診斷命令有哪些,應用場景?
  • CPU 較高,如何定位問題
  • 內存佔用較高,如何定位大對象
  • 內存泄漏時,如何實時跟蹤內存變化情況
  • 內存泄漏時,如何定位問題代碼
  • 大型項目如何進行性能瓶頸調優?

虛擬機子系統

  • 字節碼是如何在 JVM 中進行流轉的(棧幀)
  • 方法調用的底層實現
  • 方法重寫和重載的實現過程
  • invokedynamic 指令實現
  • 如何修改字節碼
  • JIT 參數配置如何影響程序運行?
  • 虛擬機有哪些性能優化策略
發佈了270 篇原創文章 · 獲贊 55 · 訪問量 38萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章