一位讀者小姐姐的阿里Java後臺面經分享,快被問哭了!(附部分問題詳解)

我是 Guide 哥,一 Java 後端開發,半個全棧,自由的少年。java

這篇文章是一位 女讀者 (加粗!太可貴)的面試阿里的經歷分享,雖然第二面面完就失敗了,可是這樣的經歷對本身幫助仍是很大的。面試

下面的一些問題很是具備表明性,部分問題我簡單作了修改(有些問題表述的不那麼準確)。這些問題對於你們用於自測或者準備面試都頗有幫助。redis

我只給出了少部分問題的參考答案,由於本身真的抽不出有時間來把每個問題都細心解答一遍了。單單是回答了下面的少部分問題,就從昨晚 9 點一直忙到 12 點半。算法

有答案需求的小夥伴,評論區安排,須要的人多的話,我這週末花時間把一份頂好的參考答案都整出來!數據庫

小聲 BB:寫參考答案其實挺難的,相比於面試的時候回答問題來講。不少面試官本身問的問題可能連本身都不清楚,哈哈哈!單單是回答了下面的少部分問題,就從昨晚 9 點一直忙到 12 點半。

自我介紹就不說了,每一面都會讓你說。後端

項目相關

這個面試前確定要準備的,Guide 哥的文章中也提到了不少次,我準備的還算充分,面試官比較滿意。
  1. 介紹一下你簡歷上寫的項目?本身主要作了什麼?(_簡歷上雖然寫了,可是面試官仍是問了_)
  2. 你以爲項目裏給你最大的挑戰是什麼?遇到了什麼問題?如何解決的?從中學到了什麼?
  3. 項目的架構圖能畫一下不?(_一個很 low 的後臺網站_)
  4. 以爲項目有哪些地方能夠改進完善?(_我說能夠加一個 redis 緩存把熱點數據緩存起來_)
  5. 爲何要用 Nginx?有啥用?優缺點?
  6. 有沒有遇到過內存泄漏的場景?

Java 基礎

  1. StringBuilder 和 StringBuffer(_StringBuffer 是線程安全的,StringBuilder 是不安全的_)
  2. 如何實現靜態代理?有啥缺陷?
  3. 動態代理的做用?在哪些地方用到了?(_AOP、RPC 框架中都有用到_)
  4. JDK 的動態代理和 CGLIB 有什麼區別?
  5. 談談對 Java 註解的理解,解決了什麼問題?
  6. Java 反射?反射有什麼缺點?你是怎麼理解反射的(爲何框架須要反射)?

---第 4 題參考答案---設計模式

JDK 動態代理只能只能代理實現了接口的類,而 CGLIB 能夠代理未實現任何接口的類。 另外, CGLIB 動態代理是經過生成一個被代理類的子類來攔截被代理類的方法調用,所以不能代理聲明爲 final 類型的類和方法。就兩者的效率來講,大部分狀況都是 JDK 動態代理更優秀,隨着 JDK 版本的升級,這個優點更加明顯。緩存

---第 5 題參考答案---安全

Java 語言中的類、方法、變量、參數和包等均可以註解標記,程序運行期間咱們能夠獲取到相應的註解以及註解中定義的內容,這樣能夠幫助咱們作一些事情。好比說 Spring 中若是檢測到說你的類被 @Component註解標記的話,Spring 容器在啓動的時候就會把這個類歸爲本身管理,這樣你就能夠經過 @Autowired註解注入這個對象了。網絡

---第 6 題參考答案---

反射介紹:

JAVA 反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;對於任意一個對象,都可以調用它的任意一個方法和屬性;這種動態獲取的信息以及動態調用對象的方法的功能稱爲 java 語言的反射機制。

反射的優缺點以下:

  • 優勢: 運行期類型的判斷,動態加載類,提升代碼靈活度。
  • 缺點: 1,性能瓶頸:反射至關於一系列解釋操做,通知 JVM 要作的事情,性能比直接的 java 代碼要慢不少。2,安全問題,讓咱們能夠動態操做改變類的屬性同時也增長了類的安全隱患。

爲何框架須要反射技術?

在咱們平時的項目開發過程當中,基本上不多會直接使用到反射機制,但這不能說明反射機制沒有用,實際上有不少設計、開發都與反射機制有關,例如模塊化的開發,經過反射去調用對應的字節碼;動態代理設計模式也採用了反射機制,還有咱們平常使用的 Spring/Hibernate 等框架也大量使用到了反射機制。

舉例:

  1. 咱們在使用 JDBC 鏈接數據庫時使用 Class.forName()經過反射加載數據庫的驅動程序;
  2. Spring 框架的 IOC(動態加載管理 Bean)建立對象以及 AOP(動態代理)功能都和反射有聯繫;
  3. 動態配置實例的屬性;
  4. ......

