JVM學習日記(十五)Day15——性能監控與調優(二)

好了我們這一篇繼續來說命令行監控指令,上一篇說了4個比較重要的指令,其中用的比較多的也就是jstat和jmap了。

jhat:堆轉儲分析工具

他是JDK自帶的分析工具,分析我們上一篇說的jmap轉存的內存快照,??內置了一個微型的HTTP服務器提供Web界面瀏覽分析結果(默認端口是7000),幫助識別內存泄漏和大對象,?同時支持OQL(Object Query Language)查詢,但是已經在JDK9中被刪除了,因為官方推薦使用VissualVM。

#基本語法
jhat [options] <heap-dump-file>#基本用法
# 分析堆轉儲文件并在7000端口啟動服務
jhat heap.hprof# 訪問分析結果
http://localhost:7000
參數說明示例
-stack false關閉對象分配調用棧跟蹤jhat -stack false heap.hprof
-refs false關閉對象引用跟蹤jhat -refs false heap.hprof
-port <port>指定HTTP服務器端口(默認7000)jhat -port 8000 heap.hprof
-exclude <file>指定排除文件(包含排除的類名)jhat -exclude exclude.txt heap.hprof
-baseline <file>指定基準堆轉儲(用于比較)jhat -baseline base.hprof heap.hprof
-debug <int>設置調試級別(0-2)jhat -debug 1 heap.hprof
-version顯示版本信息jhat -version
-h/-help顯示幫助信息jhat -help

?這個表示就已經啟動成功了,可以去瀏覽器的http://localhost:8000/進行訪問,這邊建議小伙伴自己去嘗試查看,知道這個東西就可以了,后面我們還是使用GUI圖形界面去分析的,因為這個會更加的直觀的。

jstack:生成 Java 進程的線程快照

我們上篇說到了jamp的堆快照,這里又有個可以查看線程的快照,因為程序出現卡頓不一定是堆堆問題嘛,也可能是線程的問題,jstack獲取線程快照?:顯示所有 Java 線程的調用棧信息,?診斷死鎖?:自動檢測并報告死鎖線程,分析高 CPU 占用?:結合?top?或?jps?定位問題線程,排查線程阻塞?:識別等待資源或鎖的線程。

#基本語法
jstack [options] <pid>
參數作用示例
-F強制生成線程轉儲(當進程掛起時使用)jstack -F 1234
-l顯示額外鎖信息(包含同步器和?java.util.concurrent?鎖)jstack -l 1234
-m混合模式(顯示 Java 和本地方法棧)jstack -m 1234
-h/-help顯示幫助信息jstack -help

?這里來說一下區別,和jmap不同的就是他不會要求生成文件然后再分析,而是直接把內容打印到控制臺,當然也是可以存文件的,這個文件就是普通的txt文件不需要其他命令或者工具輔助查看了。

jstack -F 1234 > thread_dump.txt
#其實所有的輸出都可以用這種方式存到指定的文件
#這個就是基本信息了
2025-08-01 17:13:34 //快照時間
Full thread dump Java HotSpot(TM) 64-Bit Server VM (21.0.5+9-LTS-239 mixed mode, emulated-client, sharing): //虛擬機信息Threads class SMR info: //一共30個線程,線程的地址如下
_java_thread_list=0x0000600002111ac0, length=30, elements={
0x0000000127010a00, 0x0000000127011200, 0x0000000127011a00, 0x000000011680f600,
0x000000011680d000, 0x000000011680d800, 0x000000011680aa00, 0x00000001268b2c00,
0x00000001269abc00, 0x0000000117102800, 0x0000000126b09200, 0x0000000127333c00,
0x0000000126b1c000, 0x000000012723ec00, 0x0000000117200e00, 0x0000000126b0e000,
0x0000000117008e00, 0x000000012734f000, 0x000000012734f800, 0x0000000127346200,
0x0000000127346a00, 0x000000011721b800, 0x0000000126b36c00, 0x0000000126b3ec00,
0x0000000126b3f400, 0x0000000126b3fc00, 0x0000000127347200, 0x0000000126b40400,
0x0000000127344600, 0x0000000126820000
}"Reference Handler" #9 [32259] daemon prio=10 os_prio=31 cpu=1.76ms elapsed=141885.62s tid=0x0000000127010a00 nid=32259 waiting on condition  [0x000000016ec6e000]
#"Reference Handler"??:線程名稱
??#9?:線程序號(JVM內部編號)
#??[32259]??:原生線程ID(Native Thread ID)
#?daemon?:這是一個守護線程(非用戶線程)
?#prio=10?:Java線程優先級(1-10)
?#os_prio=31?:操作系統線程優先級
?#cpu=1.76ms?:該線程累計使用的CPU時間
?#elapsed=141885.62s?:線程已運行的時間(秒)
?#tid=0x0000000127010a00?:Java線程ID(內存地址)
#?nid=32259?:對應的操作系統線程ID(Native ID)
?#waiting on condition?:線程當前狀態
??#[0x000000016ec6e000]??:線程棧的起始地址java.lang.Thread.State: RUNNABLE//運行狀態at java.lang.ref.Reference.waitForReferencePendingList(java.base@21.0.5/Native Method)at java.lang.ref.Reference.processPendingReferences(java.base@21.0.5/Reference.java:246)at java.lang.ref.Reference$ReferenceHandler.run(java.base@21.0.5/Reference.java:208)

