我最近從大廠離職之后在合肥呆了個把月,之前已經準備了半個多月,從7月底開始投簡歷面試,目前是java高級職位,到現在為止已經面了24+公司了,手上也有一些意向offer。現在把跟面試官對壘的面試問題總體記錄一下。請注意這里只有問題,沒有答案,答案在我的思維導圖里。本系列會分為三個系列博客去講我面過的一些公司出的一些題,以某個知識點或者框架出發(fā)擴展深入。來,看你能撐多少炮!
一、 redis連環(huán)炮
redis數據結構
redis有哪幾種數據結構?zset用過嗎,底層數據結構是什么?為什么使用跳表?跟B+樹怎么比?查找的時間復雜度是多少?GEO是干嘛的?舉個場景?HyperLogLog是干嘛的?Redis可以做消息隊列嗎?有什么缺點?
redis持久化
redis持久化了解嗎?有哪些方式?RDB和AOF的區(qū)別&各自的優(yōu)缺點?說一下redis持久化的過程?redis持久化方式你們是怎么選型的?了解過redis混合持久化嗎?是一個文件還是多個文件?redis進行持久化的時候會阻塞主線程嗎?如果數據量比較多持久化時間較長會出現什么情況?
redis 實現分布式鎖
redis分布式鎖了解嗎?假如我的業(yè)務代碼執(zhí)行時間不是很穩(wěn)定?使用redis做分布式鎖會有什么問題呢?你怎么解決鎖超時的問題?有什么方案嗎?跟zk的分布式鎖有什么區(qū)別?
redis集群部署
redis集群部署模式有哪些,介紹一下?介紹一下cluster模式和sentinel模式的區(qū)別?介紹一下sentinel模式如何感知sever節(jié)點上下線的?redis-server的ping/pong協議了解嗎?怎么用的?
講一下redis主從復制的過程?主從模式下假如主節(jié)點掛了之后?數據如何同步?redis cluster模式下通過key插入/查找value的過程了解嗎?
redis高可用
有哪些可能導致redis存在性能問題的因素?redis cluster模式下如何擴容和縮容的?redis在使用過程中明明內存充足但是插入數據失敗怎么排查?如何解決redis的內存碎片問題?產生的原因是什么?redis的內存達到機器內存極限值之后有哪些策略可以避免?redis數據刪除的策略有哪些?緩存擊穿/緩存雪崩/緩存穿透了解嗎?介紹一下產生這種問題的原因?你有什么解決思路嗎?redis-mysql緩存一致性了解嗎?緩存一致性方案有哪些?
二、MySQL連環(huán)炮
MySQL 鎖
MySQL鎖了解嗎?悲觀鎖怎么實現的?樂觀鎖了解嗎?各自適用的場景能介紹一下嗎?間隙鎖是什么意思?解決了什么問題?如何確定間隙鎖鎖記錄的范圍?MVCC了解嗎?解決了什么問題?
MySQL 索引
Mysql索引了解嗎,有哪些索引類型?innodb索引結構是怎么樣的?為什么使用B+樹呢?為什么不使用B樹呢?有什么優(yōu)勢?B樹這種結構一般還有什么場景下會用到呢?假如有a,b聯合索引,where a=? 會走索引嗎? where b=?會走索引嗎, where a>? and b<?會走索引嗎,為什么?這種聯合索引在B+樹的數據結構里怎么存的?
MySQL 性能優(yōu)化
MySQL性能優(yōu)化做過嗎?你做過SQL的性能優(yōu)化嗎?舉個例子?Mysql引起的CPU消耗過大怎么排查? 假如一條sql執(zhí)行的很慢你怎么排查?假如我要查的字段長度相對固定,但是沒走索引你會怎么建索引呢?你執(zhí)行explain的話會看哪些指標?這些指標分別代表什么含義呢?如果查詢的字段確實有加索引但是實際上走了全表掃描你該怎么排查呢?假如我數據庫某張表數據特別大,但是要分頁查,翻頁越來越慢怎么解決,比如select a from table limit 1000000,100這個sql怎么提高查詢效率。
MySQL 存儲引擎
MySQL存儲引擎有哪些?innodb和MyIsam有什么區(qū)別?mysql存儲引擎是基于表的還是基于數據庫的?為什么?講一下一條sql從client端到mysql server端到返回結果中經歷了什么?
MySQL 持久化理論
Mysql事務用過嗎?了解ACID嗎?解釋一下什么意思?mysql事務的隔離性原理是什么?其他幾個的原理呢?MySQL事務的隔離級別了解?分別解決了什么問題?可重復讀是什么意思?幻讀是怎么產生的?MySQL臟讀是怎么產生的?讀已提交相對于讀未提交解決了什么問題?Mysql支持了這幾個隔離級別的原理知道嗎?
MySQL分庫分表
分庫分表用過嗎?有哪些框架?TDDL了解嗎?TDDL的分層架構組件講一下?假如我要查100條,如何聚合結果?在server端做還是在client端做呢?數據量這么大client端做會不會有問題?假如我有一張表用戶-訂單表,你怎么設計分表規(guī)則?以用戶id做分片分表的話,但是我想通過訂單id查最近10條訂單怎么查?有什么方案?分庫分表的跨庫事務你怎么解決的?有哪些方案或者思路?
MySQL 架構&高可用
假如讓你去設計一個項目你怎么去考慮這個項目在mysql層的高可用?有哪些架構模式?一主多從的方式如何做數據同步的?主從延遲怎么解決?假如我的寫并發(fā)量比較大,數據庫突然down機了,怎么保證數據一致性。mysql->redis的數據同步怎么做的?解析binlog嗎?
三、消息隊列連環(huán)炮
消息隊列技術選型
說說你用過哪些消息隊列?各自有什么優(yōu)缺點?各自的適用場景?現在企業(yè)一般都是建立一個集群支持不同的業(yè)務線,你有沒有想到這么做的優(yōu)缺點?
消息隊列產品-kafka
kafka接收消息和轉發(fā)消息的流程畫一下?發(fā)送一條消息到kafka集群中,kafka是怎么保證消息不丟失的?在消息隊列場景中有消息重復的問題,kafka是怎么解決的?kafka中消息發(fā)送到消費者端是不是每個機器都會消費?假如消費者集群有些宕機了,如何保障重新消費消息?假如消息太多,我的消費者集群已經加了200臺,仍然消費不了怎么解決?
消息隊列產品-rocketmq
rocketmq用過嗎?有哪些特性?源碼有閱讀過嗎?事務消息的原理是什么?來畫圖說一下事務消息生產消費的過程?rocketmq如何保障消息的順序的?rocketmq如何保證消息不丟失的?底層做了哪些優(yōu)化?
消息隊列高可用
如果是你去做一個消息隊列你會考慮哪些方面保障消息隊列的高可用?
四、java基礎&高級連環(huán)炮
java鎖
java 鎖了解嗎?java中有哪些鎖呢?說一下sychronized的原理?說一下sychronized和Lock的區(qū)別?說一下java中多線程情況下競爭鎖比較激烈導致鎖升級的過程?產生死鎖的條件是什么?怎么避免?volatile怎么用?有什么特性?重排序了解嗎?volatile怎么解決的?還有什么方式可以解決重排序的問題?基于volatile的單例模式解決了什么問題?sychronized和volatile的區(qū)別講一下?講一下懶漢式的單例模式怎么寫?
java多線程
java多線程用過嗎?怎么用的?有什么缺點?線程池的原理了解嗎?有哪些線程池?構造線程池的參數有哪些?線程池的拒絕策略有哪些?什么時候會觸發(fā)拒絕策略?阻塞隊列有哪幾種?,線程池的線程工廠參數你是怎么設置的?為什么呢?假如我假如有臺機器每秒產生50個任務,每個任務執(zhí)行1秒,CPU是2核的你怎么設置這些參數呢?線程池執(zhí)行任務的時候出現異常沒拋出異常你怎么解決?有哪些方案?線程池執(zhí)行任務結束調用shutdown和調用shutdownNow方法的區(qū)別?假如我想獲取線程執(zhí)行任務之后返回的結果怎么做?Future.get()會阻塞主線程嗎?那如果任務執(zhí)行時間太長調用Future.get()會怎么樣?
java類加載
java類加載了解嗎?有哪些類加載器?rt.jar是誰加載的?什么是雙親委派模型?假如我要注冊JDBC驅動去操作數據庫,這個注冊的過程你了解嗎?打破雙親委派模型的例子有哪些?java中有些使用了代理模式去創(chuàng)建類,大量創(chuàng)建的類存在哪里?如果類不用了怎么卸載?有哪些方式?
java熱加載做過嗎?原理是什么?Tomcat的熱部署用過嗎?原理是什么?
java并發(fā)容器
java concurrent包里的并發(fā)容器了解嗎?concurrentHashMap在1.7和1.8的實現區(qū)別?為什么使用紅黑樹而不用平衡樹?說一下插入kv的過程?blockingQueue用過嗎?怎么用的?CopyOnWriteArrayList知道嗎?怎么用的?concurrentHashMap什么時候會擴容?HashMap有什么問題?
java數據類型
假如3*0.01=0.03嗎?為什么?怎么解決?有哪些方案?BigDecimal大數計算的原理是什么?Integer a= 1000 Integer b=1000 ,a=b? a=100,b=100,a=b?為什么?
五、jvm連環(huán)炮
jvm垃圾回收算法
java引用有哪些?怎么判斷引用的對象是否需要被回收?JVM中有哪些可以作為GCROOTS?JVM垃圾回收算法有哪些?各自有什么優(yōu)勢和使用場景?你們部署服務的時候JVM配置的什么回收器?參數配的是啥?年輕代用什么垃圾回收器?老年代呢?說一下CMS垃圾回收的過程?在哪些階段會產生STW?CMS會產生內存碎片嗎?為什么?怎么解決?CMS壓縮內存的時候會STW嗎?為什么?G1回收器了解嗎?有什么特性?
jvm調優(yōu)
JVM調優(yōu)做過嗎?怎么調的?使用的什么命令?分析過GC日志嗎?線程棧dump文件中有哪些信息?線程狀態(tài)有哪些?CPU load飆高怎么排查?分析過dump文件嗎?怎么判斷有內存泄漏的?怎么解決的?產生FGC的原因有哪些?如果頻繁FGC你有什么思路?如果FGC基本正常,YGC時間逐漸增大導致服務抖動怎么排查?
JVM 編譯模式了解嗎?C1,C2各自怎么進行字節(jié)碼編譯的?有什么優(yōu)缺點?如何解決代碼冷啟動問題?
jvm內存模型
java內存模型了解嗎?常量池在哪?元數據區(qū)存的是啥?哪些是線程共享的?棧溢出的場景有哪些?新建一個對象的過程說一下?有哪些場景下會用非堆內存?一般用非堆存什么東西?非堆中的對象會GC嗎?為什么?