面試總結(jié)

spring相關(guān)面試題

  1. IOC和AOP的理解
  2. 了解過spring單例bean的線程安全問題嗎
  3. springMVC的工作原理,---重點提到DispatcherServlet
  4. spring事物的方式,事物級別和傳播行為--編程式事物、聲明式事物

springboot相關(guān)面試題

遺漏

redis

  1. redis 內(nèi)部數(shù)據(jù)接口 ---> redisObject

  2. redis應(yīng)用場景

    • string 緩存、計數(shù)器、分布式鎖
    • map 緩存對象 ziplist、hashtable
    • list 緩存文章列表、消息等 ziplist和linkedlist,quicklist
    • set 緩存一些標(biāo)簽 intset(數(shù)組)和hashtable
    • zset 延時隊列、排行榜 ziplist、skiplist
  3. redis使用的一致性算法

  4. redis分布式鎖有什么問題

    • 獲取鎖,使用lua或者事務(wù)來進(jìn)行cas操作
    • 刪除鎖時有可能刪除別人的鎖 --- 使用當(dāng)前線程作為value值進(jìn)行加鎖,在刪除時先判斷再刪除(這個解鎖的操作作為一個事務(wù)Lua)
    • 有可能導(dǎo)致死鎖 --- 增加超時機(jī)制
    • 超時機(jī)制可能導(dǎo)致業(yè)務(wù)和鎖釋放時間不一致
      使用定時任務(wù)不斷更新超時時間
    • 高可用鎖如何實現(xiàn),比如主從結(jié)構(gòu),主節(jié)點失效?
      - 可疑考慮zookeeper
      - 可以
       Rlock redissonLock=redisson.getLock(lockKey); 
       try{
    }
    

虛擬機(jī)部分

  1. G1垃圾回收器優(yōu)點

  2. CMS垃圾回收器的回收過程

    • 初始標(biāo)記 stw
    • 并發(fā)標(biāo)記 ---- 有可能存在沒有命中的垃圾
    • 重新標(biāo)記 stw
    • 清除 --- 因為不是復(fù)制算法,所以存在很多碎片,可能導(dǎo)致fullGC
  3. myisam

  4. 內(nèi)核態(tài)和用戶態(tài)

kafka部分

  1. kafka的業(yè)務(wù)上冪等性如何實現(xiàn)?
  2. kafka 事務(wù)的原理

tcp/http

  1. tcp 所用到的算法,擁塞控制

  2. netty工作線程源碼

  3. hashmap的擴(kuò)容機(jī)制

  4. epoll和select的區(qū)別,紅黑樹的作用是什么

  5. epoll的調(diào)用流程:

    • epoll_create 創(chuàng)建一個句柄
    • epoll_ctl 注冊事件,更新或者刪除
    • epoll_wait 獲取新的事件

    為什么更快:

    1. 底層維護(hù)了一棵紅黑樹來保存這些socket,而不是像poll或select那樣每次執(zhí)行,都會傳入一個數(shù)組
    2. 另外維護(hù)了一個list來保存動態(tài)的事件,最開始我們在內(nèi)核中斷中注冊一個回調(diào)函數(shù),當(dāng)對應(yīng)發(fā)生中斷時,就會把它放到這個就緒list當(dāng)中,每當(dāng)epoll_wait 調(diào)用時僅僅把這個list復(fù)制即可
  6. 滑動窗口和擁塞控制
    每個socket讀寫的時候內(nèi)部都會維護(hù)一個發(fā)送以及接收的緩沖區(qū),

java

  1. 什么是cpu密集型、什么是io密集型
  2. concurrentHashMap為什么不支持null----因為有二義性,單線程可以通過get,再contains來判斷,但是多線程情況下,這兩個操作之前可能因為并發(fā)導(dǎo)致結(jié)果不一致
  3. synchronize和lock的區(qū)別
    • synchronize,可以用在代碼塊和方法上,編程更簡潔
    • synchronize在異常時會自動釋放鎖,而lock必須要在finally塊中釋放,不然會死鎖
    • Lock可以中斷響應(yīng)
    • Lock功能更多更靈活,可以知道有沒有成功獲取鎖,可以使用tryLock,快速反饋
    • Lock可以支持公平和非公平,而synchronize只支持非公平
    • Lock還提供了condition
  4. volatile原理:緩存一致性協(xié)議,volatile關(guān)鍵字前有l(wèi)ock前綴,相當(dāng)于一個內(nèi)存屏障
    1. 確保不會把它后面的指令放到前面
    2. 會強(qiáng)制把對緩存的修改理解寫入內(nèi)存
    3. 如果是寫操作,會導(dǎo)致其他CPU中對應(yīng)的緩存行失效
  5. synchronize 原理
    • 每個對象頭部存儲了鎖信息
    • synchronized是一個重量級鎖,其中指針指向了monitor對象,每個對象都有一個monitor與之關(guān)聯(lián)
    • monitor類,有一個waitSet、blocklist以及owner
    • 代碼塊中字節(jié)碼指令會有monitorenter和monitorexit指令,而方法中則ACC_SYNCHRONIZED來控制
    • 第一次訪問時偏向鎖,后面有新線程訪問,則升級為輕量鎖,再升級為互斥鎖

spring cloud

  1. eureka 自我保護(hù)機(jī)制、服務(wù)注冊與發(fā)現(xiàn)
  2. 負(fù)載均衡
  3. 限流 redis 分布式限流如何實現(xiàn)---- Lua腳本進(jìn)行 cas操作
  4. spring中resource 注解和 autowired區(qū)別:
    • Autowired是按類型裝配,而resouce是默認(rèn)按照名稱
    • Resource是jdk的注解,而Autowired是Spring提供的

數(shù)據(jù)庫

  1. timestamp和datetime的區(qū)別,timestamp是4個字節(jié),到2037年,適用于記錄最后修改的時間datetime,與時區(qū)無關(guān),適合原始時間的記錄,且記錄時間無限制,int存儲可以使用between,查詢更快
  2. 如何保證redis和數(shù)據(jù)庫的一致性,刪除緩存失敗的場景:
    • 使用消息隊列,將刪除失敗的消息放入隊列,開啟線程刪除
    • 定于數(shù)據(jù)庫中的binlog日志,在非業(yè)務(wù)中使用binlog來更新redis緩存
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容