面試總結之-美團面試總結(三)
三面
1、照例自我介紹和專案介紹;
2、上來就讓我手撕一個單例模式。。。答:
public class SingleInstanceDemo { private SingleInstanceDemo(){} private static volatile SingleInstanceDemo singleInstance; public static SingleInstanceDemo getInstance(){ if (singleInstance == null){ synchronized (SingleInstanceDemo.class){ if (singleInstance == null){ singleInstance = new SingleInstanceDemo(); } } } return singleInstance; } }
3、讓我講了講程式碼是啥啥意思?
答:STEP 1. 執行緒A訪問getInstance()方法,因為單例還沒有例項化,所以進入了鎖定塊。STEP 2. 執行緒B訪問getInstance()方法,因為單例還沒有例項化,得以訪問接下來程式碼塊,而接下來程式碼塊已經被執行緒1鎖定。STEP 3. 執行緒A進入下一判斷,因為單例還沒有例項化,所以進行單例例項化,成功例項化後退出程式碼塊,解除鎖定。STEP 4. 執行緒B進入接下來程式碼塊,鎖定執行緒,進入下一判斷,因為已經例項化,退出程式碼塊,解除鎖定。STEP 5. 執行緒A初始化並獲取到了單例例項並返回,執行緒B獲取了線上程A中初始化的單例。大體是這麼回事。
4、由於我的專案中提及到JVM,所以給我出了一個場景題,垃圾會收器中,標記清除多次後,由於採用的是標記清除演算法,那麼你覺得可能會出現什麼問題?
答:由於標記清除演算法清理垃圾物件的同時產生了記憶體碎片(雖然釋放記憶體但不是連續的),所以當分配一個大物件的時候,由於記憶體不連續,那麼會產生full GC。
5、這裡提及到了full gc,問我,哪些情況會產生full GC,哪些情況產生minor GC?
答:minor會產生在eden區滿了,fullGC產生在老年代的剩餘空間不足,以及永久代記憶體不足也會發生fullGC。
6、除了你專案中的記憶體溢位問題,你還知道哪些關於記憶體溢位記憶體洩漏的?
答:這裡之前瞭解過ThreadLocal,ThreadLocal中的鍵值對中的鍵是一個弱引用,那麼在記憶體回收的時候,這個鍵很可能會被回收掉,然後鍵沒了,就無法引用value的值,造成了記憶體洩漏;
如有披露或問題歡迎留言或者入群探討