Tomcat 企業級運維實戰系列(四):Tomcat 企業級監控

Tomcat 企業級運維實戰系列(四):Tomcat 企業級監控

  • 一:監控工具
    • 1)概述
    • 2)流程
    • 3)部署
  • 二:監控命令
    • 1)`jps`
    • 2)`jstack`
    • 3)`jmap`
    • 4)`MAT` 工具分析
  • 三:監控腳本
  • 四:Java 系統負載與性能排查流程
    • 1)初步觀察系統負載
    • 2)判斷負載來源
    • 3)確定問題進程
    • 4)進一步分析
    • 5)問題解決與總結
  • 總結


🚀 Tomcat 系列文章導航
本系列系統講解 Linux 環境下 Apache Tomcat 的部署、配置、管理與優化,并最終帶你完成 企業級前后端分離項目上線。無論你是初學者還是想進階的運維人員,這份路線圖都能幫你快速構建完整的知識體系。

?? 該系列所有涉及的軟件包和項目都可以私信博主免費獲取

  • 👉 第一部分:Tomcat 核心概念與基礎部署
  • 👉 第二部分:Tomcat 系統化管理與應用部署
  • 👉 第三部分:Tomcat 配置解析與集群化部署
  • 👉 第四部分:Tomcat 企業級監控
  • 👉 第五部分:Tomcat 優化和安全加固
  • 👉 第六部分:綜合項目實戰:Java 前后端分離架構部署

一:監控工具

1)概述

  • 可通過 Zabbix / Grafana / Prometheus 等工具監控 Tomcat/Java。

  • 需要在 Tomcat 中開啟 Java 遠程監控功能(JMX Remote)

  • 也可在 Windows 安裝 JDK,使用 jconsole / jvisualvm 工具遠程連接 Tomcat 進行監控。

2)流程

  1. 在 Linux 修改 Tomcat 啟動參數,開啟 JMX 遠程監控功能。

  2. 重啟 Tomcat 使配置生效。

  3. 查看進程確認參數是否加載。

  4. 在 Windows 安裝 JDK,并使用工具連接。

3)部署

  1. 修改 Tomcat 啟動參數

    參數說明
    -Dcom.sun.management.jmxremote開啟遠程監控功能
    -Dcom.sun.management.jmxremote.port=12345指定 JMX 端口
    -Dcom.sun.management.jmxremote.authenticate=false關閉認證
    -Dcom.sun.management.jmxremote.ssl=false關閉 SSL 加密
    -Djava.rmi.server.hostname=192.168.2.104綁定監聽的 IP(通常填內網IP)
    [root@web01 ~]# vim /opt/module/tomcat-8.5.87/bin/catalina.sh
    

    ?? 注意:Tomcat 8.5+ 中配置需用 \ 換行。

    CATALINA_OPTS="$CATALINA_OPTS \
    -Dcom.sun.management.jmxremote \
    -Dcom.sun.management.jmxremote.port=12345 \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Djava.rmi.server.hostname=192.168.2.104"
    

    在這里插入圖片描述

  2. 啟動 Tomcat

    [root@web01 ~]# systemctl start tomcat
    
  3. Window 安裝 JDK

    配置環境變量:

    • JAVA_HOME=D:\...\jdk1.8.0_212
    • Path=%JAVA_HOME%\bin;
    C:\Users\86152>java -version
    java version "1.8.0_212"
    Java(TM) SE Runtime Environment (build 1.8.0_212-b10)
    Java HotSpot(TM) 64-Bit Server VM (build 25.212-b10, mixed mode)
    
  4. 監控

    • 使用 JConsole 監控

      路徑:D:\...\jdk1.8.0_212\bin\jconsole.exe

      1. 打開 JConsole2. 選擇 遠程連接 → 輸入 IP:指定 JMX 端口3. 如果關閉認證/SSL,則為“不安全連接”4. 進入控制臺即可查看 JVM 的內存、線程、類加載等信息
      

      在這里插入圖片描述

    • 使用 JVisualVM 監控

      路徑:D:\...\jdk1.8.0_212\bin\jvisualvm.exe

      1. 打開 JVisualVM2. 添加遠程主機 → 輸入主機名/IP(不用帶端口)3. 添加 JMX 連接 → 輸入 IP:指定 JMX 端口4. 雙擊連接,即可查看監控效果
      


      在這里插入圖片描述


二:監控命令

