docker圖示linux,解鎖Java效能優化的五大誤區
4 年經驗應該具備哪些技能
首先,簡單的聊一下我認為的 4 年經驗左右、優秀的 Java 程式設計師應該具備的技能有哪些,按“專業技能”和“專案”兩塊,包括但不限於以下內容。
專業技能方面
- 基礎:JDK 常用類的原理、原始碼、使用場景。
- 設計模式:常用幾種的原理、使用場景,單例、動態代理、模板、責任鏈等。
- 資料結構:陣列、連結串列、棧、佇列、樹。
- 網路:TCP、HTTP、HTTPS、負載均衡演算法。
- 框架:Spring IoC 原理、Spring AOP 原理和使用、Spring 常用的擴充套件點、MyBatis 的核心流程。
- 中介軟體:常用中介軟體的核心原理與最佳實踐,並對其中的 1 到 2 個有深入的學習,Redis、Kafka(RocketMQ、RabbitMQ)、Dubbo、Zookeeper。
- 資料庫(MySQL):索引原理、隔離級別、鎖機制、分庫分表、慢 SQL 定位及優化、線上問題解決。
- Netty:NIO 原理、核心元件、I/O 多路複用(epoll)、零拷貝。
- JVM:執行時資料區、垃圾回收演算法、垃圾回收器(CMS、G1)、常用配置引數、線上問題定位及解決。
- 穩定性保障:隔離、限流、熔斷、降級等。
- Linux:基本命令的使用、快速定位和排查問題。
- 分散式理論:CAP、BASE、2PC、3PC、TCC。
專案方面
- 能獨立完成一個複雜模組的需求分析、方案設計和最終落地實現。
- 能不斷思考,尋找更優的設計和解決方案,積極優化慢 SQL、慢服務。
- 具備排查問題的能力,遇到線上問題能及時定位和修復上線,例如:資料庫死鎖、伺服器宕機、伺服器 Full GC 頻繁等。
- 具備難題攻關的能力,能不斷解決專案遇到的挑戰,能給予初級工程師技術上的指導。
- 初步具備帶領團隊(1-3人左右)的能力,能合理分配需求,做好進度把控、風險評估、Code Review。
嚴格來說,要完全做到上面這些有點難,我自己也並不具備,但是,我們可以將其視為目標,不斷去努力。
面試常見形式
大廠面試通常是“連環炮”的形式,舉個栗子:
面試官:用過哪些 Map
我:LinkedHashMap、ConcurrentHashMap、HashMap、TreeMap
面試官:這四種 Map 的區別
我:ConcurrentHashMap 執行緒安全,LinkedHashMap 可以記錄插入順序和訪問順序,TreeMap 可以自定義排序,除了這幾個場景,其他場景基本都可以使用 HashMap
面試官:ConcurrentHashMap 怎麼保證執行緒安全
我:JDK 1.8 以前通過分段鎖,JDK 1.8 以後通過 CAS + Synchronized
面試官:ConcurrentHashMap 在 JDK 1.8 前後的鎖有什麼區別
我:JDK 1.8 以前鎖分段,JDK 1.8 以後鎖單個節點,鎖粒度降低,併發度變高
這種模式的問法,其實就是想了解候選人對一個知識點的理解是僅僅停留在表面,還是真的去深入研究過。
面試內容
下面介紹下一些常見的面試內容,其中的面試題不一定是我真實遇到的,有可能是從別人的面試題中收集的,也有可能是我自己覺得重要的知識點,僅供參考。
1、專案
專案對於一個 3 - 5 年經驗的開發來說是非常重要的,面試官也非常看重這一塊。這個經驗的開發基本是各大公司的編碼主力,因此面試這個年限的候選人,通常專案是很重要的一塊。面試官通常會讓你先自己介紹下自己參與度最高(或者最牛逼)的專案,然後從中進行提問。常見的如以下:
- 介紹下你參與度最高的專案
- 畫下專案的架構圖
- 如果核心流程處理到一半,伺服器崩潰了,會怎麼處理
- 專案中遇到過哪些挑戰或問題,怎麼解決的
- 專案的穩定性和可用性怎麼保障
- 資料安全這塊怎麼設計
- 專案的技術選型,為什麼選這些
- ...
2、場景題
越到後面的面試官,越喜歡問場景題,場景題比較考驗候選人平時的積累和解決問題能力。這個環節很容易掛掉一批人,特別是容易緊張的同學,很容易腦子會一片空白。場景題的核心一般是處理大資料量的問題、解決效能方面的問題。
場景題本質上是比較開放的,沒有什麼標準答案,只要自己的方案能夠解決問題,能夠“自圓其說”就行。
這個環節面試官可能會將線上真實的場景拿出來提問,我自己就遇到過。
3、專業技能
集合
- 經常用到哪些 Map
- 這幾種 Map 的區別
- CocurrentHashMap 怎麼保證執行緒安全
- CocurrentHashMap 在 JDK 1.8 前後的鎖有什麼區別
- 聊下 HashMap 的原理
- HashMap 在 Put 時,新連結串列節點是放在頭部還是尾部
- HashMap 擴容時的流程
- HashMap 在 JDK 1.8 有什麼改變
- CocurrentHashMap 在 JDK 1.8 有什麼改變
- TreeMap 的原理
- Map、List、Set 分別說下你知道的執行緒安全類和執行緒不安全的類
多執行緒、鎖
- 執行緒池使用的是哪種
- 執行緒池引數怎麼配置
- 執行緒池各個引數的作用
- 執行緒池的引數配置要注意什麼
- 執行緒池的工作流程
- JDK 中的併發類知道哪些
- AQS 的底層原理
- 介紹下悲觀鎖和樂觀鎖
- 使用過哪些鎖
- synchronized 和 Lock 的區別、使用場景
- synchronized 原理
- synchronized 作用於靜態方法、普通方法、this、Lock.class 的區別
- 為什麼引入偏向鎖、輕量級鎖,介紹下升級流程
- 死鎖的必要條件,如何預防死鎖
- 介紹下 CountDownLatch 和 CyclicBarrier
- 介紹下 CAS,存在什麼問題
- 介紹下 ThreadLocal,存在什麼問題
網路
- HTTPS 是怎麼加密的
- 普通 Hash 和一致性 Hash 原理
- 一致性 Hash 的缺點
- TCP 三次握手過程,為什麼需要三次握手
- 為什麼 TIME_WAIT 狀態需要經過 2MSL 才能返回到 CLOSE 狀態
- TCP 的擁塞控制
- TCP 如何解決流控、亂序、丟包問題
- 為什麼會出現粘包和拆包,如何解決
Spring、Mybatis
- Mybatis 中 # 和 $ 的區別
- 怎麼防止 SQL 注入
- 使用 Mybatis 時,呼叫 DAO(Mapper)介面時是怎麼呼叫到 SQL 的
- 介紹下 Spring IoC 的流程
- BeanFactory 和 FactoryBean 的區別
- Spring 的 AOP 是怎麼實現的
- Spring 的事務傳播行為有哪些,講下巢狀事務
- 什麼情況下物件不能被代理
- Spring 怎麼解決迴圈依賴的問題
- 要在 Spring IoC 容器構建完畢之後執行一些邏輯,怎麼實現
- @Resource 和 @Autowire 的區別
- @Autowire 怎麼使用名稱來注入
- bean 的 init-method 屬性指定的方法裡用到了其他 bean 例項,會有問題嗎
- @PostConstruct 修飾的方法裡用到了其他 bean 例項,會有問題嗎
- Spring 中,有兩個 id 相同的 bean,會報錯嗎,如果會報錯,在哪個階段報錯
- Spring 中,bean 的 class 屬性指定了一個不存在的 class,會報錯嗎,如果會報錯,在哪個階段
- Spring 中的常見擴充套件點有哪些
MySQL
- MySQL 索引的資料結構
- 為什麼使用 B+ 樹,與其他索引相比有什麼優點
- 各種索引之間的區別
- B+ 樹在進行範圍查詢時怎麼處理
- MySQL 索引葉子節點存放的是什麼
- 聯合索引(複合索引)的底層實現
- MySQL 如何鎖住一行資料
- SELECT 語句能加互斥鎖嗎
- 多個事務同時對一行資料進行 SELECT FOR UPDATE 會阻塞還是異常
- MySQL 使用的版本和執行引擎
- MySQL 不同執行引擎的區別
- MySQL 的事務隔離級別
- MySQL 的可重複讀是怎麼實現的
- MySQL 是否會出現幻讀
- MySQL 的 gap 鎖
- MySQL 的主從同步原理
- 分庫分表的實現方案
- 分散式唯一 ID 方案
- 如何優化慢查詢
- explain 中每個欄位的意思
- explain 中的 type 欄位有哪些常見的值
- explain 中你通常關注哪些欄位,為什麼
JVM
- 執行時資料區
- 伺服器使用的什麼垃圾收集器
- CMS 垃圾收集的原理
- G1 垃圾收集的特點,為什麼低延遲
- 有哪些垃圾回收演算法,優缺點
- 哪些物件可以作為 GC Roots
- 有哪些類載入器
- 雙親委派模式,哪些場景是打破雙親委派模式
- 線上伺服器出現頻繁 Full GC,怎麼排查
- 定位問題常用哪些命令
- 介紹下 JVM 調優的過程
Kafka
- 為什麼使用 Kafka
- 介紹下 Kafka 的各個元件
- 如何保證寫入 Kafka 的資料不丟失
- 如何保證從 Kafka 消費的資料不丟失
- Kafka 為什麼效能這麼高
- 零拷貝技術使用哪個方法實現
- Java 中也有類似的零拷貝技術,是哪個方法
- Kafka 怎麼保證訊息的順序消費
- Kafka 怎麼避免重複消費
- 什麼是 HighWatermark 和 LEO
- 什麼是 ISR,為什麼需要引入 ISR
Redis
- 專案中使用的 Redis 版本
- Redis 在專案中的使用場景
- Redis 怎麼保證高可用
- Redis 的選舉流程
- Redis 和 Memcache 的區別
- Redis 的叢集模式
- Redis 叢集要增加分片,槽的遷移怎麼保證無損
- Redis 分散式鎖的實現
- Redis 刪除過期鍵的策略
- Redis 的記憶體淘汰策略
- Redis 的 Hash 物件底層結構
- Redis 中 Hash 物件的擴容流程
- Redis 的 Hash 物件的擴容流程在資料量大的時候會有什麼問題嗎
- Redis 的持久化機制有哪幾種
- RDB 和 AOF 的實現原理、優缺點
- AOF 重寫的過程
- 哨兵模式的原理
- 使用快取時,先操作資料庫還是先操作快取
- 為什麼是讓快取失效,而不是更新快取
- 快取穿透、快取擊穿、快取雪崩
- 更新快取的幾種設計模式
Zookeeper
- Zookeeper 的使用場景
- Zookeeper 怎麼實現分散式鎖
- Zookeeper 怎麼保證資料的一致性
- ZAB 協議的原理
- Zookeeper 遵循 CAP 中的哪些
- Zookeeper 和 Eureka 的區別
- Zookeeper 的 Leader 選舉
- Observer 的作用
- Leader 傳送了 commit 訊息,但是所有的 follower 都沒有收到這條訊息,Leader 就掛了,後續會怎麼處理
分散式
- CAP 理論
- BASE 理論
- 分散式事務 2PC 和 TCC 的原理
- TCC 在 cancel 階段如果出現失敗怎麼處理
- Paxos 演算法、Raft 演算法
4、Hr 面
如果你一路過五關斬六將,最終來到了 Hr 面,那麼恭喜你,你已經離 offer 非常非常近了。可以開始暢想自己升職加薪,當上總經理,出任 CEO,迎娶白富美,走上人生巔峰的場景了。
Hr 面主要是瞭解候選人的一些通用素質,經常會問的問題如下:
- 介紹下自己投入最多的專案(當時我就驚了,Hr 也開始問專案了 )
- 離職的原因
- 當前的薪資、績效
- 當前在面試的其他公司的情況
- 平時有沒有學習的習慣,怎麼學習的,現在在學習什麼
- 未來的規劃
總結
對於面試還是要好好準備的,尤其是有些問題還是很容易挖坑的,例如你為什麼離開現在的公司(你當然不應該抱怨現在的公司有哪些不好的地方,更多的應該表明自己想要尋找更好的發展機會,自己的一些現實因素,比如對於我而言是現在應聘的公司離自己的家更近,又或者是自己工作到達了迷茫期,想跳出迷茫期等等)
Java面試精選題、架構實戰文件
整理不易,覺得有幫助的朋友可以幫忙點贊分享支援一下小編~
你的支援,我的動力;祝各位前程似錦,offer不斷!