JVM生產環境問題定位與解決實戰(六):總結篇——問題定位思路與工具選擇策略

在這里插入圖片描述

本文已收錄于《JVM生產環境問題定位與解決實戰》專欄,完整系列見文末目錄

引言

在前五篇文章中,我們深入探討了JVM生產環境問題定位與解決的實戰技巧,從基礎的jps、jmap、jstat、jstack、jcmd等工具,到JConsole、VisualVM、MAT的高級應用,再到Java飛行記錄器(JFR)的強大功能,以及如何使用JMC進行JFR性能分析,最后介紹了Arthas這一不可錯過的故障診斷利器。本篇文章作為總結篇,將梳理在面對JVM各種問題時我們的定位思路,并給出工具選擇的策略。

一、JVM問題分類與核心場景

在定位問題前,需先明確問題類型。以下是JVM常見問題分類及典型特征:

1. 內存相關問題

  • 特征:內存泄漏、堆內存溢出(OOM)、元空間溢出、內存使用異常波動
  • 典型表現java.lang.OutOfMemoryError、JVM進程內存持續增長、GC頻率異常

2. 性能瓶頸問題

  • 特征:響應延遲、吞吐量下降、CPU使用率異常
  • 典型表現:接口響應時間突增、TPS驟降、CPU 100%占用

3. 線程相關問題

  • 特征:線程阻塞、死鎖、線程池異常、線程泄漏
  • 典型表現:線程數異常增長、接口無響應、java.util.concurrent包異常

4. GC相關問題

  • 特征:GC停頓時間過長、Full GC頻繁、GC日志異常
  • 典型表現:JVM日志頻繁出現Full GC、業務線程長時間被阻塞

5. 其他問題

  • 類加載異常、本地內存泄漏(Native Memory)、JVM崩潰(core dump)

二. JVM問題定位的一般思路

在生產環境中,JVM可能會遇到各種問題,比如CPU使用率過高、內存泄漏、線程死鎖、性能瓶頸等。定位和解決這些問題的過程通常可以分為以下幾個步驟:

  1. 監控與發現:通過操作系統提供的資源監控工具(如top、htop、free)、arthas、JVM自帶工具(jps、jstat)或者搭建的監控系統(如Prometheus、Grafana)發現異常指標,如CPU飆升、內存溢出、系統宕機、gc異常等。
  2. 評估是否需要重啟服務:根據問題的嚴重性和業務影響,決定是否立即重啟服務以恢復業務。
  3. 快照捕獲:使用合適的工具收集數據(如線程堆棧、堆轉儲文件、GC日志、應用日志等)。
  4. 數據分析:根據異常類型選擇工具分析結果,確定問題的根源,例如代碼缺陷、配置不當或資源競爭。
  5. 解決問題:采取針對性措施,如調整JVM參數、優化代碼或修復邏輯錯誤。
  6. 驗證與監控:解決問題后,持續監控系統,確保問題不再復現。

在這一過程中,選擇合適的工具是關鍵。不同的工具適用于不同的場景和問題類型,接下來我們將對這些工具進行分類,并探討如何根據具體問題選擇合適的工具。

三. JVM工具分類

根據工具的使用方式和功能,我們可以將前五篇文章中介紹的工具分為以下幾類:

  • 命令行工具 :

    • jps:查看JVM進程。
    • jmap:分析堆內存使用情況。
    • jstat:監控GC和JVM運行時統計信息。
    • jstack:查看線程堆棧。
    • jcmd:多功能命令行工具。
    • Arthas:在線診斷工具,支持線程分析、反編譯等。
  • 圖形化工具:

    • JConsole:實時監控JVM運行狀態。
    • VisualVM:多功能的JVM監控和分析工具。
    • MAT(Memory Analyzer Tool):深入分析堆內存轉儲。
    • JMC(Java Mission Control):分析JFR記錄的性能數據。
  • 性能分析工具:

    • JFR(Java Flight Recorder):內置于JDK的事件記錄工具。
    • JMC:與JFR配合使用,分析性能瓶頸。