1)jps

  • 作用:查看正在運行的 Java 進程(類似 ps -ef | grep java,但只顯示 Java 進程)。

  • 常用命令

    # 查看所有 Java 進程
    jps# 查看詳細信息(主類名、JVM參數等)
    jps -lvm | grep tomcat
    

2)jstack

  • 作用:查看指定 Java 進程的線程信息,用于分析線程狀態、死鎖等問題。

  • 操作步驟

    線程狀態說明:

    1. NEW:新建
    2. RUNNABLE:就緒
    3. RUNNING:運行中
    4. BLOCKED:阻塞(常見于 IO)
    5. DEAD:死亡
    # 查看 Java 進程 PID
    jps
    80177 Bootstrap# 查看該進程的線程棧信息
    jstack 80177# 僅查看線程狀態
    jstack 80177 | grep -i state
    

3)jmap

  • 作用:查看或導出 JVM 內存信息

  • 常用命令

    # 查看 JVM 內存使用情況
    jmap -heap 80177# 導出 JVM 內存鏡像文件(用于分析)
    jmap -dump:format=b,file=8080.hprof 80177
    

4)MAT 工具分析

  • 作用圖形化分析 .hprof 堆內存鏡像文件,排查內存泄漏、對象占用過大等問題。

  • 使用步驟

    1. 在 Linux 導出堆文件:

      jmap -dump:format=b,file=8080.hprof 80177sz 8080.hprof   # 傳輸到本地
      
    2. Windows/Mac/Linux 安裝 MAT

      下載地址: Memory Analyzer (MAT) | The Eclipse Foundation

      在這里插入圖片描述
      在這里插入圖片描述

    3. 打開 .hprof 文件

      1. 歡迎頁選擇 Open a Heap Dump2. 選擇 Leak Suspects Report 查看內存泄漏報告
      

三:監控腳本

show-busy-java-thread.sh 顯示當前環境中,所有繁忙的java線程. 以百分數顯示使用率最高的前幾個線程.