更多 Java 基礎相關的問題,請參考這篇頂好頂完善的文章: 「Java 面試題精華集」Java 基礎知識篇(2020 最新版)附 PDF 版 !

集合框架

  1. HashMap 的底層實現、JDK 1.8 的時候爲啥將鏈表轉換成紅黑樹?、HashMap 的負載因子、HashMap 和 Hashtable 的區別?
  2. 有哪些集合是線程不安全的?怎麼解決呢?
  3. 什麼是快速失敗(fail-fast)、能舉個例子嗎?、什麼是安全失敗(fail-safe)呢?

集合框架相關的問題的答案,請參考這篇頂好頂完善的文章: 「Java 面試題精華集」1w 字的 Java 集合框架篇(2020 最新版)附 PDF 版 ! ,裏面介紹的很是詳細很是棒!

多線程

  1. 在多線程狀況下如何保證線程安全
  2. synchronized 做用,底層實現
  3. ReetrantLock 和 synchronized 的區別
  4. AQS
  5. 線程池做用?Java 線程池有哪些參數?阻塞隊列有幾種?拒絕策略有幾種?
  6. 線程死鎖
  7. ThreadLocal 是什麼,應用場景是什麼,原理是怎樣的
  8. 介紹一下 Java 有哪些鎖(synchronized、juc 提供的鎖如 ReentrantLock、CountDownLatch、CyclicBarrier、Semaphore 等)

---第 6 題參考答案---

線程死鎖描述的是這樣一種狀況:多個線程同時被阻塞,它們中的一個或者所有都在等待某個資源被釋放。因爲線程被無限期地阻塞,所以程序不可能正常終止。

以下圖所示,線程 A 持有資源 2,線程 B 持有資源 1,他們同時都想申請對方的資源,因此這兩個線程就會互相等待而進入死鎖狀態。

線程死鎖示意圖

---第 7 題參考答案---

一般狀況下,咱們建立的變量是能夠被任何一個線程訪問並修改的。若是想實現每個線程都有本身的專屬本地變量該如何解決呢? JDK 中提供的ThreadLocal類正是爲了解決這樣的問題。 ThreadLocal類主要解決的就是讓每一個線程綁定本身的值,能夠將ThreadLocal類形象的比喻成存放數據的盒子,盒子中能夠存儲每一個線程的私有數據。

若是你建立了一個ThreadLocal變量,那麼訪問這個變量的每一個線程都會有這個變量的本地副本,這也是ThreadLocal變量名的由來。他們可使用 get()set() 方法來獲取默認值或將其值更改成當前線程所存的副本的值,從而避免了線程安全問題。

再舉個簡單的例子:

好比有兩我的去寶屋收集寶物,這兩個共用一個袋子的話確定會產生爭執,可是給他們兩我的每一個人分配一個袋子的話就不會出現這樣的問題。若是把這兩我的比做線程的話,那麼 ThreadLocal 就是用來避免這兩個線程競爭的。

ThreadLocal最終的變量是放在了當前線程的 ThreadLocalMap 中,並非存在 ThreadLocal 上,ThreadLocal 能夠理解爲只是ThreadLocalMap的封裝,傳遞了變量值。 咱們能夠把 ThreadLocalMap 理解爲ThreadLocal 類實現的定製化的 HashMapThrealLocal 類中能夠經過Thread.currentThread()獲取到當前線程對象後,直接經過getMap(Thread t)能夠訪問到該線程的ThreadLocalMap對象。

每一個Thread中都具有一個ThreadLocalMap,而ThreadLocalMap能夠存儲以ThreadLocal爲 key ,Object 對象爲 value 的鍵值對。

ThreadLocalMap(ThreadLocal<?> firstKey, Object firstValue) {
 ......
}

好比咱們在同一個線程中聲明瞭兩個 ThreadLocal 對象的話,會使用 Thread內部都是使用僅有那個ThreadLocalMap 存放數據的,ThreadLocalMap的 key 就是 ThreadLocal對象,value 就是 ThreadLocal 對象調用set方法設置的值。

ThreadLocalMapThreadLocal的靜態內部類。

JVM

  1. 講一下 JVM 的內存結構(還問了每一個區域的調優配置參數,我蒙了)
  2. Minor gc 和 Full gc 的區別,詳細介紹
  3. 方法區和永久代的關係?
  4. JDK 1.8 HotSpot 的永久代爲啥被完全移除?有哪些經常使用參數?
  5. 主要進行 gc 的區域。永久代會發生 gc 嗎?元空間呢?
  6. 各類垃圾回收算法和回收器,說出本身的理解
  7. zgc ?zgc vs g1?(我懵逼了~我只是聽過有這個東西,徹底沒有去了解過)

