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