疏漏總結(十一)

  1. 什麼是Java的快速失敗和安全失敗?

快速失敗:兩個線程,A去讀一個集合的內容,B去update相同集合的內容,會報ConcurrentModificationException。
原因是:集合框架內部針對每個元素有一個modCount,如果元素的值改變,modCount也會改變,如果我們使用hashNext()/next()遍歷到了modCount改變的元素(每次迭代都會先比較是否爲自己心儀的modCount),就會報錯。

安全失敗:拷貝原集合,然後再迭代。
原理:由於迭代時是對原集合的拷貝進行遍歷,所以在遍歷過程中對原集合所作的修改並不能被迭代器檢測到,CopyOnWriteArrayList就是這個道理(JUC下全部爲安全失敗)

  1. time_wait和close_wait

TIME_WAIT 是主動關閉鏈接時形成的,等待2MSL時間,約4分鐘。主要是防止最後一個ACK丟失。 由於TIME_WAIT 的時間會非常長,因此server端應儘量減少主動關閉連接。

CLOSE_WAIT是被動關閉連接是形成的。根據TCP狀態機,服務器端收到客戶端發送的FIN,則按照TCP實現發送ACK,因此進入CLOSE_WAIT狀態。

  1. cms執行的過程

3.1 初始標記(stop the world):該階段進行可達性分析,標記GC ROOT能直接關聯到的對象。

3.2 併發標記:該階段進行GC ROOT TRACING,在第一個階段被暫停的線程重新開始運行。由前階段標記過的對象出發,所有可到達的對象都在本階段中標記。

3.3 併發預清理:此階段標記從新生代晉升的對象、新分配到老年代的對象以及在併發階段被修改了的對象。

3.4 重標記(stop the world):暫停所有用戶線程,重新掃描堆中的對象,進行可達性分析,標記活着的對象。有了前面的基礎,這個階段的工作量被大大減輕,停頓時間因此也會減少。注意這個階段是多線程的。

3.5 併發清理:用戶線程被重新激活,同時清理那些無效的對象。

3.6 重置:CMS清除內部狀態,爲下次回收做準備。

  1. HashMap總結點達到64且長度到8變成紅黑樹

  2. finalize

首先,大致描述一下finalize流程:當對象變成(GC Roots)不可達時,GC會判斷該對象是否覆蓋了finalize方法,若未覆蓋,則直接將其回收。否則,若對象未執行過finalize方法,將其放入F-Queue隊列,由一低優先級線程執行該隊列中對象的finalize方法。執行finalize方法完畢後,GC會再次判斷該對象是否可達,若不可達,則進行回收,否則,對象“復活”。

  1. epoll與select模型

select的效率低於epoll,因爲它需要大量拷貝fd_set,並且需要不斷遍歷監聽列表,而epoll這種基於響應事件的方式明顯會更具優勢。

調用epoll_create時,做了以下事情:

內核幫我們在epoll文件系統裏建了個file結點;
在內核cache裏建了個紅黑樹用於存儲以後epoll_ctl傳來的socket;
建立一個list鏈表,用於存儲準備就緒的事件。

調用epoll_ctl時,做了以下事情:

把socket放到epoll文件系統裏file對象對應的紅黑樹上;
給內核中斷處理程序註冊一個回調函數,告訴內核,如果這個句柄的中斷到了,就把它放到準備就緒list鏈表裏。

調用epoll_wait時,做了以下事情:

觀察list鏈表裏有沒有數據。有數據就返回,沒有數據就sleep,等到timeout時間到後即使鏈表沒數據也返回。而且,通常情況下即使我們要監控百萬計的句柄,大多一次也只返回很少量的準備就緒句柄而已,所以,epoll_wait僅需要從內核態copy少量的句柄到用戶態而已。

同時監聽多個socket的。假設我們需要監聽的讀套接字read[],它作爲參數傳遞進了select函數。

select(fd_set read[],fd_set [],fd_set [],timeout)

1.從用戶空間拷貝fd_set到內核空間,也即從當前程序拷貝fd_set數組進內核,fd_set是什麼可以參考百度百科,簡單的說,是可以對socket進行操作的long型數組。

2.對所有的fd進行一次poll操作,即把當前進程掛載到fd上。

3.poll操作過程中select會喚醒所有的隊列中節點,進行遍歷,得到它們的掩碼(不同的掩碼錶示不同的就緒狀態)。

4.如果所有設備返回的掩碼都沒有顯示任何的事件觸發,就去掉回調函數的函數指針,進入有限時的睡眠狀態,再恢復和不斷做poll,再作有限時的睡眠,直到其中一個設備有事件觸發爲止。

5.只要有事件觸發,系統調用返回,將fd_set從內核空間拷貝到用戶空間,回到用戶態,用戶就可以對相關的fd作進一步的讀或者寫操作了。

  1. b+ b

1.B+樹的非葉子節點不記錄數據本身,只記錄引用的連接,並且結點中僅含有其子樹中的最大(或最小)關鍵字。基於此特點,B+樹在非葉子節點的文件會非常小;

2.B+樹的所有的葉子結點中包含了全部關鍵字的信息;

3.B+樹的每個葉子節點都有指向相鄰的下一個兄弟葉子節點的指針且葉子結點本身依關鍵字的大小自小而大順序鏈接。基於此特點,B+樹在範圍查詢上的效率比B樹高了很多;

4.這條區別是有爭議的,有人說B+樹的節點中關鍵字和子節點個數相同,也有人說B+樹和B樹一樣關鍵字比子節點少一個。

  1. SpringMVC執行的過程

1.用戶發送請求至前端控制器DispatcherServlet
2.DispatcherServlet收到請求調用處理器映射器HandlerMapping。
3.處理器映射器根據請求url找到具體的處理器,生成處理器執行鏈HandlerExecutionChain(包括處理器對象和處理器攔截器)一併返回給DispatcherServlet。
4.DispatcherServlet根據處理器Handler獲取處理器適配器HandlerAdapter執行HandlerAdapter處理一系列的操作,如:參數封裝,數據格式轉換,數據驗證等操作
5.執行處理器Handler(Controller,也叫頁面控制器)。
6.Handler執行完成返回ModelAndView
7.HandlerAdapter將Handler執行結果ModelAndView返回到DispatcherServlet
8.DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
9.ViewReslover解析後返回具體View
10.DispatcherServlet對View進行渲染視圖(即將模型數據model填充至視圖中)。
11.DispatcherServlet響應用戶。

  1. 如何進行TCP擁塞控制的

擁塞控制是作用於網絡的,它是防止過多的數據注入到網絡中,避免出現網絡負載過大的情況;常用的方法就是:( 1 )慢開始、擁塞避免( 2 )快重傳、快恢復。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章