#!/bin/bash
# @Function
# Find out the highest cpu consumed threads of java, and print the stack of these threads.
#
# @Usage
#   $ ./show-busy-java-threads.sh
#
# @author Jerry Leereadonly PROG=`basename $0`
readonly -a COMMAND_LINE=("$0" "$@")usage() {cat <<EOF
Usage: ${PROG} [OPTION]...
Find out the highest cpu consumed threads of java, and print the stack of these threads.
Example: ${PROG} -c 10Options:-p, --pid       find out the highest cpu consumed threads from the specifed java process,default from all java process.-c, --count     set the thread count to show, default is 5-h, --help      display this help and exit
EOFexit $1
}readonly ARGS=`getopt -n "$PROG" -a -o c:p:h -l count:,pid:,help -- "$@"`
[ $? -ne 0 ] && usage 1
eval set -- "${ARGS}"while true; docase "$1" in-c|--count)count="$2"shift 2;;-p|--pid)pid="$2"shift 2;;-h|--help)usage;;--)shiftbreak;;esac
done
count=${count:-5}redEcho() {[ -c /dev/stdout ] && {# if stdout is console, turn on color output.echo -ne "\033[1;31m"echo -n "$@"echo -e "\033[0m"} || echo "$@"
}yellowEcho() {[ -c /dev/stdout ] && {# if stdout is console, turn on color output.echo -ne "\033[1;33m"echo -n "$@"echo -e "\033[0m"} || echo "$@"
}blueEcho() {[ -c /dev/stdout ] && {# if stdout is console, turn on color output.echo -ne "\033[1;36m"echo -n "$@"echo -e "\033[0m"} || echo "$@"
}# Check the existence of jstack command!
if ! which jstack &> /dev/null; then[ -z "$JAVA_HOME" ] && {redEcho "Error: jstack not found on PATH!"exit 1}! [ -f "$JAVA_HOME/bin/jstack" ] && {redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack file does NOT exists!"exit 1}! [ -x "$JAVA_HOME/bin/jstack" ] && {redEcho "Error: jstack not found on PATH and $JAVA_HOME/bin/jstack is NOT executalbe!"exit 1}export PATH="$JAVA_HOME/bin:$PATH"
fireadonly uuid=`date +%s`_${RANDOM}_$$cleanupWhenExit() {rm /tmp/${uuid}_* &> /dev/null
}
trap "cleanupWhenExit" EXITprintStackOfThread() {local linelocal count=1while IFS=" " read -a line ; dolocal pid=${line[0]}local threadId=${line[1]}local threadId0x=`printf %x ${threadId}`local user=${line[2]}local pcpu=${line[4]}local jstackFile=/tmp/${uuid}_${pid}[ ! -f "${jstackFile}" ] && {{if [ "${user}" == "${USER}" ]; thenjstack ${pid} > ${jstackFile}elseif [ $UID == 0 ]; thensudo -u ${user} jstack ${pid} > ${jstackFile}elseredEcho "[$((count++))] Fail to jstack Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user})."redEcho "User of java process($user) is not current user($USER), need sudo to run again:"yellowEcho "    sudo ${COMMAND_LINE[@]}"echocontinuefifi} || {redEcho "[$((count++))] Fail to jstack Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user})."echorm ${jstackFile}continue}}blueEcho "[$((count++))] Busy(${pcpu}%) thread(${threadId}/0x${threadId0x}) stack of java process(${pid}) under user(${user}):"sed "/nid=0x${threadId0x} /,/^$/p" -n ${jstackFile}done
}ps -Leo pid,lwp,user,comm,pcpu --no-headers | {[ -z "${pid}" ] &&awk '$4=="java"{print $0}' ||awk -v "pid=${pid}" '$1==pid,$4=="java"{print $0}'
} | sort -k5 -r -n | head --lines "${count}" | printStackOfThread

四:Java 系統負載與性能排查流程

1)初步觀察系統負載

  • 使用 w / top / uptime 查看系統整體負載

  • 如果 負載 > CPU 核心數 × 60%~70%,說明系統存在瓶頸

  • 命令:

    w
    uptime
    lscpu
    top -1
    

2)判斷負載來源

  • CPU 負載

    • 命令:top → 觀察 %us(用戶態 CPU 占比)
    • 若 CPU 過高,說明是計算型壓力
    • 工具:ps aux / htop / top
  • IO 負載

    • 命令:top → 觀察 %wa(I/O 等待占比)
    • 若 IO 過高,說明磁盤或網絡瓶頸
    • 工具:iotop

3)確定問題進程

  • 使用 ps aux / htop / top 查找占用 CPU/內存較高的進程
  • 獲取 Java 進程 ID (PID)

4)進一步分析

  1. 查看日志

    • 檢查應用日志(如 catalina.out),排查異常或錯誤
  2. 線程分析

    • 使用 jstack 查看線程堆棧信息

    • 關注線程狀態(Runnable、Blocked、Waiting 等)

    • 示例:

      jstack <pid>
      jstack <pid> | grep -i state
      
  3. JVM 內存分析

    • 導出堆內存鏡像:

      jmap -dump:format=b,file=/root/jvm.hprof <pid>
      
    • 查看 JVM 內存使用情況:

      jmap -heap <pid>
      
  4. 堆文件分析

    • .hprof 文件傳至本地
    • 使用 MemoryAnalyzer Tool (MAT)Eclipse MAT 插件打開
    • 重點查看:
      • Leak Suspects Report(內存泄漏嫌疑報告)
      • 對象占用情況(哪些類實例過多/占用大)

5)問題解決與總結

  1. 根據 jstack 定位線程死鎖/阻塞點
  2. 根據 jmap + MAT 分析內存泄漏問題
  3. 結合日志和監控,優化代碼或調整 JVM 參數
  4. 驗證問題是否解決

總結

📌 本節重點回顧

  • 監控工具

    • 學會了通過 JMX 遠程監控,結合 JConsole、JVisualVM 等工具查看 JVM 內存、線程、類加載等運行狀態。

    • 掌握了在 Linux 修改 catalina.sh 啟動參數 的方法,開啟遠程監控端口。

  • 監控命令

    • jps → 查看 Java 進程

    • jstack → 分析線程堆棧,定位死鎖/阻塞

    • jmap → 導出內存快照,分析堆使用情況

    • 配合 MAT 工具 圖形化分析 .hprof,排查內存泄漏

  • 監控腳本

    • 通過 show-busy-java-thread.sh 快速定位 最耗 CPU 的線程,并打印線程堆棧信息,便于排錯。
  • 性能排查流程

    • 先看系統整體負載(w、top、uptime)

    • 判斷是 CPU 負載 還是 IO 負載

    • 確定問題進程 → 結合 jstack / jmap 分析

    • 使用 日志 + 堆分析工具(MAT) 找出瓶頸

    • 優化代碼、JVM 參數或系統資源配置

