## 長亮一面
視頻面試,時長1小時。
## 總結
* 發現時間和能力不成正比,實力需要加強。
* 學習知識需要加深理解,不能只在表面或者靠背。
* 開源項目源碼需深入。
### 開局自我介紹
面試官您好!我的名字叫xx,來自湖北武漢,軟件工程專業畢業。到目前為止,從事過2個行業,在浪潮做了5年電子政務,來平安做了1年人事行業。
### 介紹最近的項目
HPaaS后端框架及IDE,參與后端框架設計,主導配套IDE的設計及實現。從代碼下載,代碼生成,代碼拖拽輔助,代碼編譯打包等功能實現,最后交由自動發布平臺通過流水線發布到k8s中部署。
### 為什么離職?
一年內人事調動頻繁。
### 為什么要用二叉樹?
(為什么要用,其實就是在問優點)
數組插入太慢搜索快,鏈表查詢太慢插入快,二叉樹整合了二者的優點。
在樹中查找數據的速度和有序數組中查找一樣快,并且插入數據和刪除數據的速度和鏈表一樣。
### Java并發有用到那些點
cas,volatile,synchronized,線程池等
(Future,Fork/Join等)
### volatile有什么特性
* 防止指令重排序(內存屏障實現的);
* 保證變量在多線程(多核)可見性(當修改volatile變量時,虛擬機會給cpu發送一個信號告訴其他cpu這個變量已修改,當其他cpu調用這個變量時,就會先檢查是否有收到修改該變量的信號,有則重新從主存中讀取。volatile是無鎖的,類似于樂觀鎖的機制)。
### 為什么用線程池?
多個任務需要并行執行,加快處理速度,提高系統吞吐;多線程方式會無法控制線程數量,且性能多浪費在線程創建和銷毀時;而使用線程池能解決這些問題。
因為線程創建和銷毀都會進行系統調用(用戶態和內核態來回切換,消耗資源),為了減少創建和銷毀的消耗,用線程池來管理線程,以及線程復用。
可參考:https://www.zhihu.com/question/41134816
1. 核心線程數(corePoolSize)不宜過多(若為3),線程池創建完后還沒有執行過任務時線程數是0。先執行1個任務,線程池會創建出來一個線程來執行該任務,此時線程數為1。
再執行第2個任務,線程池會創建第二個線程來執行該任務,此時線程數為2。且2個任務都執行完成,2個線程均空閑。
再執行第3個任務,線程池還是會創建第3個線程來執行該任務,此時線程數為3。
后續第4個任務,線程數已經達到了設置的核心線程數3,不會再創建,讓其中一個線程去執行該任務。
2. 又有很多任務來了,此時就需要一個工作隊列(WorkQueue)來讓任務排隊。(生產者消費者模式)工作隊列是一個有界的阻塞隊列,阻塞是指當隊列為空時,獲取任務的線程狀態是阻塞的(不占用cpu資源),等工作隊列有任務后,獲取任務的線程會被喚醒繼續運行。
3. *在 workQueue 已滿的條件下,如果當前線程池的線程數量 >= corePoolSize 且 <= maximumPoolSize,后續如果一直有其它線程丟任務進來,會一直創建線程,直到 maximumPoolSize。*
### 什么場景下用的呢
調度程序在網絡間傳送大文件,比如500M,傳輸接口限制每次只能發送4M大小的數據。
于是做分片,利用線程池并行發送分片數據。
### 線程池里線程數擴縮容機制
始線程池里線程數是0,執行任務后,會創建到核心線程數大小。若工作隊列滿了,則創建到最大線程數大小。空閑后,則維護線程數到核心線程數大小。
### 有線上環境問題處理的經驗嗎?
發現系統長時間運行后會內存溢出導致服務掛掉,后來發現是http調用工具里資源未釋放導致。
(是HttpClient嗎?需要關閉嗎?我回答要關閉)
### JVM類加載
加載,鏈接(驗證,準備,解析),初始化,使用,卸載。
### JVM卸載一個類的要滿足什么前提條件
* 該類所有的實例都已經被回收。
* 加載該類的ClassLoader已經被回收。
* 該類對應的java.lang.Class對象沒有任何地方被引用。
### 設計模式用了哪些
單例,適配器,觀察者,門面等。
分別說下是在什么場景下用的。
### 設計模式6大原則
。。。。
### 設計模式原則里的開閉原則是什么
。。。
### IO模型有哪些
* BIO - 同步阻塞IO
* NIO - 同步非阻塞IO
* 多路復用器 select
* poll
* epoll
* AIO - 異步IO
### 多路復用器是什么?帶來了什么好處?
### 為什么不用異步IO呢?
### CAP理論,你是如何理解的?
### ZK是CP還是AP什么的?為什么?

### 分布式鎖,請說說在什么場景下用到的呢?
在服務端多節點部署時,預約號保證順序時加了分布式鎖。
### 不用分布式鎖,可以用其他方案代替嗎?
自己的答案:可以用消息隊列,順序消費后會寫結果,前端輪詢查詢結果。(方案有點重,我說應對高并發大流量時是這么做的)
查找資料后的答案:路由 + Java鎖機制。分析需要使用分布式鎖的業務流程,找到合適的路由規則,將請求路由到統一節點并且配合Java的鎖實現同步。
### 有開源項目源碼研究和二次開發經驗嗎?
。。。(沒有,大多是使用)
### 對薪水有什么要求?
30k+
- 面試突擊
- Java虛擬機
- 認識字節碼
- 000Java發展歷史
- 000Macos10.15.7上編譯OpenJDK8u
- 001熟悉Java內存區域
- 002熟悉HotSpot中的對象
- 003Java如何計算對象大小
- 004垃圾判定算法與4大引用
- 005回收堆和方法區中對象
- 006垃圾收集算法
- 007HotSpot虛擬機垃圾算法實現篇1
- 007HotSpot虛擬機垃圾算法實現篇2
- 007HotSpot虛擬機垃圾算法實現篇3
- 008垃圾收集器
- 009內存分配與回收策略
- 010Java虛擬機相關工具
- 011調優案例分析
- 012一次IDEA的啟動速度調優
- 013類文件Class的結構
- 014熟悉字節碼指令
- 015類加載機制(過程)
- 016類加載器
- IDEA的JVM參數
- Java基礎
- Java自動裝箱與拆箱
- Java基礎數據類型
- Java方法的參數傳遞
- Java并發
- 001走入并行的世界
- 002并行程序基礎
- 003熟悉Java內存模型JMM
- 004Java并發之volatile關鍵字
- 005線程池入門到精通
- 006Java多線程間的同步控制方法
- 007Java維基準測試框架JMH
- 008Java并發容器
- 009Java的線程實現
- 010Java關鍵字synchronized
- 011一些并行模式的熟悉
- 單例模式和不變模式
- 生產者消費者模式
- Future模式
- 012一些并行算法的熟悉
- 面試總結
- 長亮一面