命令行工具適合在服務器上快速診斷,圖形化工具適合本地深入分析,而性能分析工具則專注于性能調優。

四. 常見JVM問題及排查思路

以下是生產環境中常見的JVM問題,并針對每個問題提供可能的原因推測和實用的排查思路。

1 JVM進程突然消失

可能原因
  • OOM Killer:操作系統因內存不足觸發Out-Of-Memory Killer,殺死了JVM進程。
  • JVM崩潰:JNI調用、本地代碼bug或JVM本身的bug導致崩潰(會生成hs_err_pid.log文件)。
  • 外部干預:人為操作(如kill -9)或腳本誤殺JVM進程。
排查思路
  1. 檢查JVM日志:查看hs_err_pid<pid>.log文件(通常在工作目錄下生成),分析崩潰堆棧。
  2. 檢查系統日志:查看/var/log/messagesdmesggrep -i 'oom' /var/log/messages*grep -i 'sigterm' /var/log/syslog),確認是否被OOM Killer終止。
  3. 確認外部操作:檢查服務器操作日志或運維記錄,排除人為誤操作。
  4. 啟用JVM參數:添加-XX:+HeapDumpOnOutOfMemoryError生成堆轉儲文件;

2 內存使用率過高

可能原因
  • 內存泄漏:對象未被正確釋放,堆內存持續增長。
  • 不合理的堆配置-Xmx-Xms設置過小或過大。
  • Metaspace溢出:類加載過多或動態代理使用不當。
  • 本地內存泄漏:JNI或NIO的Direct ByteBuffer未釋放。
排查思路
  1. 監控內存使用
    • 使用jstat -gc查看堆內存和Metaspace使用情況。
    • 用Arthas的dashboard命令實時觀察內存狀態。
    • 通過JMC連接JVM,查看“Memory”視圖中的堆使用趨勢。
  2. 生成堆轉儲并分析內存泄漏
    • jmap -dump:live,format=b,file=heap.hprof <pid>或Arthas的heapdump /tmp/heap.hprof導出堆快照,結合MAT分析,通過Leak Suspects視圖查看泄露疑點。或者選中 Retained Heap 最大的對象,右鍵選擇 "List objects > with incoming references",查看有哪些對象引用了它。通過 "Path to GC Roots"(到 GC 根的路徑)功能,找到該對象為什么沒有被垃圾回收。選擇 "excluding weak/soft references"(排除弱引用/軟引用),以聚焦強引用路徑。結合 MAT 的類名和引用鏈,推測可能的代碼路徑。
    • 用JFR記錄(-XX:StartFlightRecording,settings=profile),在JMC的“Allocation”視圖識別內存分配熱點和泄漏對象。
  3. 檢查GC日志
    • 開啟JVM參數-XX:+PrintGCDetails-Xlog:gc*,分析GC頻率和效果。
    • 結合Arthas的dashboard或JMC的“Garbage Collection”視圖驗證GC行為。
  4. 檢查代碼和類加載
    • 用Arthas的sc -d <className>檢查類加載詳情,排查Metaspace問題。
    • 用JFR的“Class Loading”事件和JMC分析類加載行為。
    • 用JMC的“Object Reference”視圖追蹤未釋放對象的引用鏈,定位內存泄漏根源。
典型操作
jmap -dump:format=b,file=heap.hprof <pid>      # 生成堆轉儲
jstat -gcutil <pid> 1000                       # 每秒實時GC統計
jcmd <pid> VM.native_memory                    # 堆外內存分析(需開啟NMT)

3 CPU使用率過高

可能原因
  • 死循環或高計算任務:代碼中存在無限循環或復雜計算邏輯。
  • 線程競爭激烈:鎖爭用或線程池配置不當。
  • 頻繁Full GC:垃圾回收過于頻繁,占用CPU資源。