---第 2 題參考答案---

周志明先生在《深刻理解 Java 虛擬機》第二版中 P92 如是寫道:

「老年代 GC(Major GC/Full GC),指發生在老年代的 GC……」

上面的說法已經在《深刻理解 Java 虛擬機》第三版中被改正過來了。感謝 R 大的回答:

總結:

針對 HotSpot VM 的實現,它裏面的 GC 其實準確分類只有兩大種:

部分收集 (Partial GC):

  • 新生代收集(Minor GC / Young GC):只對新生代進行垃圾收集;
  • 老年代收集(Major GC / Old GC):只對老年代進行垃圾收集。須要注意的是 Major GC 在有的語境中也用於指代整堆收集;
  • 混合收集(Mixed GC):對整個新生代和部分老年代進行垃圾收集。

整堆收集 (Full GC):收集整個 Java 堆和方法區。

---第 3 題參考答案---

方法區也被稱爲永久代。不少人都會分不清方法區和永久代的關係,爲此我也查閱了文獻。

《Java 虛擬機規範》只是規定了有方法區這麼個概念和它的做用,並無規定如何去實現它。那麼,在不一樣的 JVM 上方法區的實現確定是不一樣的了。 方法區和永久代的關係很像 Java 中接口和類的關係,類實現了接口,而永久代就是 HotSpot 虛擬機對虛擬機規範中方法區的一種實現方式。 也就是說,永久代是 HotSpot 的概念,方法區是 Java 虛擬機規範中的定義,是一種規範,而永久代是一種實現,一個是標準一個是實現,其餘的虛擬機實現並無永久代這一說法。

---第 4 題參考答案---

JDK 1.8 的時候,方法區(HotSpot 的永久代)被完全移除了(JDK1.7 就已經開始了),取而代之是元空間,元空間使用的是直接內存。

<p style="text-align:right;font-size:13px;color:gray">https://blogs.oracle.com/poon...</p>

下面是一些經常使用參數:

-XX:MetaspaceSize=N //設置 Metaspace 的初始(和最小大小)
-XX:MaxMetaspaceSize=N //設置 Metaspace 的最大大小

與永久代很大的不一樣就是,若是不指定大小的話,隨着更多類的建立,虛擬機會耗盡全部可用的系統內存。

爲何要將永久代 (PermGen) 替換爲元空間 (MetaSpace) 呢?

<p style="text-align:right;font-size:13px;color:gray">https://plumbr.io/handbook/ga...</p>

1.整個永久代有一個 JVM 自己設置固定大小上限,沒法進行調整,而元空間使用的是直接內存,受本機可用內存的限制,雖然元空間仍舊可能溢出,可是比原來出現的概率會更小。

當你元空間溢出時會獲得以下錯誤: java.lang.OutOfMemoryError: MetaSpace

你可使用 -XX:MaxMetaspaceSize 標誌設置最大元空間大小,默認值爲 unlimited,這意味着它只受系統內存的限制。-XX:MetaspaceSize 調整標誌定義元空間的初始大小若是未指定此標誌,則 Metaspace 將根據運行時的應用程序需求動態地從新調整大小。

2.元空間裏面存放的是類的元數據,這樣加載多少類的元數據就不禁 MaxPermSize 控制了, 而由系統的實際可用空間來控制,這樣能加載的類就更多了。

3.在 JDK8,合併 HotSpot 和 JRockit 的代碼時, JRockit 歷來沒有一個叫永久代的東西, 合併以後就沒有必要額外的設置這麼一個永久代的地方了。

---第 5 題參考答案---

主要進行 gc 的區域是堆,就 HotSpot 虛擬機來講,永久代會發生 gc (full gc),可是,元空間使用的是直接內存不會發生 gc。

數據庫

  1. 講一下樂觀鎖和悲觀鎖;
  2. 說一下 MVCC
  3. 說一聚簇索引和非聚簇索引的有什麼不一樣
  4. 關於索引的各類轟炸(索引相關的知識過重要了!!!)

網絡

  1. 爲何網絡要分層?
  2. TCP/IP 4 層模型瞭解麼?
  3. http 是哪一層的協議?
  4. http 和 https 什麼區別
  5. http2.0(_不知道_)
  6. tcp 三次握手過程、滑動窗口是幹什麼的?
  7. Mac 地址和 ip 地址的區別?既然有了 Mac 地址,爲何還要 ip 地址呢?
  8. 當你打開一個電商網站,都須要經歷哪些過程?
  9. 電子郵件的發送過程?

---第 1 題參考答案---

