RPC框架核心學習內容

2021-10-24 05:57:53 字數 3415 閱讀 8785

3. 拒絕策略

動態**

bytebuf

corepoolsize:核心池大小,未達到此引數會建立新的執行緒進行執行。達到此引數限制會放入等待佇列中(小於maximunpoolsize)。

maximumpoolsize:最大能達到的數量限制,阻塞佇列滿且達到最大執行緒數的時候會根據拋棄策略進行丟棄。

keepalivetime:當執行緒數大於核心時,多於的空閒執行緒最多存活時間。

workqueue:當執行緒舒服超過核心執行緒數的時候用於儲存任務的佇列。三種型別:無界佇列、有界佇列、同步移交

threadfactory:執行程式建立新執行緒時使用的工廠。

rejectedexecutionhandler:拒絕策略。提供四種拒絕策略。

其實並不能算無限,這個佇列的預設大小是integer.maxvalue。newfixedthreadpool會採用此種佇列。當任務耗時較長的時候,會無限在佇列中建立等待任務,堆積大量的請求。可能會溢位造成oom。大量任務被新增到這個無界佇列中,會導致cpu和記憶體飆公升導致伺服器掛掉。

fifo原則的 arraybolckingqueue 和優先順序佇列 priorityblockingqueue(優先順序由任務的 comparator 決定)。

執行緒池較小、有界佇列較大時可減少記憶體消耗,降低cpu使用率和上下文切換,但是會限制系統吞吐量,可能會導致部分任務被丟失。

不是一種真正的佇列,時一種執行緒間的移交機制。要將乙個佇列放入一種,必須要另乙個執行緒正在等待接受這個元素。只有在使用無界線程池(newcachedthreadpool)或者由飽和策略的時候才建議使用該佇列。

newcachedthreadpool的概念就是需要乙個執行緒接受才能使任務順利進入佇列,否則的話就需要新啟乙個執行緒(剛開始的時候也就是會新建立執行緒後才會開始進行處理)。最大執行緒大小是integer.maxvalue。任務太多時會建立大量的執行緒,可能會造成oom。

所以阿里的規範裡面不建議使用executor,建議使用threadpoolexecutor自己建立。

預設飽和策略。飽和時會丟擲 rejectedexecutionexception(runtimeexception),可捕獲異常處理。

不做任何處理,直接拋棄任務

拋棄最老任務。拋棄掉佇列頭部的元素,再嘗試提交任務。

如果使用的是優先順序佇列會導致優先順序最高的任務被拋棄,不建議配合使用。

使用呼叫者的執行緒來執行此任務。執行此任務期間無法提交新的任務。

使用反射進行建立,被**類需實現 invocationhandler 介面

method method = serviceclass.

getmethod

(methodname, parametertypes)

;method.

setaccessible

(true);

return method.

invoke

(servicebean, parameters)

;

cglib動態**執行**方法效率之所以比jdk的高是因為cglib採用了fastclass機制,它的原理簡單來說就是:為**類和被**類各生成乙個class,這個class會為**類或被**類的方法分配乙個index(int型別)。

這個index當做乙個入參,fastclass就可以直接定位要呼叫的方法直接進行呼叫,這樣省去了反射呼叫,所以呼叫效率比jdk動態**通過反射呼叫高。

fastclass servicefastclass = fastclass.

create

(serviceclass)

;// 其實這裡裡面也是使用的 index 來呼叫的,兩者沒有區別

fastmethod servicefastmethod = servicefastclass.

getmethod

(methodname, parametertypes)

;return servicefastmethod.

invoke

(servicebean, parameters)

;//fastclass 使用methodindex呼叫

int methodindex = servicefastclass.

getindex

(methodname, parametertypes)

;return servicefastclass.

invoke

(methodindex, servicebean, parameters)

;

// test2 是 test 的 fastclass

class

test

public

voidg(

)}class

test2

return null;

}public

intgetindex

(string signature)

return-1

;}}

1.jdk動態**是實現了被**物件的介面,cglib是繼承了被**物件。

2.jdk和cglib都是在執行期生成位元組碼,jdk是直接寫class位元組碼,cglib使用asm框架寫class位元組碼,cglib**實現更複雜,生成**模擬jdk效率低。

3.jdk呼叫**方法,是通過反射機制呼叫,cglib是通過fastclass機制直接呼叫方法,cglib執行效率更高。

這個是nio原生api中的內容,主要有四個內容:

capacity:bytebuffer的容量。

mark:自定義的標記位置

寫入的時候position會表示當前的寫入位置。

通過flip切換的讀寫模式的時候,會將position放入頭部,將limit放入position之前的位置。

如果未讀取完,會把沒有讀取的拷貝到最開始,然後接著後面的位置開始寫入。

缺點:

只有乙個position指標標記位置,所以使用的時候讀寫切換需要呼叫 flip() 方法。使用不方便。

不支援動態擴容,如果之前建立的大小不滿足我們的使用需求,則需要手動的重新建立。

對比 bytebuffer 只有乙個position 指標,bytebuf有兩個指標 readindex 和 writeindex,分別時讀指標和寫指標,可以直接進行讀寫。

如果超過容量大小,會自動擴容。(閾值4m)

Linux核心學習

交叉工具鏈 核心相關知識 linux系統的構成 使用者空間 核心空間 思考 為什麼劃分為兩個層次?目的其實是為保護作業系統,防止應用程式的異常導致作業系統崩潰。核心空間與使用者空間是程式執行的兩種不同狀態,通過系統呼叫和硬體中斷能夠完成從使用者空間到核心空間的轉移。那麼linux的核心由哪些構成呢?...

linux 核心學習

linux核心獲取 官網 linux作業系統的核心是模組化,可以使用lsmod命令檢視核心模組,下面展示已載入系統的模組 root 172.16.0.55 vendor composer test lsmod module size used by nfnetlink queue 8111 0 nf...

RT Thread核心學習

一 概述 二 執行緒的組成 2.1 執行緒 入口函式 2.2 執行緒控制塊 2.3 執行緒棧 三 執行緒相關的api 3.1 執行緒的建立 3.2 狀態的切換 四 注意事項與補充 4.1 動態建立與靜態建立的優缺點比較?4.2 系統滴答時鐘頻率的選取 4.3 執行緒棧大小分配的小策略 4.4 執行緒...