JVM——即時編譯

分層編譯模式:動態平衡啟動速度與執行效率

分層編譯是現代JVM(如HotSpot、GraalVM)實現高性能的核心策略之一,其核心思想是根據代碼的執行熱度動態選擇不同的編譯層次,實現啟動速度與運行效率的最佳平衡。以HotSpot虛擬機為例,其分層編譯架構通常包含以下五個層次:

  1. 第0層:純解釋執行

    特點:完全依賴解釋器逐行執行字節碼,不開啟任何性能監控(Profiling)。

    適用場景:程序啟動初期,快速加載并執行代碼,避免編譯延遲。

    優勢:啟動速度極快,內存占用低,適合資源受限的嵌入式系統或短生命周期應用。

  2. ?第1層:C1基礎編譯

    特點:使用客戶端編譯器(C1)將字節碼編譯為本地代碼,執行簡單穩定的優化(如方法內聯、常量傳播),但不收集性能數據。

    觸發條件:方法調用次數或循環回邊次數超過默認閾值(如1500次)。

    優勢:編譯速度快,能在程序啟動后迅速提升部分代碼的執行效率。

  3. 第2層:C1有限監控編

    特點:仍使用C1編譯器,但開啟方法調用次數和循環回邊次數的統計。

    觸發條件:在第1層基礎上,進一步收集有限的性能數據,為后續優化提供依據。

    作用:初步識別熱點代碼,為更高層次的編譯做準備。

  4. 第3層:C1全量監控編譯

    特點:C1編譯器收集完整的性能數據,包括分支跳轉頻率、虛方法調用版本等。

    觸發條件:方法調用次數或循環回邊次數達到更高閾值(如10000次)。

    作用:為服務端編譯器(C2)提供詳細的Profiling信息,支持更復雜的優化。

  5. 第4層:C2深度優化編譯

    特點:使用服務端編譯器(C2)進行激進優化,包括全局優化、循環展開、向量化等。

    觸發條件:在第3層收集足夠數據后,C2編譯器介入生成高度優化的機器碼。

    優勢:生成代碼執行效率高,適合長時間運行的服務端應用。

分層編譯的協同機制

  • 動態調整:各層次之間并非固定,JVM會根據代碼熱度動態調整編譯層次。例如,當某個方法的執行頻率下降時,可能會回退到較低層次以節省資源。

  • 代碼緩存管理:分層編譯需要更大的代碼緩存(默認240MB),以存儲不同層次的編譯結果。若緩存不足,JVM會發出警告并可能降級編譯策略。

  • GraalVM的改進:GraalVM引入Graal編譯器作為C2的替代者,采用更先進的中間表示(Sea-of-Nodes)和優化算法,支持部分逃逸分析、激進預測性優化等,在某些場景下性能超越C2。

分層編譯的典型應用場景

  • 微服務架構:啟動時通過C1快速編譯,快速響應請求;運行穩定后,C2對核心業務邏輯進行深度優化,提升吞吐量。

  • 大數據處理:循環密集型任務(如MapReduce)通過OSR編譯在運行時動態優化,顯著減少執行時間。

  • 移動端應用:結合ART的AOT編譯與JIT動態優化,平衡安裝速度與運行性能。

即時編譯的觸發:熱點代碼的精準識別

即時編譯的觸發依賴于熱點代碼的探測機制。HotSpot采用基于計數器的熱點探測方法,為每個方法維護兩個計數器:

  1. 方法調用計數器(Invocation Counter)

    作用:統計方法被調用的次數。

    閾值:默認1500次(可通過-XX:CompileThreshold調整)。

    觸發條件:當調用次數超過閾值時,觸發標準即時編譯(即整個方法被編譯)。

  2. 回邊計數器(Back Edge Counter)

    作用:統計循環體的執行次數(回邊指循環邊界的跳轉指令)。

    閾值計算:InterpreterBackwardBranchLimit = (CompileThreshold * (OnStackReplacePercentage - InterpreterProfilePercentage)) / 100,默認約10700次。

    觸發條件:當循環次數超過閾值時,觸發棧上替換(OSR)編譯,僅優化循環體部分。