? 至此,你已經掌握了 Tomcat 與 JVM 的監控手段,能從 進程 → 線程 → 內存 → 系統層面 全方位排查性能問題。
下一篇將進入 Tomcat 優化與安全加固,進一步打造穩定、高性能的生產環境。

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

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

相關文章

技術干貨丨HyperMesh 新界面功能與技術升級解析

全文內容選自 Altair 區域技術交流會華東站Altair 高級技術經理 張晨《HyperWorks 2025&#xff1a;下一代建模可視化和二次開發平臺》演講1、引言今天我為大家介紹 HyperMesh——這個大家既熟悉又陌生的工具。說熟悉&#xff0c;是因為它一直是工程仿真領域的主流建模軟件&…

《IC驗證必看|隨機穩定性 / 再現性》

同一用例 A 機 pass、B 機 fail&#xff1f;——SystemVerilog 隨機穩定性 / 可復現性全攻略&#xff08;含代碼與排查清單&#xff09;你該到什么水平&#xff1f;&#xff08;對標 20k / 25k / 30k&#xff09; 20k&#xff08;入門會用&#xff09; 會 randomize()、$urando…

字符編碼的本質

目的 最近做一個加密方面的研究&#xff0c;加密之后的二進制&#xff0c;通過轉碼之后&#xff0c;再也找不回之前的二進制了。 怎么試都不行&#xff0c;真是非常得奇怪&#xff01;&#xff01;&#xff01;&#xff01;先說說字符編碼基礎知識 在信息技術的海洋中&#xff…

網格圖--Day03--網格圖DFS--2658. 網格圖中魚的最大數目,1034. 邊界著色,1020. 飛地的數量

網格圖–Day03–網格圖DFS–2658. 網格圖中魚的最大數目&#xff0c;1034. 邊界著色&#xff0c;1020. 飛地的數量 今天要訓練的題目類型是&#xff1a;【網格圖DFS】&#xff0c;題單來自靈艾山茶府。 適用于需要計算連通塊個數、大小的題目。 部分題目做法不止一種&#xff0…

新能源車焊接中發那科機器人保護氣省氣方法

在新能源汽車制造領域&#xff0c;焊接工藝是保障車身結構強度與安全性的關鍵環節&#xff0c;發那科焊接機器人憑借高精度與穩定性成為產線主力設備。保護氣體消耗在焊接成本中占比顯著&#xff0c;尋找高效省氣方法成為行業降本增效的核心需求。WGFACS節氣裝置以智能化控制技…

CornerNet2025再研究---將目標檢測問題視作關鍵點檢測與配對

CornerNet于2019年3月份提出&#xff0c;CW近期回顧了下這個在當時引起不少關注的目標檢測模型&#xff0c;它的亮點在于提出了一套新的方法論——將目標檢測轉化為對物體成對關鍵點(角點)的檢測。通過將目標物體視作成對的關鍵點&#xff0c;其不需要在圖像上鋪設先驗錨框(anc…

【C++】vector(2)

目錄 1. insert的實現 2. 迭代器失效 2.1 迭代器失效的兩種情況 指向已釋放的內存&#xff08;物理失效&#xff09; 元素移動導致迭代器指向錯誤&#xff08;邏輯失效&#xff09; 2.2 修改代碼 3. erase的實現 ?編輯修改代碼 4. resize的實現 5. 構造函數 5.1 默認…

機器翻譯:python庫translatepy的詳細使用(集成了多種翻譯服務)

更多內容請見: 機器翻譯修煉-專欄介紹和目錄 文章目錄 一、translatepy概述 1.1 translatepy介紹 1.1 安裝 二、基本使用 2.1 初始化 `Translator` 2.2 文本翻譯 2.3 語言檢測 2.4 獲取翻譯備選方案 2.5 單詞音標獲取 2.6 語音合成 2.7 例句查詢 2.8 拼寫檢查 三、高級功能 3.…

Spring Bean生命周期的完全指南

簡介&#xff1a;超越Bean——揭開Spring Bean的隱秘生活 想象一場復雜宏大的舞臺劇。作為觀眾&#xff0c;我們看到的是最終的演出——一個流暢運行的應用程序。但在這光鮮的幕后&#xff0c;隱藏著一套嚴謹細致的流程&#xff1a;選角&#xff08;實例化Bean&#xff09;、試…

網絡安全A模塊專項練習任務九解析

