- 對Java內存模型的理解,以及在併發中的應用
Java內存模型主要分爲工作內存和主內存,Java內存模型規定所有的變量都存儲在這個主內存中,每個線程有自己的工作內存,工作內存保存了主內存的拷貝,線程中對變量的操作必須在工作內存中,不能直接讀取主內存中的變量。把一個變量從主類存中複製到工作內存中,那就要順序地執行read和load操作,如果要把變量從工作內存中同步到主內存,就要順序的執行store和write操作。
===============================================================================
在併發編程中解決了線程之間如何通信的問題,線程通信有兩種方式,共享內存和消息傳遞。Java內存模型主內存對應共享內存方式。
Java8的內存分代改進,JVM的編譯優化
Java8中取消了方式區這個概念,取而代之的是元空間,使用的是本地內存,其最大的可利用空間是整個系統內存的可用空間。
Java程序最初是通過解釋器來解釋執行的,當程序需要迅速啓動時,解釋器可以發揮作用,省去編譯時間,立即執行;當程序運行後,編譯器把越來越多的代碼編譯成本地代碼,獲得更高的執行效率。HotSpot虛擬機中內置了兩個即時編譯器c1和c2,主要的優化技術有:
===============================================================================
公共子表達式消除
如果一個子表達式已經計算過了,並且在整個表達式中沒有變化,那這個表達式就成爲了公共表達式,類似於數學中等量替換。
===============================================================================
數組邊界檢查消除
編譯器通過數據流分析可以判斷這個循環變量的取值永遠在數組長度以內,那麼整個循環中就可以把這個邊界檢查消除
===============================================================================
方法內聯
能夠去除方法調用的成本
=============================================
逃逸分析
分析對象動態作用域,當這個對象不會被外面的方法或者進程引用,可以爲這個對象引入(棧上分配、同步消除、標量替換)手段
分析線程池中的實現原理和線程的調度過程
實現原理
1)線程池判斷核心線程池裏的線程是否都在執行任務。如果不是,則創建一個新的工作
線程來執行任務。如果核心線程池裏的線程都在執行任務,則進入下個流程。
2線程池判斷工作隊列是否已經滿。如果工作隊列沒有滿,則將新提交的任務存儲在這
個工作隊列裏。如果工作隊列滿了,則進入下個流程。
3)線程池判斷線程池的線程是否都處於工作狀態。如果沒有,則創建一個新的工作線程
來執行任務。如果已經滿了,則交給飽和策略來處理這個任務
調度原理
ThreadPoolExecutor執行execute方法分下面4種情況。
1)如果當前運行的線程少於corePoolSize,則創建新線程來執行任務(注意,執行這一步驟
需要獲取全局鎖)。
2)如果運行的線程等於或多於corePoolSize,則將任務加入BlockingQueue。
3)如果無法將任務加入BlockingQueue(隊列已滿),則創建新的線程來處理任務(注意,執行這一步驟需要獲取全局鎖)。
4)如果創建新線程將使當前運行的線程超出maximumPoolSize,任務將被拒絕,並調用
RejectedExecutionHandler.rejectedExecution()方法。
在工作中遇到哪幾種設計模式,是怎麼應用的
在工作中有一個需求是將集中器和設備入網需要對相應的信息做記錄並存儲到數據庫中,設備入網過程中每發送一幀控制指令要等待底層相應再繼續發送下一個指令,將處理請求、發送指令、等待響應這三個步驟用責任鏈模式重構。
Redis持久化的幾種方式
RDB快照和AOF日誌
AOF文件的更新頻率通常比RDB文件的更新頻率更高,AOF日誌保存redis服務器所執行的寫命令來記錄數據庫的狀態的,RDB快照保存的是一個狀態值。如果開啓了AOF持久化功能,則服務器會優先使用AOF文件來還原數據庫的狀態。只有在AOF持久化功能關閉時,服務器纔會使用RDB文件來還原數據庫狀態。
Redis 和 Memcached 和mongodb的區別
redis和memcached都是用作緩存,mongodb用作文檔的存儲。redis是一個存儲在內存中,擁有比memcached更豐富的數據類型。redis單線程的,memcached是多線程的。redis支持多路IO複用,支持持久化操作,memcached不支持持久化操作。
Synchronized和Lock的區別
Synchronized是Java中的關鍵字,在JVM層面上;可以判斷鎖的狀態;鎖的類型包括可重入鎖、非公平;Lock是一個類,在finally中必須釋放鎖,可以判斷鎖的狀態,鎖的類型中包括可重入鎖,可公平鎖。
數據庫索引的實現,B+樹的結構和操作,爲什麼不用紅黑樹
索引一般是放在磁盤中的,索引是存儲引擎用於快速找到記錄的一種數據結構,有B+樹、哈希索引等。
B+樹是在B-樹的基礎上改進而來的,B+樹葉子節點存儲數據且葉子節點之間還加了指針形成鏈表,每個節點都可以擁有多(M)個孩子節點,是爲了降低樹的高度,減少查詢時間。索引是存放在磁盤的,內存讀取磁盤中的數據,先讀取B樹的根節點,在接着往下讀取,直到找到那個值。
紅黑樹是二叉樹,紅黑樹一個節點只能存一個值,樹的深度更大,查詢效率更低。
Dubbo的底層實現原理及工作機制
Dubbo是一個由阿里巴巴團隊開源的基於rpc協議的微服務分佈式框架,致力於提供高性能和透明化的RPC遠程服務調用框架採用URL作爲配置信息的統一格式,所有擴展點都通過傳遞URL攜帶配置信息。採用microkernel+plugin模式,microkernel負責組裝plugin。
工作機制:
首先dubbo分爲5個部分:遠程服務運行容器、遠程服務提供者(生產者)、註冊中心、遠程服務調用者(消費者)、監控中心。
- 遠程服務提供者啓動服務,向註冊中心註冊自己提供的服務,
- 遠程服務調用者向註冊中心訂閱自己所需要的服務。
- 註冊中心返回提供者的地址給消費者,如果出現變更的話,會更新變更的數據給消費者
- 消費者從遠程接口列表中,調用遠程接口,dubbo會基於負載均衡算法,選一臺提供者進行調用,如果調用失敗就會選擇另外一臺。
- 消費者和提供者在內存中累計調用次數和時間,定時每分鐘發送一次統計數據到監控中心。