當前位置:網站首頁>我的JVM(四),我的華為面試經曆分享
我的JVM(四),我的華為面試經曆分享
2021-08-20 04:33:13 【程序小茉莉】
???
? ?各級緩存耗時對比:
???
? ?采用分層緩存的層次結構會帶來數據不一致問題,如下圖:
???
? ?那麼如何保證數據的一致性,現代CPU處理辦法有兩種:
? ?(1) 鎖系統總線;
? (2) 利用緩存一致性協議MESI(Intel處理器用的比較多,還有很多其他的緩存一致性協議),大致結構如下圖:
?
?2. CPU的亂序執行
??CPU中有個亂序執行的概念,概念圖如下:
CPU在執行指令的時候,往往不是順序執行,但是會遵守as-if-serial原則,也就是最終一致性原則。CPU為了提高指令執行效率,會在一條指令執行過程中(比如去內存讀數據),去同時執行另一條指令,前提是這兩條指令沒有依賴關系。雖然指令執行順序發生改變,但是不會影響單線程執行結果。多線程情况下為了不讓CUP進行指令重排序,則需要用到Volatile關鍵字,因為Volatile的重要作用之一就是防止指令重排序。
?CPU還會存在合並寫的現象。當第一條指令往上級緩存寫入數據時,由於上級緩存訪問速度比較慢,可能第二條指令又對上一條指令的結果進行了修改,那麼CPU將這兩條指令合並的最終結果一次性的寫入到緩存中,這就成為合並寫。
?3. 如何保證不亂序執行
(1) 內存屏障:java采用的是內存屏障,內存屏障其實就是一個CPU指令,在硬件層面上來說可以扥為兩種:Load Barrier 和 Store Barrier即讀屏障和寫屏障。主要有兩個作用:
???a. 阻止屏障兩側的指令重排序;
???b. 强制把寫緩沖區/高速緩存中的髒數據等寫回主內存,讓緩存中相應的數據失效。
在JVM層面上來說作用與上面的一樣有一個JSR內存屏障,種類可以分為四種:
?
java底層實現Volatile的禁止指令重排序,也就是JVM會遵循自身的原則,對不同情况的指令添加不同類型的JSR內存屏障。
?上述只是再JVM中的實現,那麼在系統底層是如何實現的呢?現在大多數的CPU都在底層有指令支持內存屏障的(不同的CUP的內存屏障指令會不一樣,並且邏輯上也可能有區別),一共有3條CPU原語( 所謂原語,一般是指由若幹條指令組成的程序段,用來實現某個特定功能,在執行過程中不可被中斷),如下圖:
?
?那麼那些沒有CPU原語來支持內存屏障的CPU又怎麼實現呢,那就需要對總線進行加鎖來實現。所以JVM中的內存屏障在不同的CUP中的實現方式是不一樣的,一般是CPU原語支持,特殊情况下就是鎖總線。
(2) volatile的實現細節
???a. 字節碼層面:編譯成class文件後,變量的前面就有了一個修飾符valatile,是寫在了二進制文件中的,如下圖(結合class文件結構來看):
?
?b. jvm層面:對於所有volatile修飾的這塊內存的寫操作前加了一個StoreStoreBarrier,後面加了一個StoreLoadBarrier;這塊內存的讀操作前加了一個LoadLoadBarrier,後面加了一個LoadStoreBarrier。內存屏障兩邊的指令禁止重排序,來保證這塊內容的讀寫不受CUP重排序的影響。如下圖:
最後在出來放一波福利吧!希望可以幫助到大家!
千千萬萬要記得:多刷題!!多刷題!!
之前算法是我的硬傷,後面硬啃了好長一段時間才補回來,算法才是程序員的靈魂!!!!
篇幅有限,以下只能截圖分享部分的資源!!
(1)多線程(這裏以多線程為代錶,其實整理了一本JAVA核心架構筆記集)
(2)刷的算法題(還有左神的算法筆記)
(3)面經+真題解析+對應的相關筆記(很全面)
(4)視頻學習(部分)
ps:當你覺得學不進或者累了的時候,視頻是個不錯的選擇
其實以上我所分享的所有東西,有需要的話我這邊可以免費分享給大家,但請一定記住獲取方式: 點擊這裏前往免費獲取
在這裏,最後只一句話:祝大家offer拿到手軟!!
版權聲明
本文為[程序小茉莉]所創,轉載請帶上原文鏈接,感謝
https://cht.chowdera.com/2021/08/20210820043312891r.html
邊欄推薦
猜你喜歡
隨機推薦
- uniapp上傳圖片及組件傳值
- 瑞利年金險資金保障安全嗎?收益高不高啊?
- 華為手機USB連不上電腦的解决方法
- Flutter 2,移動金融應用開發
- 關於st25系列NFC標簽簡單介紹及st25TV系列用於門禁讀取時的注意事項總結
- 關於用ffmpeg轉手機視頻發現視頻長寬倒了的問題
- 函數 / 類模板--模板2
- 數組中的第k個最大的元素--優先級隊列、排序、堆、排序
- 單片機實例27——ADC0809A/D轉換器基本應用技術(硬件電路圖+匯編程序+C語言程序)
- Collection集合的學習
- 一場面試結束,某度員工從事Android 5年為何還是初級工程師?
- 3本書閱讀筆記【人月神話-Go語言實戰-研發能力持續成長路線】01
- PHP垃圾回收機制
- 【電子技術】什麼是LFSR?
- 死鎖?如何定比特到死鎖?如何修複死鎖?(jps和jstack兩個工具)
- 快樂寒假 22/01/20
- image
- 噴程序員?SURE?
- LDO分壓電阻計算小工具
- 面試之求一串字符串中每個字符的出現次數
- 【ISO15765_UDS&OBD診斷】-01-概述
- 【Mysql上分之路】第九篇:Mysql存儲引擎
- RHCE 第一次作業
- 2021.10.16我的第一篇博客:一切皆有可能!
- CTA-敏感行為-讀取IMEI
- 面試被問怎麼排查平時遇到的系統CPU飆高和頻繁GC,該怎麼回答?
- nuxt項目總結-綜合
- 自然語言處理學習筆記(一)
- C語言第一課
- 各比特大佬,Spark的重點難點系列暫時更新完畢
- 基於 esbuild 的 universal bundler 設計
- XCTFre逆向(四):insanity
- 理解什麼是真正的並發數
- JVM腦圖
- 【Pytorch(四)】學習如何使用 PyTorch 讀取並處理數據集
- 函數棧幀的創建與銷毀
- 構建神經網絡- 手寫字體識別案例
- 多模態生成模型ERNIE-VILG
- kotlin不容忽視的小細節
- 備戰一年,終於斬獲騰訊T3,我堅信成功是可以複制的