1. 程式人生 > >京東&美團研發面經

京東&美團研發面經

京東&美團研發面經

京東Java工程師

美團點評 後臺開發工程師

1

京東提前批Java開發

電話面試

本來想等面完再發個面經,等了半個月了沒等到。

一面:

0 自我介紹,講一下專案中的多執行緒實現

1 Java的執行緒池的引數,拒絕策略,阻塞佇列等實現和使用

2 fixethreadpool使用的是什麼阻塞佇列,如果使用arrayblockingqueue或者linkedblockingqueue會有什麼問題。

3 ArrayList和linkedlist有什麼區別,擴容呢

4 hashmap,hashtable,concurrenthashmap1.7和1.8選一個說一下。

5 jdk1.8針對hashmap使用紅黑樹優化目的是什麼,紅黑樹的結構說一下。

紅黑樹的特性:

(1)每個節點或者是黑色,或者是紅色。

(2)根節點是黑色。

(3)每個葉子節點(NIL)是黑色。 [注意:這裡葉子節點,是指為空(NIL或NULL)的葉子節點!]

(4)如果一個節點是紅色的,則它的子節點必須是黑色的。

(5)從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點。

6 JVM瞭解麼,說一下記憶體結構,堆區的分代,垃圾回收以及所用演算法。

7 為什麼要劃分年輕代和老年代,方法區是否會垃圾回收,還問了gc時要掃描哪些位置,說了gc root,他問具體呢,虛擬機器棧的區域性變數,然後說其他忘了。

在Java虛擬機器中判斷一個物件是否可以被回收,有一種做法叫可達性分析演算法,也就是從GC Root到各個物件,如果GC Root到某個物件還有可達的引用鏈,那麼這個物件就還不能被回收,否則就等著被收割吧。

這裡既然提到了GC Root,那麼哪類物件可以作為GC Root呢,這是一個在面試中經常被問到的問題。

《深入理解Java虛擬機器》一書中是這麼說的,一下幾種物件可以作為GC Root:

虛擬機器棧中的引用物件

方法區中類靜態屬性引用的物件

方法區中常量引用物件

本地方法棧中JNI引用物件

8 MySQL瞭解麼,說一下建立索引要考量的點,說了索引篩選率,過濾使用的欄位,以及explain檢視是否使用了索引等。

1、表的主鍵、外來鍵必須有索引; 

2、資料量超過300的表應該有索引;

3、經常與其他表進行連線的表,在連線欄位上應該建立索引; 

4、經常出現在Where子句中的欄位,特別是大表的欄位,應該建立索引;

5、索引應該建在選擇性高的欄位上;

6、索引應該建在小欄位上,對於大的文字欄位甚至超長欄位,不要建索引;

7、頻繁進行資料操作的表,不要建立太多的索引;

9 MySQL的隔離級別有哪些,預設級別是什麼,他說是可重複讀。

10 為什麼select方法預設可以不加鎖呢,明明可能會有併發衝突,我說根據隔離級別判斷是否加鎖,他說可重複讀級別下select是不加鎖的,為什麼。

我說應該是用了樂觀鎖,也就是MVCC多版本併發控制,適用於讀多寫少,所以不加鎖。

11 Redis提供有哪些資料型別

二面:

1 講一下兩個專案,分別做了什麼,覺得跟自己做的專案有什麼不同,如何看待這種不同,應該如何改進。

2 平時怎麼學習,你的部落格一般寫了什麼,覺得和高質量部落格的差距在哪裡。

我說我原創的都是比較基礎的,進階一點的部落格主要是整理別人的文章。

3 Java虛擬機器瞭解麼,講一下記憶體分割槽和gc,如何排查堆記憶體的問題,說使用jmap轉儲dump檔案分析或者使用jstat等工具檢測gc。

4 Java的執行緒池瞭解麼,看過它的原始碼麼,怎麼修改原始碼可以實現執行緒狀態的監控呢。

visualvm工具

5 web框架了解什麼,講講SpringMVC的啟動過程,講了mvc上下文以及dispatcher初始化過程和請求流程。

6 設計模式瞭解麼,單例,工廠,分別出現在什麼場景。

Spring,servlet,Spring的工廠方法

7 MySQL的select1和select *有什麼區別,為什麼加索引訪問比不加索引要快。

8 負載均衡的幾種演算法,快取的幾種淘汰策略。