線程狀態(Thread.State)

  • ?RUNNABLE?:線程正在執行或準備執行
  • ?WAITING?:線程等待某個條件(通常需要喚醒)
  • ?BLOCKED?:線程等待獲取鎖
  • ?TIMED_WAITING?:線程在指定時間內等待

這個就是jstack的示例,這里說一下什么是?daemon?:守護線程(JVM退出時不等待這些線程)什么是非daemon?:用戶線程(JVM會等待這些線程結束),簡單來說守護線程就是系統后臺線程比如日志監控、垃圾回收等。

jcmd:多功能命令行工具

怎么說呢這哥們就是一個縫合怪,除了不能替代jstat其余的基本上都可以替代了,感覺前面講的是不是有點多余了。

jcmd [options] <pid|main class> <command> [arguments]
部分含義是否必須示例
jcmd命令本身必須jcmd
[options]全局選項可選-l,?-f
<pid|main class>目標進程標識必須1234?或?com.example.MyApp
<command>要執行的診斷命令可選Thread.print,?GC.heap_dump
[arguments]命令參數可選filename=/tmp/dump.hprof
命令作用示例
VM.flags查看JVM參數jcmd 1234 VM.flags
VM.system_properties查看系統屬性jcmd 1234 VM.system_properties
VM.uptime顯示JVM運行時間jcmd 1234 VM.uptime
VM.version顯示JVM版本jcmd 1234 VM.version
Thread.print生成線程轉儲jcmd 1234 Thread.print
GC.class_histogram顯示類直方圖jcmd 1234 GC.class_histogram
GC.heap_dump生成堆轉儲文件jcmd 1234 GC.heap_dump /path/to/dump.hprof
GC.run_finalization強制執行finalizejcmd 1234 GC.run_finalization
GC.run顯式觸發GCjcmd 1234 GC.run
JFR.start開始JFR記錄jcmd 1234 JFR.start name=myrec settings=profile
JFR.dump導出JFR記錄jcmd 1234 JFR.dump name=myrec filename=rec.jfr
JFR.stop停止JFR記錄jcmd 1234 JFR.stop name=myrec
VM.native_memory本地內存統計jcmd 1234 VM.native_memory summary

?突然感覺這個命令有點復雜了有木有,主包這邊就不演示了,這么多參數和命令又點頭疼,具體使用什么命令還是要看小伙伴自己和使用的場景,有興趣的小伙伴自己去試試看吧。

jstatd:遠程監控工具

作用就是為遠程主機提供 JVM 監控數據,通過 RMI 協議提供監控數據,可同時監控多個 Java 進程,支持 VisualVM、JConsole 等工具連接,這個咱們就簡單說一下就好了,因為大多數生成環境是不允許的,多開一個端口都是有風險的。

#基本語法
jstatd [options]
#實例
jstatd -J-Djava.security.policy=jstatd.policy -p 3333
參數作用示例
-p <port>指定 RMI 注冊端口jstatd -p 1099
-n <name>指定 RMI 注冊名稱jstatd -n MyJstatd
-J<option>傳遞參數給 JVMjstatd -J-Djava.security.policy=my.policy
-nr不創建 RMI 注冊表jstatd -nr
-r <port>指定 RMI 注冊表端口jstatd -r 1099
-h/-help顯示幫助信息jstatd -h