排查思路
  1. 定位高CPU線程
    • 使用top -H -p <pid>查看線程CPU占用,記錄線程ID(轉換為16進制)。
    • 用Arthas的thread命令列出線程并找到CPU占用最高的線程。
    • 用JFR(-XX:StartFlightRecording)在JMC的“CPU Load”或“Thread”視圖中定位高CPU線程。
  2. 獲取線程棧
    • 通過jstack <pid>生成線程調用棧,定位死循環或阻塞點。
    • 用Arthas的thread <threadId>查看具體線程堆棧。
    • 用JFR的“Method Profiling”在JMC中分析線程執行熱點。
  3. 分析代碼邏輯
    • 檢查是否存在死循環、頻繁GC或高負載任務。
  4. 檢查GC行為
    • 開啟GC日志(-XX:+PrintGCDetails),分析Full GC頻率。
    • 結合MAT分析,Histogram視圖中找到 Retained Heap 最大的對象,右鍵選擇 "List objects > with incoming references",查看有哪些對象引用了它。通過 "Path to GC Roots"(到 GC 根的路徑)功能,找到該對象為什么沒有被垃圾回收。選擇 "excluding weak/soft references"(排除弱引用/軟引用),以聚焦強引用路徑。結合 MAT 的類名和引用鏈,推測可能的代碼路徑。
    • 用Arthas的vmtool --action getInstances --className java.lang.Object檢查對象創建情況。
    • 用JMC的“Garbage Collection”視圖確認GC對CPU的影響。
典型操作
top -H -p <pid>                 # 查看線程CPU占用,記錄下占用CPU最高的線程TID。
printf "%x\n" <TID>             #將TID轉換為十六進制(Java堆棧中的線程ID是以十六進制表示的)
jstack <pid> > thread_dump.txt  # 抓取線程棧,在生成的thread_dump.txt中搜索對應的十六進制線程ID,找到該線程的堆棧信息。
---------------------------------------------------------------
thread -n 3                    # 顯示最忙的3個線程(啟動Arthas后執行)

4 線程死鎖

可能原因
  • 鎖順序不當:多個線程以不同順序獲取多個鎖。
  • 資源競爭:線程間對共享資源訪問未正確同步。
  • 第三方庫問題:依賴庫中的鎖使用不當。
排查思路
  1. 檢測死鎖
    • jstack <pid>輸出末尾會明確提示Found one Java-level deadlock
    • 用Arthas的thread -b直接檢測并輸出死鎖信息。
    • 用JFR記錄(-XX:StartFlightRecording),在JMC的“Lock Instances”視圖中檢測鎖競爭和死鎖。
    • 使用JConsole或VisualVM的線程監控功能查看線程狀態
  2. 分析死鎖詳情
    • jstack提示“Found one Java-level deadlock”,定位鎖沖突點。
    • 用Arthas的thread <threadId>查看具體線程堆棧。
    • 用JMC的“Deadlock Detection”功能、JConsole或者VisualVM的線程視圖展示鎖沖突點和線程狀態。
  3. 檢查代碼
    • 梳理加鎖邏輯,確保鎖獲取順序一致。
  4. 動態監控鎖競爭
    • 用Arthas的monitor命令監控關鍵方法的執行頻率和鎖等待時間。
    • 用JMC的“Thread”視圖分析鎖等待時長和競爭熱點,結合“Contended Locks”事件優化同步代碼。

5 性能瓶頸

可能原因
  • I/O阻塞:數據庫查詢慢或文件操作耗時。
  • 鎖等待:同步塊或線程池任務排隊。
  • GC暫停:STW(Stop-The-World)時間過長。
  • 網絡延遲:外部服務響應慢。
排查思路
  1. 性能分析
    • 使用jvisualvm采樣,定位耗時方法。
    • 用Arthas的trace <className> <methodName>追蹤方法執行時間。
    • 用JFR(-XX:StartFlightRecording,settings=profile)記錄,在JMC的“Method Profiling”視圖定位耗時方法,結合“Latency”視圖分析瓶頸來源。
  2. 檢查線程狀態
    • 通過jstack分析線程是否在WAITINGTIMED_WAITING狀態。
    • 用Arthas的thread -state WAITING篩選等待線程。
    • 用JMC的“Thread”視圖查看線程等待和阻塞詳情。
  3. 優化GC
    • 調整-XX:+UseG1GC或 WiresharkCMS參數,減少暫停時間。
    • 用Arthas的dashboard監控GC狀態。
    • 用JMC的“Garbage Collection”視圖分析GC暫停時間。
  4. 外部依賴排查
    • 使用日志或Wireshark抓包分析網絡耗時。
    • 用Arthas的watch <className> <methodName>觀察方法入參和返回值。
    • 用JFR的“I/O”事件和JMC分析文件或網絡操作耗時。
