告別漫長GC停頓:深入解析G1如何實現可預測的毫秒級響應
G1(Garbage-First)垃圾(ji)(ji)回收(shou)(shou)器(qi)是(shi)(shi)一款面向服務(wu)端應(ying)用、為大內(nei)存和多處理器(qi)系(xi)統設(she)計(ji)(ji)的革命性垃圾(ji)(ji)回收(shou)(shou)器(qi)。G1的核心設(she)計(ji)(ji)目標是(shi)(shi)在(zai)滿足高吞吐量的同時(shi)(shi),建立一個“可(ke)(ke)預測的停頓時(shi)(shi)間模型”(Pause-Time Model),讓使(shi)用者可(ke)(ke)以明確指(zhi)定在(zai)一個長度為M毫(hao)秒的時(shi)(shi)間片段(duan)內(nei),消耗在(zai)垃圾(ji)(ji)回收(shou)(shou)上(shang)的時(shi)(shi)間大 ...
吞吐量、延遲、內存:深入理解垃圾回收的“三元悖論”
垃(la)圾回(hui)收算法的(de)(de)評價標(biao)準:吞吐(tu)量、延遲(chi)、內存,孰輕(qing)孰重? 評估和(he)選擇(ze)垃(la)圾回(hui)收器時(shi),不存在一體通用的(de)(de)最優解。不同的(de)(de)應用場景(jing)對(dui)性(xing)能的(de)(de)要(yao)(yao)求截然不同,因此需(xu)要(yao)(yao)通過一套標(biao)準化的(de)(de)指(zhi)標(biao)來(lai)衡量垃(la)圾回(hui)收算法的(de)(de)特性(xing)。通常(chang),關(guan)注三個主要(yao)(yao)的(de)(de)、且相互制約的(de)(de)評價指(zhi)標(biao):吞吐(tu)量(Throughput)、最大暫停時(shi)間(Max Paus ...
不止新生代與老年代:深入Java虛擬機堆內存布局與TLAB、卡表等優化機制
Java虛(xu)擬(ni)(ni)機運(yun)行(xing)數(shu)據區(qu)(qu)域(yu) 在JDK 8及以(yi)(yi)上(shang)版本中,Java虛(xu)擬(ni)(ni)機運(yun)行(xing)時(shi)數(shu)據區(qu)(qu)域(yu)主要(yao)(yao)包括以(yi)(yi)下部分: 1)堆(Heap):這是Java虛(xu)擬(ni)(ni)機中最(zui)大的內(nei)存區(qu)(qu)域(yu),所(suo)有線程共(gong)享,主要(yao)(yao)用于(yu)存放對(dui)象實(shi)例(li)和(he)數(shu)組。這也是垃圾回收的主要(yao)(yao)區(qu)(qu)域(yu),因(yin)此(ci)也被稱(cheng)作GC堆(Garbage Collection Heap)。 2 ...
為什么我的應用會卡頓?垃圾回收中的STW難題與破解之道
垃圾回(hui)(hui)收算(suan)法(fa):清除、壓縮、復制 可達性(xing)分析提供了一種有(you)效的(de)方式,來標記哪(na)(na)些(xie)對(dui)(dui)象死(si)亡,哪(na)(na)些(xie)對(dui)(dui)象還存活(huo)。然而(er),確定(ding)哪(na)(na)些(xie)對(dui)(dui)象死(si)亡可以(yi)(yi)被(bei)(bei)回(hui)(hui)收,只是(shi)(shi)垃圾回(hui)(hui)收的(de)第一步, 這個過程通(tong)常(chang)被(bei)(bei)稱為標記(Mark)。接下來,需(xu)要一種方法(fa)來回(hui)(hui)收這些(xie)死(si)亡對(dui)(dui)象占用(yong)的(de)內存,以(yi)(yi)便這些(xie)內存可以(yi)(yi)被(bei)(bei)重新使用(yong)。這就是(shi)(shi)垃圾回(hui)(hui)收算(suan)法(fa)的(de)任(ren)務。 ...
誰生?誰死?從引用計數到可達性分析,洞悉GC的決策邏輯
引用(yong)計數與可(ke)達性(xing)分(fen)析:誰死(si)了,誰還活著? 垃圾回收,顧名(ming)思義,便(bian)是將已經分(fen)配(pei)出去的(de),但卻不再使用(yong)的(de)內(nei)存(cun)回收回來,以便(bian)能夠再次分(fen)配(pei)。在Java虛擬機的(de)語境下(xia),垃圾指的(de)是死(si)亡的(de)對象所占據的(de)堆空間。這(zhe)里便(bian)涉及了一(yi)個(ge)關鍵的(de)問題:如何辨別(bie)一(yi)個(ge)對象是存(cun)是亡? 引用(yong)計數 引用(yong)計數(Reference Counti ...
壓縮指針:64位系統下,Java虛擬機是如何“偷”回4字節內存的?
Java對(dui)(dui)象(xiang):在內(nei)存(cun)中(zhong)(zhong)的真面目 在Java中(zhong)(zhong),通過new關鍵字創建一個Java類的實例(li)對(dui)(dui)象(xiang)時(shi),該對(dui)(dui)象(xiang)會通過碰撞指針方式存(cun)儲在內(nei)存(cun)的堆(dui)中(zhong)(zhong),并被分配一個內(nei)存(cun)地址。在Java虛擬機(ji)中(zhong)(zhong),一個Java對(dui)(dui)象(xiang)由對(dui)(dui)象(xiang)頭(tou)(Object Header)、實例(li)數(shu)據(Instance Data)和對(dui)(dui)齊填充(Padding) ...
JWT令牌
該筆記介紹(shao)SpringBoot中(zhong)JWT令牌(pai)的使用,內容涵(han)蓋(gai)Maven依賴坐(zuo)標配置(zhi)、JWT生成方法(設置(zhi)算法、自定(ding)義(yi)聲(sheng)明(ming)、簽名(ming)及過期時間(jian))、JWT解析驗證(驗證簽名(ming)、過期時間(jian)等)以及配置(zhi)映(ying)射(YAML配置(zhi)與JwtProperties類實現(xian)配置(zhi)管理),并提供了完整的Java代碼實現(xian)示例(li)。 ...
為什么Java/Python程序無需關心內存釋放?揭秘垃圾回收(GC)的核心概念
在(zai)(zai)Java的(de)編(bian)程世界里,開發(fa)者(zhe)既無需也無法(fa)像C/C++那樣(yang)手動(dong)調(diao)用malloc/free來管理內存(cun)的(de)分配與回收,這(zhe)一核心任(ren)務完全由Java虛擬機在(zai)(zai)幕后自(zi)動(dong)完成。這(zhe)種自(zi)動(dong)化(hua)設計極大地簡化(hua)了編(bian)碼,將開發(fa)者(zhe)從(cong)繁(fan)瑣(suo)且極易出(chu)錯(cuo)的(de)內存(cun)管理中解放出(chu)來。然而,這(zhe)種便利性的(de)背后隱藏著一個經典且復雜的(de)難題:一個動(dong)態運行 ...
jemalloc思想的極致演繹:深度解構Netty內存池的精妙設計與實現
內存(cun)(cun)分(fen)配(pei)(pei) Netty內存(cun)(cun)池的核(he)心設計借鑒了jemalloc的設計思(si)想。jemalloc是由Jason Evans在FreeBSD項目中實現的高性能內存(cun)(cun)分(fen)配(pei)(pei)器,其核(he)心優(you)勢在于(yu)通(tong)過細粒度內存(cun)(cun)塊劃(hua)分(fen)與多層級緩存(cun)(cun)機制(zhi),降低內存(cun)(cun)碎(sui)片率并優(you)化高并發場(chang)景下的內存(cun)(cun)分(fen)配(pei)(pei)吞(tun)吐量。 Netty基于(yu)jemalloc的多Ar ...
“化零為整”的智慧:內存池如何繞過系統調用和GC,構建性能的護城河
內(nei)存(cun)池:精打細算的(de)內(nei)存(cun)管(guan)家 在高(gao)性能系統(tong)(如(ru)網(wang)絡服(fu)務器(qi))的(de)極致優化中,當處理器(qi)和I/O的(de)瓶頸被逐一攻克(ke)后,內(nei)存(cun)管(guan)理便(bian)成為決(jue)定系統(tong)延遲和吞吐量的(de)最后一道,也是(shi)最關(guan)鍵的(de)一道關(guan)隘。傳統(tong)的(de)內(nei)存(cun)分配方式在這種場景(jing)下顯得力不從心,催生了通過內(nei)存(cun)池(Memory Pool)作為管(guan)理策略。 在C/C++或Java等 ...
職責分離的藝術:剖析主從Reactor模型如何實現極致的并發性能
Reactor單線(xian)程模型 在Reactor單線(xian)程模型中,所謂的“單線(xian)程”主要針對(dui)I/O操作而言,即所有的I/O操作(如accept()、read()、write()和connect())都(dou)在同一個(ge)線(xian)程上完成。然而,在當前的單線(xian)程Reactor模型中,不(bu)僅I/O操作由(you)Reactor線(xian)程處理,非I/O的 ...
從C10K到Reactor:事件驅動,如何重塑高并發服務器的網絡架構
事件驅動(dong) 事件驅動(dong)(Event Driven)是一(yi)種核心的編程(cheng)范(fan)式,其(qi)根本特征是控制(zhi)反轉(zhuan)(zhuan)(Inversion of Control,IoC)。在這(zhe)種模型中,程(cheng)序的執行(xing)流不再由代(dai)碼的順序調用決定,而是由一(yi)系列異步發生的事件來驅動(dong)。應(ying)用程(cheng)序的角(jiao)色(se)從主動(dong)輪詢(xun)或等待,轉(zhuan)(zhuan)變為(wei)被(bei)動(dong)地對事件做出(chu)響應(ying),這(zhe)構(gou)成了現代(dai) ...
單線程如何撐起百萬連接?I/O多路復用:現代網絡架構的基石
I/O多路復用(I/O Multiplexing)是(shi)一(yi)種允許單個線(xian)程(cheng)同(tong)時監視多個文件(jian)描(miao)述符的(de)(de)I/O模型。其核(he)心價值在(zai)于,它將應用程(cheng)序(xu)從低效(xiao)的(de)(de)I/O等待中解放出(chu)來,實(shi)現(xian)了“一(yi)次等待,響應多個事(shi)件(jian)”的(de)(de)高效(xiao)并(bing)發(fa)模式(shi)。 要(yao)(yao)理解其優勢,需要(yao)(yao)對比(bi)非(fei)阻(zu)(zu)塞(sai)I/O的(de)(de)局限性。雖然非(fei)阻(zu)(zu)塞(sai)I/O能避免線(xian)程(cheng)在(zai)數據未(wei)就緒時阻(zu)(zu)塞(sai) ...
你的程序為何卡頓?從LINUX I/O三大模式尋找答案
I/O交互(hu)流程 在(zai)LINUX中(zhong),內(nei)核空(kong)(kong)(kong)間(jian)和用(yong)(yong)戶(hu)空(kong)(kong)(kong)間(jian)都位于虛(xu)擬(ni)內(nei)存中(zhong)。LINUX采用(yong)(yong)兩級(ji)保護機制:0級(ji)供內(nei)核使(shi)用(yong)(yong),3級(ji)供用(yong)(yong)戶(hu)程序使(shi)用(yong)(yong)。每(mei)個進程都有獨立的用(yong)(yong)戶(hu)空(kong)(kong)(kong)間(jian)(0~3G),對其他進程不可(ke)見,而最高的1G虛(xu)擬(ni)內(nei)核空(kong)(kong)(kong)間(jian)則由所有進程和內(nei)核共享(xiang)。 操作系統和驅動程序運行(xing)在(zai)內(nei)核空(kong)(kong)(kong)間(jian),應用(yong)(yong)程序運行(xing)在(zai)用(yong)(yong)戶(hu)空(kong)(kong)(kong)間(jian)。由 ...
“一切皆文件”:揭秘LINUX I/O與虛擬內存的底層設計哲學
RPC框架(jia)如同(tong)構建服(fu)務(wu)大廈的(de)(de)神經網(wang)絡,承擔著海量服(fu)務(wu)間通(tong)信的(de)(de)重(zhong)任。它(ta)優雅(ya)地(di)屏蔽了底層網(wang)絡通(tong)信的(de)(de)復雜性,使(shi)開發者能(neng)聚焦于(yu)業務(wu)邏(luo)輯的(de)(de)創(chuang)造。然而(er),在這份(fen)優雅(ya)之下,RPC框架(jia)的(de)(de)網(wang)絡模型設(she)計卻是決定系統吞吐(tu)量、延遲(chi)和資(zi)源(yuan)利用(yong)率的(de)(de)命脈,其核心在于(yu)在有限的(de)(de)硬件資(zi)源(yuan)與無限的(de)(de)數(shu)據洪(hong)流之間,建立一座高效、動態(tai)的(de)(de)橋梁。 ...
Goroutine間的“靈魂管道”:Channel如何實現數據同步與因果傳遞?
Channel是連接Goroutine的“管(guan)道”,是CSP理(li)念在Golang中(zhong)的具(ju)象化實(shi)現。它不(bu)僅(jin)是數(shu)據傳遞的隊列,更是Goroutine間同步的天然工(gong)具(ju),讓(rang)開發者無需訴諸顯式的鎖或條件變(bian)量。 func main() { ch := make(chan int, 1) // 創(chuang)建一個(ge)int,緩沖區大 ...
“不要通過共享內存來通信”——深入理解Golang并發模型與CSP理論
Golang 在設(she)計(ji)上另辟蹊徑,其并發哲學的核心信(xin)條是:“不(bu)要通(tong)過共享(xiang)內(nei)存來通(tong)信(xin),而(er)要通(tong)過通(tong)信(xin)來共享(xiang)內(nei)存。” (Do not communicate by sharing memory; instead, share memory by communicating.) 這(zhe)一理(li)念(nian)源自通(tong)信(xin)順序進(jin)程(Co ...
Ros2_control淺析——一個機器人開發通用框架的結構(1)
引言: 最近在(zai)開(kai)發(fa)一(yi)個(ge)(ge)(ge)送餐機器人(ren),但是(shi)(shi)在(zai)電機和ros2系統交互時犯了(le)難,不(bu)知道(dao)該怎么寫才能讓(rang)系統架(jia)(jia)構清晰(xi)一(yi)些,后來了(le)解(jie)到(dao)ros2社區有一(yi)個(ge)(ge)(ge)規范的(de)(de)開(kai)發(fa)框架(jia)(jia),所以我(wo)會結合個(ge)(ge)(ge)人(ren)理解(jie)來分析一(yi)下這個(ge)(ge)(ge)架(jia)(jia)構,算是(shi)(shi)我(wo)的(de)(de)學(xue)習筆(bi)記吧,希望(wang)能夠對您有幫(bang)助! ros2_control是(shi)(shi)什么 ros2_control 是(shi)(shi)一(yi)個(ge)(ge)(ge) ...
揭秘JUC:volatile與CAS,并發編程的兩大基石
JUC(java.util.concurrent)并(bing)(bing)發(fa)包(bao),作為Java語言并(bing)(bing)發(fa)編(bian)程的(de)利器,由并(bing)(bing)發(fa)編(bian)程領域的(de)泰(tai)斗道格·利(Doug Lea)精心打(da)造(zao)。它提供了(le)一系列高效、線程安全的(de)工具類、接口及原子類,極大地簡化了(le)并(bing)(bing)發(fa)編(bian)程的(de)開發(fa)流程與管理復雜度。 JUC并(bing)(bing)發(fa)包(bao)與happens-before、內(nei)存語義的(de) ...
經典三層架構項目(3-tier architecture)中應用依賴倒置原則(DIP)的理性權衡
1 DIP核心思想與三層架構概(gai)述 依(yi)賴(lai)倒置(zhi)原則(Dependency Inversion Principle,DIP)作為SOLID原則中(zhong)的重要(yao)組成部分(fen),其核心主張是高層模塊不(bu)應依(yi)賴(lai)低(di)層模塊,兩者都應依(yi)賴(lai)于抽(chou)(chou)象(xiang);抽(chou)(chou)象(xiang)不(bu)應依(yi)賴(lai)細節,細節應該依(yi)賴(lai)抽(chou)(chou)象(xiang)。 在(zai)經(jing)典三層架構(表示層-業務邏輯層-數據(ju)訪問層)中(zhong) ...