?總結

本篇把剩下的命令行已經全部介紹完了,下一篇講講GUI圖形界面,大家好好練習命令吧。

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

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

相關文章

Docker國內鏡像列表

Docker 鏡像源列表&#xff08;8月3日更新-長期&免費&#xff09;_docker國內鏡像源-CSDN博客

Orange AI 管理平臺單體版安裝教程(Docker Compose 部署)

Orange AI 管理平臺單體版安裝教程&#xff08;Docker Compose 部署&#xff09; 本文介紹如何通過 Docker Compose 快速安裝 Orange AI 管理平臺單體版&#xff0c;適用于本地開發和測試環境。步驟簡單&#xff0c;適合初學者和有一定運維經驗的用戶。 一、環境準備 已安裝 …

PHP的魔術方法

一、介紹 ?PHP魔術方法是以雙下劃線__開頭的一組特殊方法&#xff0c;用于在對象生命周期、屬性訪問、方法調用等場景中實現自動化操作。?簡化面向對象編程。 二、17個現有的魔術方法 &#xff08;一&#xff09;、對象生命周期相關 1、__construct() 類的構造函數方法&a…

vue2實現類似chatgpt和deepseek的AI對話流打字機效果,實現多模型同時對話

實現多模型同時對話功能特點&#xff1a;1、抽離對話框成單獨組件ChatBox.vue&#xff0c;在新增模型對比窗口時可重復利用2、通過sse與后臺實時數據流&#xff0c;通過定時器實現打字效果3、適應深度思考內容輸出&#xff0c;可點擊展開與閉合4、可配置模型參數&#xff0c;本…

電腦上不了網怎么辦?【圖文詳解】wifi有網絡但是電腦連不上網?網絡設置

一、問題背景 你有沒有遇到過這種情況&#xff1a;電腦右下角的網絡圖標明明顯示連接正常&#xff0c;可打開瀏覽器就是加載不出網頁&#xff0c;聊天軟件也刷不出新消息&#xff1f; 這種 "網絡已連接但無法上網" 的問題特別常見&#xff0c;既不是沒插網線&#xf…

思途Spring學習 0804

SpringBoot 核心概念與開發實踐SpringBoot 是一個基于 Spring 框架的快速開發腳手架&#xff0c;通過約定大于配置的原則簡化了傳統 Spring 應用的初始化配置。其核心目標是整合 Spring 生態&#xff08;如 SSM&#xff09;并支持微服務架構開發。控制反轉&#xff08;IoC&…

Hutool工具類:Java開發必備神器

Hutool工具類使用說明Hutool是一個Java工具類庫&#xff0c;提供了豐富的功能模塊&#xff0c;包括字符串處理、日期時間操作、IO流、加密解密、HTTP客戶端等。以下是一些常用模塊的具體使用方法。字符串工具&#xff08;StrUtil&#xff09;字符串處理是開發中的常見需求&…

Node.js中Buffer的用法

// Buffer 與字符串的轉換示例 // Buffer 是 Node.js 中用于處理二進制數據的類&#xff0c;字符串與 Buffer 之間的轉換是常見操作// 1. 從字節數組創建 Buffer 并轉換為字符串 // Buffer.from(array) 接收一個字節數值數組&#xff0c;創建對應的 Buffer let buf_4 Buffer.f…

【Java 基礎】Java 源代碼加密工具有哪些?

??博主介紹: 博主從事應用安全和大數據領域,有8年研發經驗,5年面試官經驗,Java技術專家,WEB架構師,阿里云專家博主,華為云云享專家,51CTO 專家博主 ?? 個人社區:個人社區 ?? 個人主頁:個人主頁 ?? 專欄地址: ? Java 中級 ??八股文專題:劍指大廠,手撕 J…

es的histogram直方圖聚合和terms分組聚合

你提到的這兩個 Elasticsearch aggs 聚合語句&#xff1a;第一種&#xff1a;histogram 直方圖聚合 "aggs": {"DayDiagram": {"histogram": {"field": "${FiledName}","interval": ${TimeInterval},"extende…

基于Java的AI/機器學習庫(Smile、Weka、DeepLearning4J)的實用