典型操作
# 使用Arthas的trace命令追蹤方法執行時間。
trace com.ExampleController getUserInfo "#cost > 200"# 輸出結果
`---[213.3576ms] com.ExampleController:getUserInfo()+---[212.12ms] com.UserService:queryFromDB() # 發現DB查詢耗時|   `---[210.45ms] org.mybatis.spring.SqlSessionTemplate:selectOne()`---[1.2ms] com.Utils:maskPhoneNumber() watch com.example.Service::handleRequest '{args,requestTime}'

6 GC問題

典型表現
  • 頻繁Full GCjstat -gcutil中FGC列快速增加
  • GC停頓過長:通過-Xlog:gc*日志觀察暫停時間
  • 晉升失敗:年輕代對象過快進入老年代
可能原因
  • GC頻率過高:對象創建速度快,年輕代空間不足。
  • Full GC頻繁:老年代填滿,觸發長時間STW。
  • GC配置不當:垃圾回收器選擇或參數設置不合理。
排查思路
  1. 開啟GC日志并實時監控
    • 配置-XX:+PrintGCDetails -Xlog:gc*,分析GC耗時和效果。
    • 用Arthas的dashboard實時查看GC狀態。
    • 用JMC的“Garbage Collection”視圖分析GC次數和暫停時間。
  2. 監控內存分區
    • jstat -gcutil <pid>觀察Eden、Survivor、Old區使用率。
    • 用Arthas的ognl '@java.lang.management.ManagementFactory@getGarbageCollectorMXBeans()'獲取GC統計。
    • 用JFR的“Memory”視圖和JMC分析內存分配與GC行為。
  3. 調整堆大小并分析GC根因
    • 根據業務負載調整-Xmx-Xms-XX:NewRatio
    • 用Arthas的heapdump生成堆快照分析老年代對象。
    • 用JFR(-XX:StartFlightRecording,dump-on-exit=true)生成堆快照,在JMC的“Allocation”視圖定位高頻分配對象,優化代碼減少GC壓力。
  4. 選擇合適GC算法
    • 低延遲場景用G1,高吞吐量用Parallel GC。
    • 結合JMC的“GC Times”和“GC Pause”分析優化參數。
    • 調整堆大小-Xms-Xmx設為相同值,避免動態擴容

五. 先重啟還是先排查的選擇

在生產環境中遇到JVM問題時,開發者往往面臨一個抉擇:是立即重啟服務以快速恢復,還是先排查問題以避免復發?以下是選擇依據及后續排查措施。

判斷依據

  • 問題嚴重性
    • 如果服務完全不可用(如JVM進程消失或響應超時),且影響核心業務,優先考慮重啟以恢復服務。
    • 如果問題僅表現為性能下降或間歇性異常,可先嘗試在線排查。
  • 數據丟失風險
    • 重啟可能導致內存中未持久化的數據丟失,需評估業務影響。
  • 復現難度
    • 如果問題難以復現,重啟前盡量收集現場數據(如堆轉儲、線程棧、JFR記錄)。

必須立即恢復服務的措施

若必須馬上恢復服務,可采取以下措施在不中斷排查的情況下繼續分析問題:

  1. 收集關鍵數據后重啟
    • 在重啟前快速執行jmap -dump:live,format=b,file=heap.hprof <pid>生成堆轉儲。
    • jstack <pid>抓取線程棧。
    • 確保JFR已啟用(-XX:StartFlightRecording,dumponexit=true),保存退出時的記錄文件。
  2. 流量復制到測試環境
    • 配置流量鏡像工具(如TCPdump或服務網格的Sidecar),將生產流量復制到測試環境。
    • 在測試環境回放流量,觀察是否復現問題。
  3. 在測試環境復現
    • 根據生產環境的日志、請求參數和負載特征,構造測試用例。
    • 在測試環境啟用JFR(-XX:StartFlightRecording)和Arthas,模擬問題場景。
  4. 開啟新節點并隔離問題節點
    • 部署新JVM節點接管流量,保持問題節點運行但不接收新請求。
    • 在隔離節點上用Arthas(dashboardthread)或JMC實時分析,避免影響服務。

六. 工具選擇指南

在實際工作中,面對JVM問題時,可以參考以下指南選擇工具:

  1. 快速診斷
    • 在服務器上使用命令行工具(如jstack、jmap、Arthas)快速獲取初步信息。
    • 示例:CPU過高時,運行jstack > stack.txt查看線程堆棧。
  2. 深入分析
    • 將堆轉儲文件或JFR記錄下載到本地,使用MAT、JMC等工具進行詳細分析。
    • 示例:分析內存泄漏時,用MAT打開jmap生成的heap.hprof文件。
  3. 實時監控
    • 使用JConsole或VisualVM觀察JVM的實時狀態,適合初步排查。
    • 示例:連接到遠程JVM,監控內存和線程變化。
  4. 性能分析
    • 使用JFR和JMC進行全面性能分析,適合長期優化。
    • 示例:運行JFR記錄1分鐘數據,用JMC查看方法耗時分布。
  5. 在線診斷
    • 在不重啟JVM的情況下,使用Arthas進行動態排查。
    • 示例:懷疑某方法有問題,用jad com.example.MyClass反編譯代碼。

JVM問題的排查需要綜合運用工具、日志和代碼分析。傳統工具如jps(查看進程)、jmap(堆轉儲)、jstack(線程轉儲)、jstat(GC監控),結合Arthas的動態診斷和JMC/JFR的深度分析能力,可以覆蓋內存泄漏、鎖競爭、性能瓶頸和GC問題等多種場景。工具之間還可以組合使用。例如,先用jstack找到問題線程,再用Arthas的jad反編譯相關類;或者用JFR記錄數據,再用JMC可視化分析。

在生產環境中,建議提前配置監控日志,部署Arthas并啟用JFR,遇到問題時根據嚴重性選擇重啟或排查策略,確保服務穩定性和問題根因分析兼顧。希望本文的排查思路能為您解決JVM問題提供實用指導!

附錄:系列目錄

  1. JVM生產環境問題定位與解決實戰(一):掌握jps、jmap、jstat、jstack、jcmd等基礎工具
  2. JVM生產環境問題定位與解決實戰(二):JConsole、VisualVM到MAT的高級應用
  3. JVM生產環境問題定位與解決實戰(三):揭秘Java飛行記錄器(JFR)的強大功能
  4. JVM生產環境問題定位與解決實戰(四):使用JMC進行JFR性能分析指南
  5. JVM生產環境問題定位與解決實戰(五):Arthas——不可錯過的故障診斷利器
  6. ?? 當前:JVM生產環境問題定位與解決實戰(六):總結篇——問題定位思路與工具選擇策略

🔥 下篇預告:《JVM生產環境問題定位與解決實戰(七):真實案例解剖——從工具鏈到思維鏈的完全實踐》
🚀 關注作者,獲取實時更新通知!有問題歡迎在評論區交流討論~

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

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

相關文章

【5090d】配置運行和微調大模型所需基礎環境【一】

RuntimeError: Failed to import transformers.integrations.bitsandbytes because of the following error (look up to see its traceback): No module named triton.ops 原因&#xff1a;是因為在導入 transformers.integrations.bitsandbytes 時缺少必要的依賴項 triton.op…

華為交換綜合實驗——VRRP、MSTP、Eth-trunk、NAT、DHCP等技術應用

一、實驗拓撲 二、實驗需求 1,內網Ip地址使用172.16.0.0/16分配 2,sw1和SW2之間互為備份 3, VRRP/STP/VLAN/Eth-trunk均使用 4,所有Pc均通過DHCP獲取IP地址 5,ISP只能配置IP地址 6,所有電腦可以正常訪問IsP路由器環回 三、需求分析 1、設備連接需求 二層交換機&#xff08;LS…

DeepSeek 開源的 3FS 如何?

DeepSeek 3FS&#xff08;Fire-Flyer File System&#xff09;是一款由深度求索&#xff08;DeepSeek&#xff09;于2025年2月28日開源的高性能并行文件系統&#xff0c;專為人工智能訓練和推理任務設計。以下從多個維度詳細解析其核心特性、技術架構、應用場景及行業影響&…

Qt實現HTTP GET/POST/PUT/DELETE請求

引言 在現代應用程序開發中&#xff0c;HTTP請求是與服務器交互的核心方式。Qt作為跨平臺的C框架&#xff0c;提供了強大的網絡模塊&#xff08;QNetworkAccessManager&#xff09;&#xff0c;支持GET、POST、PUT、DELETE等HTTP方法。本文將手把手教你如何用Qt實現這些請求&a…

echarts+HTML 繪制3d地圖,加載散點+散點點擊事件

首先&#xff0c;確保了解如何本地引入ECharts庫。 html 文件中引入本地 echarts.min.js 和 echarts-gl.min.js。 可以通過官網下載或npm安裝&#xff0c;但這里直接下載JS文件更簡單。需要引入 echarts.js 和 echarts-gl.js&#xff0c;因為3D地圖需要GL模塊。 接下來是HTM…

深度剖析 MySQL 與 Redis 緩存一致性:理論、方案與實戰

在當今的互聯網應用開發中&#xff0c;MySQL 作為可靠的關系型數據庫&#xff0c;與 Redis 這一高性能的緩存系統常常協同工作。然而&#xff0c;如何確保它們之間的數據一致性&#xff0c;成為了開發者們面臨的重要挑戰。本文將深入探討 MySQL 與 Redis 緩存一致性的相關問題&…

DAO 類的職責與設計原則

1. DAO 的核心職責 DAO&#xff08;Data Access Object&#xff0c;數據訪問對象&#xff09;的主要職責是封裝對數據的訪問邏輯&#xff0c;但它與純粹的數據實體類&#xff08;如 DTO、POJO&#xff09;不同&#xff0c;也與 Service 業務邏輯層不同。 DAO 應該做什么&…

【Kubernetes】如何使用 kubeadm 搭建 Kubernetes 集群?還有哪些部署工具?

使用 kubeadm 搭建 Kubernetes 集群是一個比較常見的方式。kubeadm 是 Kubernetes 提供的一個命令行工具&#xff0c;它可以簡化 Kubernetes 集群的初始化和管理。下面是使用 kubeadm 搭建 Kubernetes 集群的基本步驟&#xff1a; 1. 準備工作 確保你的環境中有兩臺或更多的機…

Pycharm(十二)列表練習題

一、門和鑰匙 小X在一片大陸上探險&#xff0c;有一天他發現了一個洞穴&#xff0c;洞穴里面有n道門&#xff0c; 打開每道門都需要對應的鑰匙&#xff0c;編號為i的鑰匙能用于打開第i道門&#xff0c; 而且只有在打開了第i(i>1)道門之后&#xff0c;才能打開第i1道門&#…

在未歸一化的線性回歸模型中,特征的尺度差異可能導致模型對特征重要性的誤判

通過數學公式來更清晰地說明歸一化對模型的影響&#xff0c;以及它如何改變特征的重要性評估。 1. 未歸一化的情況 假設我們有一個線性回歸模型&#xff1a; y β 0 β 1 x 1 β 2 x 2 ? y \beta_0 \beta_1 x_1 \beta_2 x_2 \epsilon yβ0?β1?x1?β2?x2?? 其…

JS—頁面渲染:1分鐘掌握頁面渲染過程

個人博客&#xff1a;haichenyi.com。感謝關注 一. 目錄 一–目錄二–頁面渲染過程三–DOM樹和渲染樹 二. 頁面渲染過程 瀏覽器的渲染過程可以分解為以下幾個關鍵步驟 2.1 解析HTML&#xff0c;形成DOM樹 瀏覽器從上往下解析HTML文檔&#xff0c;將標簽轉成DOM節點&#…

niuhe插件, 在 go 中渲染網頁內容

思路 niuhe 插件生成的 go 代碼是基于 github.com/ma-guo/niuhe 庫進行組織管理的, niuhe 庫 是對 go gin 庫的一個封裝&#xff0c;因此要顯示網頁, 可通過給 gin.Engine 指定 HTMLRender 來實現。 實現 HTMLRender 我們使用 gitee.com/cnmade/pongo2gin 實現 1. main.go …

openEuler24.03 LTS下安裝HBase集群

前提條件 安裝好Hadoop完全分布式集群&#xff0c;可參考&#xff1a;openEuler24.03 LTS下安裝Hadoop3完全分布式 安裝好ZooKeeper集群&#xff0c;可參考&#xff1a;openEuler24.03 LTS下安裝ZooKeeper集群 HBase集群規劃 node2node3node4MasterBackup MasterRegionServ…

LVGL移植說明

https://www.cnblogs.com/FlurryHeart/p/18104596 參考&#xff0c;里面說明了裸機移植以及freeRTOS系統移植。 移植到linux https://blog.csdn.net/sunchao124/article/details/144952514

ubuntu虛擬機裁剪img文件系統

1. 定制文件系統前期準備 將rootfs.img文件準備好&#xff0c;并創建target文件夾2. 掛載文件系統 sudo mount rootfs.img target #掛載文件系統 sudo chroot target #進入chroot環境3. 內裁剪文件系統 增刪裁剪文件系統 exit #退出chroot環境 sudo umount target…

esp826601s固件燒錄方法(ch340+面包板)

esp826601s固件燒錄方法&#xff08;ch340面包板&#xff09; 硬件 stm32f10c8t6&#xff0c;esp826601s,面包板&#xff0c;ch340(usb轉ttl),st_link&#xff08;供電&#xff09; 接線 燒錄時&#xff1a; stm32f10c8t6&#xff1a;gnd->負極&#xff0c; 3.3->正極…

Servlet 點擊計數器

Servlet 點擊計數器 引言 Servlet 是 Java 企業版&#xff08;Java EE&#xff09;技術中的一種服務器端組件&#xff0c;用于處理客戶端請求并生成動態內容。本文將詳細介紹如何使用 Servlet 實現一個簡單的點擊計數器&#xff0c;幫助讀者了解 Servlet 的基本用法和原理。 …

LangChain vs. LlamaIndex:深入對比與實戰應用

目錄 引言LangChain 與 LlamaIndex 概述 什么是 LangChain&#xff1f;什么是 LlamaIndex&#xff1f;兩者的核心目標與適用場景 架構與設計理念 LangChain 的架構設計LlamaIndex 的架構設計關鍵技術差異 核心功能對比 數據連接與處理查詢與檢索機制上下文管理能力插件與擴展性…

【Java中級】10章、內部類、局部內部類、匿名內部類、成員內部類、靜態內部類的基本語法和細節講解配套例題鞏固理解【5】

?? 【內部類】干貨滿滿&#xff0c;本章內容有點難理解&#xff0c;需要明白類的實例化&#xff0c;學完本篇文章你會對內部類有個清晰的認知 &#x1f495; 內容涉及內部類的介紹、局部內部類、匿名內部類(重點)、成員內部類、靜態內部類 &#x1f308; 跟著B站一位老師學習…

內容中臺:驅動多渠道營銷的關鍵策略

在數字營銷快速發展的今天&#xff0c;企業需要在多個渠道&#xff08;網站、社交媒體、移動應用等&#xff09;上同步管理內容。盡管網站仍是品牌展示的核心&#xff0c;但信息分散、多平臺重復創建內容的問題&#xff0c;讓營銷人員面臨巨大的管理挑戰。 內容中臺&#xff0…