前言:
整理了一些Java基礎流程圖/架構圖,做一下筆記,大家一起學習。
1.spring的生命週期
Spring作為當前Java最流行、最強大的輕量級容器框架,瞭解熟悉spring的生命週期非常有必要;
- 首先容器啟動後,對bean進行初始化
- 按照bean的定義,注入屬性
- 檢測該物件是否實現了xxxAware介面,並將相關的xxxAware例項注入給bean,如BeanNameAware等
- 以上步驟,bean物件已正確構造,通過實現BeanPostProcessor介面,可以再進行一些自定義方法處理。 如:postProcessBeforeInitialzation。
- BeanPostProcessor的前置處理完成後,可以實現postConstruct,afterPropertiesSet,init-method等方法, 增加我們自定義的邏輯,
- 通過實現BeanPostProcessor介面,進行postProcessAfterInitialzation後置處理
- 接著Bean準備好被使用啦。
- 容器關閉後,如果Bean實現了DisposableBean介面,則會回撥該介面的destroy()方法
- 通過給destroy-method指定函式,就可以在bean銷燬前執行指定的邏
2.TCP三次握手,四次揮手
tcp的三次握手四次揮手是每個程式設計師都應該熟悉的。
三次握手:
- 第一次握手(SYN=1, seq=x),傳送完畢後,客戶端進入 SYN_SEND 狀態
- 第二次握手(SYN=1, ACK=1, seq=y, ACKnum=x+1), 傳送完畢後,伺服器端進入 SYN_RCVD 狀態。
- 第三次握手(ACK=1,ACKnum=y+1),傳送完畢後,客戶端進入 ESTABLISHED 狀態,當伺服器端接收到這個包時,也進入 ESTABLISHED 狀態,TCP 握手,即可以開始資料傳輸。
四次揮手:
- 第一次揮手(FIN=1,seq=a),傳送完畢後,客戶端進入 FIN_WAIT_1 狀態
- 第二次揮手(ACK=1,ACKnum=a+1),傳送完畢後,伺服器端進入 CLOSE_WAIT 狀態,客戶端接收到這個確認包之後,進入 FIN_WAIT_2 狀態
- 第三次揮手(FIN=1,seq=b),傳送完畢後,伺服器端進入 LAST_ACK 狀態,等待來自客戶端的最後一個ACK。
- 第四次揮手(ACK=1,ACKnum=b+1),客戶端接收到來自伺服器端的關閉請求,傳送一個確認包,並進入 TIME_WAIT狀態,等待了某個固定時間(兩個最大段生命週期,2MSL,2 Maximum Segment Lifetime)之後,沒有收到伺服器端的 ACK ,認為伺服器端已經正常關閉連線,於是自己也關閉連線,進入 CLOSED 狀態。伺服器端接收到這個確認包之後,關閉連線,進入 CLOSED 狀態。
3.執行緒池執行流程圖
執行緒池:一種執行緒使用模式。執行緒過多會帶來排程開銷,進而影響快取區域性性和整體效能。而執行緒池維護著多個執行緒,等待著監督管理者分配可併發執行的任務,這避免了在處理短時間任務時建立與銷燬執行緒的代價。執行緒池執行流程是每個開發必備的。
執行流程
- 提交一個任務,執行緒池裡存活的核心執行緒數小於執行緒數corePoolSize時,執行緒池會建立一個核心執行緒去處理提交的任務。
- 如果執行緒池核心執行緒數已滿,即執行緒數已經等於corePoolSize,一個新提交的任務,會被放進任務佇列workQueue排隊等待執行。
- 當執行緒池裡面存活的執行緒數已經等於corePoolSize了,並且任務佇列workQueue也滿,判斷執行緒數是否達到maximumPoolSize,即最大執行緒數是否已滿,如果沒到達,建立一個非核心執行緒執行提交的任務。
- 如果當前的執行緒數達到了maximumPoolSize,還有新的任務過來的話,直接採用拒絕策略處理。
JDK提供了四種拒絕策略處理類
- AbortPolicy(丟擲一個異常,預設的)
- DiscardPolicy(直接丟棄任務)
- DiscardOldestPolicy(丟棄佇列裡最老的任務,將當前這個任務繼續提交給執行緒池)
- CallerRunsPolicy(交給執行緒池呼叫所在的執行緒進行處理)
4.JVM記憶體結構
JVM記憶體結構是Java程式設計師必須掌握的基礎。
程式計數器(PC 暫存器)
程式計數器是一塊較小的記憶體空間,可以看作當前執行緒所執行的位元組碼的行號指示器。在虛擬機器的模型裡,位元組碼直譯器工作時就是通過改變這個計數器的值來選取下一條需要執行的位元組碼指令,分支、迴圈、異常處理、執行緒恢復等基礎功能都需要依賴計數器完成。
Java虛擬機器棧
- 與程式計數器一樣,Java虛擬機器棧也是執行緒私有的,它的生命週期與執行緒相同
- 每個方法被執行的時候都會建立一個"棧幀",用於儲存區域性變數表(包括引數)、運算元棧、動態連結、方法出口等資訊。每個方法被呼叫到執行完的過程,就對應著一個棧幀在虛擬機器棧中從入棧到出棧的過程。
- 區域性變數表存放各種基本資料型別boolean、byte、char、short等
本地方法棧
與虛擬機器棧基本類似,區別在於虛擬機器棧為虛擬機器執行的java方法服務,而本地方法棧則是為Native方法服務。
Java堆
- GC堆是java虛擬機器所管理的記憶體中最大的一塊記憶體區域,也是被各個執行緒共享的記憶體區域,在JVM啟動時建立。
- 其大小通過-Xms(最小值)和-Xmx(最大值)引數設定,-Xms為JVM啟動時申請的最小記憶體,-Xmx為JVM可申請的最大記憶體。
- 由於現在收集器都是採用分代收集演算法,堆被劃分為新生代和老年代。新生代由S0和S1構成,可通過-Xmn引數來指定新生代的大小。
- 所有物件例項以及陣列都在堆上分配。
- Class檔案中除了有類的版本、欄位、方法、介面等描述資訊外,還有一項資訊是常量池,用於存放編譯器生成的各種符號引用,這部分內容將在類載入後放到方法區的執行時常量池中。
方法區
- 也稱”永久代” ,它用於儲存虛擬機器載入的類資訊、常量、靜態變數、是各個執行緒共享的記憶體區域。可以通過-XX:PermSize 和 -XX:MaxPermSize 引數限制方法區的大小。
- 執行時常量池:是方法區的一部分,其中的主要內容來自於JVM對Class的載入。
- Class檔案中除了有類的版本、欄位、方法、介面等描述資訊外,還有一項資訊是常量池,用於存放編譯器生成的各種符號引用,這部分內容將在類載入後放到方法區的執行時常量池中。
5.Java記憶體模型
- Java的多執行緒之間是通過共享記憶體進行通訊的,在通訊過程中會存在一系列如可見性、原子性、順序性等問題,而JMM就是圍繞著多執行緒通訊以及與其相關的一系列特性而建立的模型。JMM定義了一些語法集,這些語法集對映到Java語言中就是volatile、synchronized等關鍵字。有興趣可以看看我的另外一篇筆記:www.jianshu.com/p/3c1691aed…
- Java記憶體模型規定了所有的變數都儲存在主記憶體中,每條執行緒還有自己的工作記憶體,執行緒的工作記憶體中儲存了該執行緒中是用到的變數的主記憶體副本拷貝,執行緒對變數的所有操作都必須在工作記憶體中進行,而不能直接讀寫主記憶體。不同的執行緒之間也無法直接訪問對方工作記憶體中的變數,執行緒間變數的傳遞均需要自己的工作記憶體和主存之間進行資料同步進行。
6.springMVC執行流程圖
- User向伺服器傳送request,前端控制Servelt DispatcherServlet捕獲;
- DispatcherServlet對請求URL進行解析,呼叫HandlerMapping獲得該Handler配置的所有相關的物件,最後以HandlerExecutionChain物件的形式返回.
- DispatcherServlet 根據獲得的Handler,選擇一個合適的HandlerAdapter.
- 提取Request中的模型資料,填充Handler入參,開始執行Handler(Controller)
- Handler執行完成後,返回一個ModelAndView物件到DispatcherServlet
- 根據返回的ModelAndView,選擇一個適合的ViewResolver
- ViewResolver 結合Model和View,來渲染檢視
- 將渲染結果返回給客戶端。
7.JDBC執行流程
JDBC執行流程:
- 連線資料來源
- 為資料庫傳遞查詢和更新指令
- 處理資料庫響應並返回的結果
8.spring cloud元件架構
Spring Cloud是一個基於Spring Boot實現的雲原生應用開發工具,它為基於JVM的雲原生應用開發中涉及的配置管理、服務發現、熔斷器、智慧路由、微代理、控制匯流排、分散式會話和叢集狀態管理等操作提供了一種簡單的開發方式。
- Eureka 負責服務的註冊與發現。
- Hystrix 負責監控服務之間的呼叫情況,起到熔斷,降級作用。
- Spring Cloud Config 提供了統一的配置中心服務。
- 所有對外的請求和服務,我們都通過Zuul來進行轉發,起到 API 閘道器的作用
- 最後我們使用 Sleuth+Zipkin 將所有的請求資料記錄下來,方便我們進行後續分析。
- Spring Cloud Ribbon是基於Netflix Ribbon實現的一套客戶端負載均衡的工具。 它是一個基於HTTP和TCP的客戶端負載均衡器。
- Feign是一個宣告式的Web Service客戶端,它的目的就是讓Web Service呼叫更加簡單。
9.dubbo 呼叫
Dubbo是一個分散式服務框架,致力於提供高效能和透明化的遠端服務呼叫方案,這容易和負載均衡弄混,負載均衡是對外提供一個公共地址,請求過來時通過輪詢、隨機等,路由到不同server。
- Provider: 暴露服務的服務提供方。
- Consumer: 呼叫遠端服務的服務消費方。
- Registry: 服務註冊與發現的註冊中心。
- Monitor: 統計服務的呼叫次調和呼叫時間的監控中心。
- Container: 服務執行容器。
10.後續待更新...
個人公眾號
歡迎大家關注,大家一起學習,一起討論。