基于Java和AI技術處理動漫視頻 以下是一些基于Java和AI技術處理動漫視頻(如《亞久斗》)的實用案例和實現方法,涵蓋視頻分析、風格轉換、角色識別等方向。每個案例均提供技術思路和關鍵代碼片段。 視頻關鍵幀提取 使用OpenCV提取動漫視頻中的關鍵幀,保存為圖片供后續分析…

筆記本電腦聯想T14重啟后無法識別外置紅米屏幕

【原先是可以連接重啟后不行】按照以下步驟排查和解決&#xff1a;? 1. 基礎排查確認連接方式&#xff1a;檢查是否使用 USB-C轉DP/HDMI線 或 HDMI/DP直連&#xff0c;嘗試更換線纜或接口&#xff08;如換另一個USB-C口或HDMI口&#xff09;。測試顯示器&#xff1a;將紅米顯示…

vue+ts 基礎面試題 (一 )

目錄 1.Vue3 響應式原理 一、 響應式的基本概念 二、 核心機制&#xff1a;Proxy 和依賴追蹤 三、 觸發更新的過程 四、 代碼示例 五、 優勢總結 2.如何實現組件間通信&#xff1f; 一、父子組件通信 1. 父傳子&#xff1a;Props 傳遞 2. 子傳父&#xff1a;自定義事…

Spring AI實戰:SpringBoot項目結合Spring AI開發——提示詞(Prompt)技術與工程實戰詳解

&#x1fa81;&#x1f341; 希望本文能給您帶來幫助&#xff0c;如果有任何問題&#xff0c;歡迎批評指正&#xff01;&#x1f405;&#x1f43e;&#x1f341;&#x1f425; 文章目錄一、前言二、提示詞前置知識2.1 提示詞要素2.2 設計提示詞的通用技巧2.2.1 從簡單開始2.2.…

【后端】Java static 關鍵字詳解

在 Java 中&#xff0c;static 是一個修飾符&#xff0c;用于定義與類相關&#xff08;而非對象實例相關&#xff09;的成員。以下是核心知識點和用法&#xff1a;一、四大用途靜態變量&#xff08;類變量&#xff09; 作用&#xff1a;屬于類&#xff0c;而非實例。所有實例共…

算法訓練營DAY50 第十一章:圖論part01

98. 所有可達路徑 98. 所有可達路徑 【題目描述】 給定一個有 n 個節點的有向無環圖&#xff0c;節點編號從 1 到 n。請編寫一個程序&#xff0c;找出并返回所有從節點 1 到節點 n 的路徑。每條路徑應以節點編號的列表形式表示。 【輸入描述】 第一行包含兩個整數 N&#…

OpenCV:從入門到實戰的全方位指南

目錄 一、OpenCV 簡介 &#xff08;一&#xff09;特點 &#xff08;二&#xff09;應用場景 二、OpenCV 的核心模塊 &#xff08;一&#xff09;core 模塊 &#xff08;二&#xff09;imgproc 模塊 &#xff08;三&#xff09;video 模塊 &#xff08;四&#xff09;f…

如何在 Ubuntu 24.04 上安裝和配置 TFTP 服務器

了解如何在 Ubuntu 24.04 Linux 上安裝 TFTP 以執行基本的文件傳輸。 簡單文件傳輸協議(TFTP)是標準 FTP 的輕量級替代方案,用于在聯網設備之間傳輸文件。與 FTP 和 HTTP 相比,TFTP 更簡單,無需復雜的客戶端-服務器模型即可操作。這就是為什么該協議用于執行基本文件傳輸…

基于 AXI-Lite 實現可擴展的硬件函數 RPC 框架(附完整源碼)

AXI-Lite 實現RPC調用硬件函數服務 &#x1f44b; 本文介紹如何基于 AXI-Lite 總線設計一個通用的“硬件函數調用框架”。主機端&#xff08;PS&#xff09;只需通過寄存器寫入參數與啟動標志&#xff0c;即可觸發 PL 模塊執行指定算法邏輯&#xff0c;并將結果返回。 該機制本…

[spring-cloud: NamedContextFactory ClientFactoryObjectProvider]-源碼閱讀

依賴 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-commons</artifactId><version>4.3.0</version> </dependency>源碼 NamedContextFactory NamedContextFactory 類通過創建多個子…