熱點探測的優化策略

  • 自適應調整:JVM會根據程序運行情況動態調整計數器閾值。例如,若某個方法調用頻繁但執行時間短,可能降低閾值以提前編譯。

  • 分層觸發:不同編譯層次的觸發條件不同。例如,C1編譯可能在調用次數達到1500次時觸發,而C2編譯需要更高的閾值(如10000次)。

  • OSR編譯的特殊性:OSR編譯允許在方法執行過程中動態替換棧幀,避免重新編譯整個方法的開銷。例如,當循環次數超過閾值時,JVM會將循環體編譯為本地代碼,并替換當前棧幀,后續迭代直接執行優化后的代碼。

熱點探測的實現細節

  • 安全點(Safepoint):編譯操作必須在安全點進行,此時所有線程暫停,確保狀態一致。安全點通常位于方法調用、循環回邊等位置。

  • 異步編譯:熱點代碼的編譯由后臺線程異步執行,避免阻塞主線程。例如,C1和C2編譯器分別由不同的線程池處理。

  • 閾值調整參數:通過-XX:Tier3CompileThreshold等參數可定制各層次的觸發條件,以適應不同應用的需求。

OSR編譯:循環優化的核心技術

棧上替換(On-Stack Replacement,OSR)是即時編譯中針對循環優化的關鍵技術,允許在循環執行過程中動態替換為優化后的本地代碼,而無需重新編譯整個方法。

OSR的觸發條件

循環次數閾值:當循環回邊次數超過InterpreterBackwardBranchLimit(默認約10700次)時觸發。

編譯可行性:JVM需確保循環體的編譯結果可以無縫替換當前棧幀,包括局部變量和操作數棧的狀態保存與恢復。

OSR的實現步驟

狀態捕獲:解釋器在執行循環時,記錄當前棧幀的局部變量、操作數棧和程序計數器(PC)。

代碼生成:C1或C2編譯器針對循環體生成優化后的本地代碼,并生成一個OSR入口點。

棧幀替換:當循環再次執行到入口點時,JVM將解釋執行的棧幀替換為編譯后的棧幀,后續迭代直接執行本地代碼。

狀態恢復:編譯后的代碼需根據捕獲的狀態恢復局部變量和操作數棧,確保執行連續性。

OSR的關鍵挑戰

局部變量映射:解釋執行的局部變量可能存儲在棧或寄存器中,編譯后的代碼需正確映射這些變量的位置。

異常處理:OSR編譯后的代碼需處理可能拋出的異常,并與解釋執行的異常處理邏輯兼容。

代碼緩存管理:OSR編譯生成的代碼需存儲在代碼緩存中,需合理分配空間以避免緩存溢出。

OSR的性能影響

優化效果:OSR可顯著減少循環的執行時間。例如,在某電商系統中,循環密集型任務通過OSR優化后,吞吐量提升28%。

編譯開銷:OSR編譯需要額外的時間和資源,可能對啟動性能產生輕微影響。

調試復雜性:OSR導致的代碼替換可能使調試工具(如斷點)的行為變得復雜,需特殊處理。

Profiling:優化決策的核心依據

Profiling(性能分析)是即時編譯的核心支撐技術,通過收集代碼執行時的動態數據,指導編譯器進行針對性優化。HotSpot的Profiling主要包括分支Profile和類型Profile。

分支Profile的收集與應用

收集方式

  • 靜態分析:在解釋執行或C1編譯階段,統計條件跳轉指令的分支頻率。

  • 動態監控:C1編譯后的代碼在執行時,實時記錄分支跳轉的歷史數據。