說到分層,咱們先從咱們平時使用框架開發一個後臺程序來講,咱們每每會按照每一層作不一樣的事情的原則將系統分爲 三層(複雜的系統分層可能會更多):

  1. Repository(數據庫操做)
  2. Service(業務操做)
  3. Controller(數據交互)

複雜的系統須要分層,由於每一層都須要專一於一類事情。咱們的網絡分層的緣由也是同樣,每一層只專一於作一類事情。

爲何計算機網絡要分層呢? ,咱們再來較爲系統的說一說:

  1. 各層之間相互獨立:各層之間相互獨立,各層之間不須要關心其餘層是如何實現的,只須要知道本身如何調用下層提供好的功能就能夠了(能夠簡單理解爲接口調用)。這個和咱們對開發時系統進行分層是一個道理。
  2. 提升了總體靈活性 :每一層均可以使用最適合的技術來實現,你只須要保證你提供的功能以及暴露的接口的規則沒有改變就好了。這個和咱們平時開發系統的時候要求的高內聚、低耦合的原則也是能夠對應上的。
  3. 大問題化小 : 分層能夠將複雜的網絡間題分解爲許多比較小的、界線比較清晰簡單的小問題來處理和解決。這樣使得複雜的計算機網絡系統變得易於設計,實現和標準化。 這個和咱們平時開發的時候,通常會將系統功能分解,而後將複雜的問題分解爲容易理解的更小的問題是相對應的,這些較小的問題具備更好的邊界(目標和接口)定義。

說到計算機網絡分層,我想到了計算機世界很是很是有名的一句話,這裏分享一下:

計算機科學領域的任何問題均可以經過增長一個間接的中間層來解決,計算機整個體系從上到下都是按照嚴格的層次結構設計的。

Guide 哥注:若是一層不夠那就加兩層吧!

---第 2 題參考答案---

TCP/IP 4 層模型:

  1. 應用層
  2. 傳輸層
  3. 網絡層
  4. 網絡接口層

須要注意的是,咱們並不能將 TCP/IP4 層模型 和 OSI7 層模型徹底精確地匹配起來,不過能夠簡單將二者對應起來,以下圖所示:

TCP/IP 4層模型

---第 3 題參考答案---

HTTP 協議 屬於應用層的協議。

HTTP 協議是基於 TCP 協議的,發送 HTTP 請求以前首先要創建 TCP 鏈接也就是要經歷 3 次握手。目前使用的 HTTP 協議大部分都是 1.1。在 1.1 的協議裏面,默認是開啓了 Keep-Alive 的,這樣的話創建的鏈接就能夠在屢次請求中被複用了。

另外, HTTP 協議是」無狀態」的協議,它沒法記錄客戶端用戶的狀態 通常咱們都是經過 Session 來記錄客戶端用戶的狀態。

Spring

  1. Spring AOP 和 IOC 的底層實現
  2. Spring Boot 瞭解不?和 Spring 啥區別?
  3. Spring Boot 的啓動類源碼有了解過嗎

其餘

  1. 工做想 base 在哪裏?爲何?
  2. 平時有什麼興趣愛好?
  3. 本身將來有什麼規劃?
  4. 平時是如何學習新技術的?(官網/書籍/博客/視頻
  5. 通常遇到問題如何解決?(Google 和 Stackoverflow,雖然我平時不多用 Stackoverflow,可是仍是和麪試官說我常常用,哈哈哈!
  6. 介不介意加班?(求生欲讓我回答不介意
  7. 你有什麼問題想問我?(_我問了工做強度、項目上女生多很少_)

總結

  1. 必定要準備好自我介紹。自我介紹儘可能和簡歷上寫的更加豐富一點,突出本身的能力。
  2. 一面主要問的是項目,因此,在面試以前必定要對項目很熟悉!項目的優化點、技術棧、架構圖等等都要搞清楚。
  3. 阿里面試整體感受比較重視基礎,因此 Java 那些基本功必定要紮實。而後,網絡部分也要格外重視。
  4. 阿里面試官對於一些問題問的很深刻,我沒有準備太好,結果致使 2 面就翻車了。

閒聊

Guide 的女讀者挺少的,10 個關注個人人中只有一個女性讀者。

最近在這篇文章:《最強(細)校招/社招求職指南:隔壁小姐姐已經收到字節意向書,你的秋招還沒開始?》中還逮到了一個拿到的字節意向書的女讀者(顏值又高,技術又好,太厲害了!),我真的不要太開心了!而後,就厚臉皮地去讓這位小姐姐幫忙寫一下面經(後續可能會安排上)。

還不是爲了大家?我真是操碎了心啊!

我是Guide哥,Java後端開發,半個全棧,自由的少年。一個三觀比主角還正的技術人。咱們下期再見!

相關文章
相關標籤/搜索