9 計算機網路瞭解麼,http的header有哪些欄位,是否包含ip地址。

10 有什麼想問,能先來實習麼,不能。

我說了不能先實習,然後就沒有然後了,emmm,等了2周沒有動靜,估計涼涼。

美團一面

後臺開發工程師

電話面試

1 實習經歷

2 object類有哪些方法,hashcode,equals,clone,notify,wait。問我hashcode用在哪,說了hashmap

3 hashmap的結構,1.7和1.8有哪些區別,除了紅黑樹優化以外還有哪些改進,說了擴容時頭插法改尾插法。

4 開始問我頭插法和尾插法的區別,頭插法在多執行緒時會出現什麼問題,我說的是擴容時的死鏈,後來引導我說了併發插入的資料丟失問題。

5 concurrenthashmap的實現原理,1.7和1.8有什麼區別,分段鎖,synchronized和cas操作。

6 cas操作是怎麼實現的,為什麼是原子性的。wait和notify方法用在哪裡,wait和sleep的區別,notify後面的程式碼會不會執行。

7 synchronized和lock的區別在哪裡,使用方式上有什麼區別。lock的trylock方法做了什麼,我說了cas操作和加入阻塞佇列,以及公平鎖和非公平鎖的區別。

8 你的專案用到countdownlatch,為什麼要用,有什麼問題,如何監控這個問題。

9 執行緒池用過哪些,執行緒池有哪些引數,然後問我幾個常用執行緒池的用法和實際場景問題。

10 cas操作是哪個包裡的,volatile變數用過麼,有什麼作用,原理是什麼。i++是不是原子操作,為什麼。

11 ArrayList和linkedlist有什麼區別,如何遍歷,使用for迴圈遍歷linkedlist為什麼不行,linkedlist能使用索引訪問麼,使用迭代器呢。

這裡我打錯了。linkedlist也可以使用for迴圈遍歷。因為jdk提供了api。

12 JVM記憶體模型介紹一下,堆區怎麼分代,分代垃圾回收演算法說一下,老年代使用標記清除有什麼問題。

13 說幾個垃圾回收器,cms回收器有哪幾個過程,停頓幾次,會不會產生記憶體碎片。老年代產生記憶體碎片會有什麼問題。問我有沒有做過JVM優化。

14 jvm場景問題, 標記清除多次後老年代產生記憶體碎片,引起full gc,接下來可能發生什麼問題。我說分配大物件可能引起full gc。

15 哪些情況會觸發full gc,full gc是否包括young gc和major gc,如果只包括這兩個,為什麼要特地做full gc,我回答的是full gc還會回收方法區和堆外記憶體。

16 Java中有哪些引用,分別有什麼用。

17 Spring的ioc和aop說一下。

aop記錄日誌,什麼方法需要記錄日誌呢,增刪改查都要麼,我說前三個要把。他說那麼如果有多級呼叫的rpc查詢操作是不是也要記錄日誌,我說那是的。

18 分散式用過哪些技術,我說自己跑過一些demo,問我zookeeper有什麼用,然後問我dubbo裡的zookeeper是做什麼的,我說服務註冊中心。

19 服務註冊中心實現什麼功能,消費者的本地快取如果失效了怎麼辦,我剛開始說多次失敗重新拉取,他說這樣不行吧,我就說讓生產者和註冊中心維持心跳,失效時刪除該節點並且更新消費者快取即可。

20 MySQL用的挺多,問你一下,innodb的b+樹索引,主鍵索引,聚簇索引有什麼區別。

21 MySQL裡有哪些鎖,行鎖表鎖,樂觀鎖呢,我說了版本號和MVVC,開始問我MVVC。

22 事務的實際場景問題,兩個事務,一個查一個新增,問能否查到新增的,我問他隔離級別,他說RR。MySQL的RR避免幻讀,所以讀不到新增資料。

23 MySQL的死鎖怎麼產生的,舉了兩個例子。

24 三個事務,兩個加讀鎖,另一事務嘗試刪除,應該是不行的。

25 兩個事務,一個寫提交,另一個能不能讀到,可以讀到。

26 大概就是這些了。

美團貌似涼涼,這次確實答得不是很好。

▼更多精彩內容

更多校招乾貨請關注公眾號:程式設計師江湖

喜歡記得來一個

更多校招乾貨請關注公眾號:程式設計師江湖。