優化策略

  • 分支預測:根據歷史數據預測分支走向,減少流水線沖刷。例如,若某分支90%的時間為真,編譯器可優先執行該路徑。

  • 分支消除:對于始終為真或假的分支,直接移除條件判斷。例如,if (true) { ... }可簡化為直接執行代碼塊。

  • 代碼重排:將高頻執行的基本塊(Basic Block)相鄰放置,提高CPU緩存命中率。例如,使用BOLT工具根據分支頻率重排代碼布局,減少緩存未命中。

類型Profile的收集與應用

收集方式

  • 虛方法調用記錄:在解釋執行或C1編譯階段,記錄虛方法調用的實際類型。

  • 動態類型監控:C1編譯后的代碼在執行時,統計方法調用的參數類型分布。

優化策略

  • 類型特化:根據類型Profile生成特定類型的優化代碼。例如,若List的實現類90%為ArrayList,編譯器可將List.get()調用直接替換為ArrayList.get(),避免虛方法開銷。

  • 去虛擬化:對于類型單一的虛方法調用,直接內聯具體實現,消除動態分派的開銷。

  • 內聯決策:結合類型Profile調整內聯策略。例如,若某方法的參數類型變化頻繁,可能選擇不內聯以避免去優化風險。

Profiling的實現細節

數據存儲:分支Profile和類型Profile存儲在JVM的內部數據結構中,如ProfileData對象。

數據更新:Profiling數據在代碼執行時動態更新,確保編譯器獲取最新的執行信息。

優化粒度:Profiling可精確到方法、循環或基本塊級別,支持細粒度的優化決策。

Profiling的局限性

數據滯后性:Profiling數據反映的是歷史執行情況,可能與當前執行路徑不完全匹配。

空間開銷:大量的Profiling數據需要占用內存,可能影響JVM的資源分配。

去優化風險:基于Profiling的優化假設可能不成立(如類型變化),導致去優化操作,增加運行時開銷。

基于分支Profile的優化:提升條件語句效率

分支預測和優化是提升程序性能的關鍵手段,尤其在循環和條件判斷密集的代碼中。基于分支Profile的優化主要包括以下策略:

分支預測優化

靜態預測

  • Always Taken:假設所有分支都跳轉,適用于循環條件。

  • Backward Taken, Forward Not Taken (BTFN):假設向后跳轉的分支(如循環)總是跳轉,向前跳轉的分支不跳轉。

動態預測

  • 兩比特計數器(Two-bit Counter):記錄分支最近兩次的執行結果,預測未來走向。例如,若分支連續兩次跳轉,則預測下次跳轉。

  • 全局歷史表(Global History Table):結合全局分支歷史進行預測,適用于長距離依賴的分支。

分支消除與簡化

常量條件:若條件表達式在編譯時已知結果,直接移除條件判斷。例如:

if (false) {// 永遠不會執行的代碼
}

編譯器可直接刪除該分支。

條件合并:將多個條件判斷合并為一個,減少分支數量。例如:

if (a > 0) {if (b < 10) {// 代碼塊}
}

可優化為:

if (a > 0 && b < 10) {// 代碼塊
}

代碼重排與布局優化

基本塊重排:將高頻執行的基本塊相鄰放置,提高CPU緩存命中率。例如,將if分支的真路徑和假路徑按執行頻率排序。

循環展開:通過增加循環體的指令數量,減少循環次數和分支判斷。例如,將循環展開兩次:

for (int i = 0; i < n; i += 2) {process(i);process(i + 1);
}

減少循環條件的判斷次數。

預測執行(Speculative Execution)

分支預判:在分支條件未確定前,提前執行可能的路徑。例如,若預測分支為真,提前執行真路徑的指令,并在條件確定后驗證結果。

推測加載:提前加載可能使用的數據到緩存,減少內存訪問延遲。例如,在循環中提前加載下一次迭代所需的數據。

實際應用案例

數據庫查詢優化:在SQL查詢引擎中,根據分支Profile調整執行計劃,選擇更高效的索引或掃描方式。

游戲引擎:在碰撞檢測算法中,通過分支預測和代碼重排提升實時響應性能。

金融交易系統:在高頻交易場景中,通過分支消除和預測執行減少延遲,提升吞吐量。

基于類型Profile的優化:消除動態分派開銷

類型Profile的優化主要針對虛方法調用和動態類型綁定,通過減少運行時的動態分派開銷,提升執行效率。以下是主要優化策略:

類型特化(Type Specialization)

原理:根據類型Profile生成特定類型的優化代碼。例如,若某虛方法List.get(int)的調用中,90%的List實例為ArrayList,編譯器可生成ArrayList.get(int)的直接調用,避免虛方法開銷。

實現步驟

  1. 收集類型Profile,統計方法調用的實際類型分布。

  2. 為高頻類型生成特化代碼,并保留通用版本作為后備。

  3. 在調用點插入類型檢查,若實際類型匹配特化版本,則執行優化代碼;否則回退到通用版本。

去虛擬化(Devirtualization)

原理:對于類型單一的虛方法調用,直接內聯具體實現,消除動態分派。例如,若某虛方法Animal.sound()的調用中,所有Animal實例均為Dog,編譯器可將調用替換為Dog.sound()的直接調用。

觸發條件

  • 類型Profile顯示方法調用的實際類型高度集中。

  • 方法體較小,內聯收益大于開銷。

內聯優化與類型Profile結合

動態內聯:根據類型Profile調整內聯策略。例如,若某方法的參數類型變化頻繁,可能選擇不內聯以避免去優化;若類型穩定,則積極內聯。

類型驅動的內聯:內聯時考慮參數類型,生成特定類型的內聯代碼。例如,List.add(Object)可根據實際參數類型內聯為ArrayList.add(String)LinkedList.add(Integer)

類型繼承結構優化

常量傳播:若父類方法被覆蓋,且子類方法在運行時占主導地位,編譯器可將父類方法的調用替換為子類實現。

字段內聯:若子類字段未被覆蓋,可直接訪問子類字段,避免動態查找。

實際應用案例

ORM框架:在Hibernate中,根據類型Profile優化對象加載時的反射調用,減少動態代理的開銷。

容器類庫:在Java集合框架中,根據類型Profile優化Iterator的實現,例如將ArrayList的迭代器直接替換為數組訪問。

深度學習框架:在TensorFlow中,根據張量類型Profile優化算子選擇,例如針對float32int8數據生成不同的計算內核。

去優化:應對優化假設的失效

去優化(Deoptimization)是即時編譯中的關鍵機制,當優化假設不成立時,將代碼從編譯執行回退到解釋執行或重新編譯,確保程序正確性。以下是去優化的常見場景和實現機制:

去優化的觸發條件

類型變化:若虛方法調用的實際類型超出類型Profile的預期,導致去虛擬化失敗。

分支預測錯誤:若分支執行路徑與Profile數據不符,導致激進優化失效。

加載新類:類加載后,方法的繼承結構發生變化,影響已編譯代碼的邏輯。

罕見陷阱(Uncommon Trap):某些異常情況(如數組越界)在優化代碼中未處理,需回退到解釋執行。

去優化的實現步驟

  1. 狀態保存:在編譯代碼中插入去優化點,保存當前棧幀的局部變量、操作數棧和程序計數器。

  2. 回退邏輯:當觸發條件滿足時,JVM將執行權轉移到解釋器,并根據保存的狀態恢復執行。

  3. 重新編譯:若去優化頻繁發生,JVM可能重新編譯代碼,調整優化策略。

去優化的性能影響

單次開銷:去優化操作本身會帶來一定的性能損失,通常在微秒級。

頻繁去優化:若代碼頻繁觸發去優化,可能導致性能下降。例如,動態類型語言(如JavaScript)中,類型變化頻繁可能導致去優化成為主要開銷。

優化策略調整:JVM會根據去優化的頻率動態調整編譯策略,例如降低優化級別或增加Profiling的頻率。

去優化的案例分析

逃逸分析失效:若對象的作用域超出預期(如被外部線程訪問),逃逸分析的優化(如棧上分配)失效,需回退到堆分配。

虛方法調用類型變化:若某個虛方法的調用在運行時出現新的子類,導致去虛擬化失敗,需回退到動態分派。

激進優化假設不成立:例如,編譯器假設某分支永遠不會執行,但實際執行時觸發該分支,導致去優化。

減少去優化的策略

限制動態類型使用:在靜態類型語言中,避免過度使用反射和動態代理。

預熱階段優化:在程序啟動后,主動執行關鍵路徑代碼,收集足夠的Profiling數據,減少運行時去優化。

參數調優:通過-XX:DeoptimizationWorkers等參數調整去優化線程數,平衡響應速度與資源消耗。

從JIT到AI驅動的編譯優化

1. 即時編譯的發展歷程

  • 早期階段(1990s-2000s):以HotSpot的C1/C2編譯器為代表,實現基本的分層編譯和熱點優化。

  • 中期階段(2010s):GraalVM的出現,引入多語言支持和更先進的優化算法(如部分逃逸分析)。

  • 近期階段(2020s):AI技術的應用,如機器學習模型用于編譯決策,硬件協同優化(如GPU加速編譯)。

2. 現有技術的局限性

  • 優化策略的靜態性:現有優化策略基于歷史數據,無法實時適應動態變化的運行環境。

  • 硬件協同不足:JIT編譯器對新型硬件(如NPU、FPGA)的支持有限,未充分發揮異構計算的潛力。

  • 去優化的開銷:頻繁的去優化可能抵消部分編譯優化的收益,尤其在動態語言中。

3. 未來發展趨勢

  • AI驅動的編譯優化

    • 機器學習模型:使用深度學習預測熱點代碼、優化策略,提升編譯決策的準確性。例如,小米的AI編譯器利用強化學習優化代碼布局,啟動速度提升60%。

    • 自動調優:根據硬件狀態(如CPU負載、內存帶寬)動態調整編譯策略,實現自適應優化。

  • 硬件協同優化

    • 異構計算:將計算任務分配到CPU、GPU、NPU等不同設備,JIT編譯器生成跨平臺的優化代碼。例如,昇思MindSpore通過張量重排布和自動微分支持GPU加速編譯。

    • 近存計算:結合HBM高帶寬內存和存算一體架構,減少數據搬運能耗,提升計算密集型任務的效率。

  • 更高效的去優化機制

    • 增量編譯:僅重新編譯受影響的代碼部分,減少編譯開銷。

    • 預測性去優化:通過機器學習預測可能觸發去優化的場景,提前調整優化策略。

  • 多語言統一編譯

    • GraalVM的演進:支持更多語言(如Rust、Python)的即時編譯,實現跨語言的無縫優化。

    • 泛在智能:在邊緣設備上實現輕量級JIT編譯,結合AI Agent實現端云協同優化。

總結

即時編譯是現代高性能計算的基石,其技術體系從分層編譯、熱點探測到去優化,不斷演進以適應新的應用場景和硬件架構。未來,隨著AI和硬件技術的發展,JIT編譯將更加智能化、自適應化,實現從“代碼優化”到“系統級協同優化”的跨越。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/82302.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/82302.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/82302.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Auto DOP:讓并行執行實現智能調優 | OceanBase 實踐

隨著數據量的迅速增長&#xff0c;企業數據庫往往面臨著一個困局&#xff1a;復雜的分析查詢需要充分的資源來保證性能&#xff0c;但過多增加并行執行又會造成資源競爭&#xff0c;影響系統穩定性。傳統基于DBA人工干預的并行度調節機制&#xff0c;既低效又難以適應動態變化的…

【區塊鏈】Uniswap之滑點(Slippage)

一、滑點是什么&#xff1f; 滑點&#xff08;Slippage&#xff09;是指你下單預期價格和最終成交價格之間的差距。 在 DEX 中&#xff0c;你的交易會影響池子的價格&#xff08;AMM機制&#xff09;&#xff0c;所以&#xff1a; 下單越大&#xff0c;滑點越大&#xff1b;…

[前端]Javascript獲取元素寬度

元素寬度屬性對比示意圖 ---------------------------------- | 外邊距&#xff08;margin&#xff09; | -------------------------------- | | 邊框&#xff08;border&#xff09; | | | -------------------------- | | | …

數字人驅動/動畫方向最新頂會期刊論文收集整理 | AAAI 2025

會議官方論文列表&#xff1a;https://ojs.aaai.org/index.php/AAAI/issue/view/624 以下論文部分會開源代碼&#xff0c;若開源&#xff0c;會在論文原文的摘要下方給出鏈接。 語音驅動頭部動畫/其他 EchoMimic: Lifelike Audio-Driven Portrait Animations through Editabl…

Windows系統下【Celery任務隊列】python使用celery 詳解(一)

Celery 是一個基于 Python 的分布式任務隊列框架&#xff0c;它允許你在不同的進程甚至不同的服務器上異步執行任務。 特點 簡單&#xff1a;易于使用和配置&#xff0c;提供了簡潔的 API。高可用&#xff1a;支持任務的可靠交付&#xff0c;即使在出現故障時也能保證任務不丟…

移動設備常用電子屏幕類型對比

概述 LCD 家族 &#xff08;TN、STN、TFT、IPS、VA&#xff09;依賴背光&#xff0c;性能差異主要來自液晶排列和驅動方式。OLED 以自發光為核心優勢&#xff0c;但成本與壽命限制其普及。E-Paper 專為低功耗靜態顯示設計&#xff0c;與傳統屏幕技術差異顯著。 參數LCD&#…

Vue3.5 企業級管理系統實戰(十八):用戶管理

本篇主要探討用戶管理功能&#xff0c;接口部分依然是使用 Apifox mock 模擬。 1 用戶 api 在 src/api/user.ts 中添加用戶相關 CRUD 接口&#xff0c;代碼如下&#xff1a; //src/api/user.ts import request from "/api/config/request"; // 從 "./type&q…

【C】初階數據結構14 -- 歸并排序

本篇文章主要是講解經典的排序算法 -- 歸并排序 目錄 1 遞歸版本的歸并排序 1&#xff09; 算法思想 2&#xff09; 代碼 3&#xff09; 時間復雜度與空間復雜度分析 &#xff08;1&#xff09; 時間復雜度 &#xff08;2&#xff09; 空間復雜度 2 迭代版本的歸并…

【相機標定】OpenCV 相機標定中的重投影誤差與角點三維坐標計算詳解

摘要&#xff1a; 本文將從以下幾個方面展開&#xff0c;結合典型代碼深入解析 OpenCV 中的相機標定過程&#xff0c;重點闡述重投影誤差的計算方法與實際意義&#xff0c;并通過一個 calcBoardCornerPositions() 函數詳細講解棋盤格角點三維坐標的構建邏輯。 在計算機視覺領域…

RabbitMQ-運維

文章目錄 前言運維-集群介紹多機多節點單機多節點 多機多節點下載配置hosts?件配置Erlang Cookie啟動節點構建集群查看集群狀態 單機多節點安裝啟動兩個節點再啟動兩個節點驗證RabbitMQ啟動成功搭建集群把rabbit2, rabbit3添加到集群 宕機演示仲裁隊列介紹raft算法協議 raft基…

JVM之內存管理(一)

部分內容來源&#xff1a;JavaGuide二哥Java 圖解JVM內存結構 內存管理快速復習 棧幀&#xff1a;局部變量表&#xff0c;動態鏈接&#xff08;符號引用轉為真實引用&#xff09;&#xff0c;操作數棧&#xff08;存儲中間結算結果&#xff09;&#xff0c;方法返回地址 運行時…

無線射頻模塊如何通過CE RED認證?關鍵規范與準備策略詳解

隨著無線通信設備在歐洲市場的廣泛應用&#xff0c;CE RED認證已成為模塊類產品進入歐盟的強制通行證。作為專注于LoRa模塊、對講模塊與FSK射頻模塊研發的技術企業&#xff0c;我們深知從設計、測試到量產&#xff0c;每一個環節都需緊扣合規底線。本文將圍繞CE RED認證核心要求…

Golang中集合相關的庫

一切編程語言的底層結構都是數組&#xff0c;其它復雜數據結構如Map, Stack&#xff0c;Heap和Queue都是基于數組建立起來的。 Go語言主流工具庫推薦&#xff08;含常用數據結構實現&#xff09; 以下是目前Go生態中最主流且活躍的工具庫&#xff0c;包含隊列、棧、優先級隊列…

ABAP 導入Excel形成內表

文章目錄 創建導入模板程序實現代碼代碼解析運行結果 創建導入模板 程序實現 代碼 *&---------------------------------------------------------------------* *& Report Z_EXCEL_UPLOAD_LHY *&--------------------------------------------------------------…

特殊配合力(SCA)作為全基因組關聯分析(GWAS)的表型,其生物學意義和應用價值

生物學意義 解析非加性遺傳效應 特殊配合力(SCA)主要反映特定親本組合的雜交優勢,由非加性遺傳效應(如顯性、超顯性、上位性)驅動。顯性效應涉及等位基因間的顯性互作,上位性效應則涉及不同位點間的基因互作。通過SCA-GWAS,可以定位調控這些非加性效應的關鍵基因組區域…

應急響應基礎模擬靶機-security1

PS:杰克創建在流量包(result.pcap)在根目錄下&#xff0c;請根據已有信息進行分析 1、攻擊者使用的端口掃描工具是? 2、通過流量及日志審計&#xff0c;攻擊者上傳shell的時訪問web使用IP地址是多少? 3、審計流量日志&#xff0c;攻擊者反彈shell的地址及端口? 4、攻擊者…

uniapp-商城-47-后臺 分類數據的生成(通過數據)

在第46章節中&#xff0c;我們為后臺數據創建了分類的數據表結構schema&#xff0c;使得可以通過后臺添加數據并保存&#xff0c;同時使用云函數進行數據庫數據的讀取。文章詳細介紹了如何通過前端代碼實現分類管理功能&#xff0c;包括獲取數據、添加、更新和刪除分類。主要代…

ClickHouse的基本操作說明

說明 文章內容包括數據庫管理、表操作及查詢等核心功能 創建數據庫 -- 默認引擎&#xff08;Atomic&#xff09; CREATE DATABASE IF NOT EXISTS test_db; -- MySQL引擎&#xff08;映射外部MySQL數據庫&#xff09; CREATE DATABASE mysql_db ENGINE MySQL(host:port, m…

Nacos源碼—7.Nacos升級gRPC分析四

大綱 5.服務變動時如何通知訂閱的客戶端 6.微服務實例信息如何同步集群節點 6.微服務實例信息如何同步集群節點 (1)服務端處理服務注冊時會發布一個ClientChangedEvent事件 (2)ClientChangedEvent事件的處理源碼 (3)集群節點處理數據同步請求的源碼 (1)服務端處理服務注冊…

《Overlapping Experiment Infrastructure: More, Better, Faster》論文閱讀筆記

文章目錄 1 背景2 三個核心概念3 Launch層&#xff1a;特性發布的專用機制4 流量分發策略和條件篩選4.1 四種流量分發類型4.2 條件篩選機制 5 工具鏈與監控體系6 實驗設計原則7 培訓參考與推薦 1 背景 谷歌&#xff08;Google&#xff09;以數據驅動著稱&#xff0c;幾乎所有可…