任務九&#xff1a;Linux操作系統安全配置-2任務環境說明&#xff1a; (Linux)系統&#xff1a;用戶名root&#xff0c;密碼1234561. 設置禁止使用最近用過的6個舊密碼&#xff0c;將配置文件中對應的部分截圖&#xff1b;編輯/etc/pam.d/system-auth文件&#xff0c;找到passw…

Linex進程管理

一、進程查看命令1.pstree用于查看進程樹之間的關系&#xff0c;誰是父進程&#xff0c;誰是子進程&#xff0c;可以清楚的看出來是誰創建了誰語法&#xff1a;pstree [選項] -A各進程樹之間的連接以ASCII碼字符來連接-U各進程樹之間的連接以utf8字符來連接&#xff0c;某些終…

手寫MyBatis第47彈:Interceptor接口設計與Invocation上下文傳遞機制--MyBatis動態代理生成與方法攔截的精妙實現

&#x1f942;(???)您的點贊&#x1f44d;?評論&#x1f4dd;?收藏?是作者創作的最大動力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;點贊&#x1f44d;收藏??留言&#x1f4dd;歡迎留言討論 &#x1f525;&#x1f525;&…

自動駕駛中的傳感器技術37——Lidar(12)

這里對當前Lidar中的一些常見問題進行專項論述。首先以禾賽Lidar為例&#xff0c;列出相關參數&#xff0c;以備論述。 圖1 禾賽AT128參數圖2 禾賽AT360參數圖3 禾賽AT1440參數圖4 禾賽AT128可靠性驗證項圖5 禾賽AT128產品證書1、Lidar的線束是什么&#xff0c;由什么決定&…

Meteor主題友鏈頁面自研

發布于&#xff1a;Eucalyptus-Blog Meteor主題雖然設計簡約現代&#xff0c;但由于缺乏原生的友情鏈接管理功能&#xff0c;許多博主只能將友情鏈接勉強添加在網站底部&#xff0c;這不僅影響頁面美觀&#xff0c;也不便于訪客查找和互動&#xff1b;為了解決這一痛點&#xf…

QT控件QPlainTextEdit、QTextEdit與QTextBrowser的區別

一.主要功能對比二.關鍵功能差異1.文本類型支持QPlainTextEdit&#xff1a;僅支持純文本&#xff08;Plain Text&#xff09;&#xff0c;不處理任何格式&#xff08;如字體、顏色、鏈接、圖片等&#xff09;。文本以原始字符形式存儲&#xff0c;適合處理日志、代碼、配置文件…

【思考】WSL是什么

WSL WSL是什么呢&#xff1f; WSL 是 windows subsystem for linux 的簡寫&#xff0c;指的是 windows10 的一個子系統&#xff0c;這個子系統的作用是在 windows 下運行 linux 操作系統。 有了WSL&#xff0c;就可以在 windows10 中運行linux操作系統了。許多在 linux 種運行的…

基于單片機智能飲水機/智能熱水壺

傳送門 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目速選一覽表 &#x1f449;&#x1f449;&#x1f449;&#x1f449;其他作品題目功能速覽 概述 基于單片機的智能飲水機系統通過嵌入式技術實現水溫控制、水量監測及用戶交互功能。系統采用STM3…

Unity游戲打包——iOS打包基礎、傳包

本文由 NRatel 歷史筆記整理而來&#xff0c;如有錯誤歡迎指正。 相關參考文檔 Unity文檔 -> 平臺開發 -> IOS https://docs.unity3d.com/cn/2021.3/Manual/iphone.html Unity導出的Xcode 項目的結構 Modifying an Xcode project use Xcode.PBXProject. https://doc…

pyside6小項目:進制轉換器

from PySide6.QtUiTools import QUiLoader from PySide6.QtWidgets import QApplication,QWidgetclass MyWindow(QWidget):def __init__(self):super().__init__()self.ui QUiLoader().load(trans.ui)self.ui.show()#stor data type dictionaryself.lengthVar {米:100, 千米:…

再見 K8s!3款開源的云原生部署工具

前文&#xff0c;和大家分享了云原生中的核心工具 K8s&#xff1a; 關于 K8s&#xff1a;入門&#xff0c;這篇就夠了 K8s是個好東西&#xff0c;就是上手門檻有點高。這不&#xff0c;需求就來了&#xff1f; 有需求&#xff0c;就有工具。 為了解決K8s的配置難題&#xf…