JVM學習-監控工具(二)

jmap:導出內存映像文件&內存使用情況
基本情況
  • jmap(JVM Memory Map):一方法獲取dump文件(堆轉儲快照文件,二進制文件),還可以獲取目標Java進程的內存相關信息,包括Java堆各區域的使用情況、堆中對象的統計信息、類加載信息
基本語法
  • jmap [option]
    (to connect to running process)
  • jmap [option] <executable
    (to connect to a core file)
  • jmap [option] [server_id@]
    (to connect to remote debug server)
  • option包括下表:
    在這里插入圖片描述
  • -dump
  • 生成Java堆轉儲快照:dump文件
  • 特別的:-dump:live只保存堆中的存活對象
  • -heap
  • 輸出整個堆空間的詳細信息,包括GC的使用,堆配置信息以及內存使用信息
  • -histo
  • 輸出堆空間中對象的統計信息,包括類,實例數量和合計容量
  • -permstat
  • 以ClassLoader為統計口徑輸出永久代的內存狀態信息
  • finalizeinfo
  • 顯示在F-Queue中等待Finalizer線程執行finalize方法的對象
  • -F
  • 當虛擬機進程對-dump選項沒有任何響應時,強制執行生成dump文件
  • -h | -help
  • 幫助命令
  • -J
  • 傳遞參數給jmap啟動的jvm
導出內存映射文件
  • 將堆中所有存活對象導出至一個文件之中
  • Heap Dump又叫堆存儲文件,指一個Java進程在某個時間點的內存快照,Heap Dump在觸發內存快照的時候會保存此該的信息
  • All Objects
  • All Classes
  • Garbage Collection Roots
  • Thread Stacks and Local Variables
  • ①通常在寫Heap Dump文件前會觸發一次Full GC,所以heap dump文件里保存的都是Full GC后留下的對象信息
  • ②由于生成dump文件比較耗時,需要耐心等待,尤其大內存鏡像生成dump文件,則需要耗費更長的時間來完成
  • 手動方式
  • jmap -dump:format=b,file=<filename.hprof> 注:format=b表示采用圖形化工具能打開對應的hprof文件
  • jmap -dump:live,format=b,file=<filename.hprof>
  • 自動方式
  • 當程序發生OOM退出系統時,一些瞬時停止都隨著程序的終止而消失,而重現OOM問題往往比較困難或者耗時,此時若能在OOM時,自動導出dump文件就顯得很重要
  • -XX:+HeapDumpOnOutOfMemoryError
  • -XX:HeapDumpPath=<filename.hprof>
顯示堆內存相關信息
  • -heap pid:程序運行時
  • -histo pid
其它作用
  • -pemstat pid :查看系統的ClassLoader信息–linux環境下
  • -finzlizerinfo:查看堆積在finalizer隊列中的對象–linux環境下
總結
  • 由于jmap將訪問堆中的所有對象,為了保證在此過程中不被應用線程干擾,jmap需要借助安全點機制,讓所有線程停留在不改變堆中數據的狀態,由jmap導出的堆快照必定是安全點位置的,這可能導致基于該堆快照的分析結果存在偏差
  • 舉個例子:假設在編譯生成的機器碼中,某些對象的生命周期在兩個安全點之間,那么:live選項將無法探知到這些對象
  • 如果某個線程長時間無法跑到安全點,jmap將一直等下去,與前面的jstat不同,垃圾回收器會主動將jstat所需要的摘要數據保存至固定位置之中,而jstat只需直接讀取即可
jhat(JVM Heap Analysis Tool)
  • 基本情況
  • Sun JDK提供了jhat與jmap命令搭配使用,用于分析jmap生成的heap dump文件,jhat內置了一個微型的HTTP/HTML服務器,生成dump文件的分析結果后,用戶可以在瀏覽器中查看分析結果
  • 使用了jhat命令,就啟動了一個http服務,端口7000,通過在瀏覽器中輸入http://localhost:7000獲取分析結果
  • jhat在jdk9,10中已經被刪除,官方建議VisualVM代替
  • 基本語法
  • -stack false | true:關閉 | 打開對象分配調用棧跟蹤
  • -refs false | true : 關閉 | 打開對象引用跟蹤
  • -port port-number 設置jhat HTTP Server端口,默認7000
  • -exclude exclude-file:執行對象查詢時需要排除的數據成員
  • -baseline exclude-file:指定一個基準堆轉儲
  • -debug int:設置Debug級別
  • -version:啟動后顯示版本信息就退出
  • -J :傳入啟動參數,
jstack(JVM Stack Trace)
  • 用于生成虛擬機指定進程當前時刻的線程快照,線程快照是當前虛擬機內指定進程的每一條線程正在執行的方法堆棧的集合
  • 生成線程快照的作用:可用于定位線程出現長時間停頓的原因,如線程間死鎖、死循環,請求外部資源導致的長時間等待等問題,這些都是導致線程長時間停頓的常見原因,當線程出現停頓時,就可以用jstack顯示各個線程調用的堆棧情況
  • 在thread dump中,要留意以下幾種狀態
  • 死鎖,Deadlock
  • 等待資源,Waiting on condition
  • 等待獲取監視器,Waiting on monitor entry
  • 阻塞,Blocked
  • 執行中,Runnable
  • 暫停,Suspended
//①線程死鎖查看
package com.chapter12;
public class ThreadDeadLock {public static void main(String[] args) {StringBuilder s1 = new StringBuilder();StringBuilder s2 = new StringBuilder();new Thread() {@Overridepublic void run() {synchronized (s1) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}synchronized (s2) {s1.append("b");s2.append("2");System.out.println(s1);System.out.println(s2);}}}}.start();new Thread() {@Overridepublic void run() {synchronized (s2) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}synchronized (s1) {s1.append("d");s2.append("4");System.out.println(s1);System.out.println(s2);}}}}.start();}
}
C:\Users\Administrator\IdeaProjects\jvm>jstack 12840
執行結果:
Found one Java-level deadlock:
=============================
"Thread-1":waiting to lock monitor 0x0000000002d0b288 (object 0x000000071649ee08, a java.lang.StringBuilder),which is held by "Thread-0"
"Thread-0":waiting to lock monitor 0x0000000002d0c728 (object 0x000000071649ee50, a java.lang.StringBuilder),which is held by "Thread-1"Java stack information for the threads listed above:
===================================================
"Thread-1":at com.chapter12.ThreadDeadLock$2.run(ThreadDeadLock.java:40)- waiting to lock <0x000000071649ee08> (a java.lang.StringBuilder)- locked <0x000000071649ee50> (a java.lang.StringBuilder)
"Thread-0":at com.chapter12.ThreadDeadLock$1.run(ThreadDeadLock.java:22)- waiting to lock <0x000000071649ee50> (a java.lang.StringBuilder)- locked <0x000000071649ee08> (a java.lang.StringBuilder)Found 1 deadlock.
//①線程Sleep查看
public class ThreadSleepTest {public static void main(String[] args) {System.out.println("hello - 1");try {Thread.sleep(1000 * 60 * 10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("hello - 2");}
}
//執行結果
>> jstack 920
"main" #1 prio=5 os_prio=0 tid=0x00000000036d2800 nid=0x1cb0 waiting on condition [0x000000000320f000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at com.chapter12.ThreadSleepTest.main(ThreadSleepTest.java:12)
//③線程同步測試
class Number implements Runnable {private int number = 1;@Overridepublic void run() {while (true) {synchronized (this) {if (number <= 100) {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + ":" + number);number++;} else {break;}}}}
}
public class ThreadSyncTest {public static void main(String[] args) {Number number = new Number();Thread t1 = new Thread(number);Thread t2 = new Thread(number);t1.setName("線程1");t2.setName("線程2");t1.start();t2.start();}
}
//執行結果
"線程2" #12 prio=5 os_prio=0 tid=0x0000000027b56800 nid=0x3380 waiting on condition [0x000000002879f000]java.lang.Thread.State: TIMED_WAITING (sleeping)at java.lang.Thread.sleep(Native Method)at com.chapter12.Number.run(ThreadSyncTest.java:15)- locked <0x00000007164a1960> (a com.chapter12.Number)at java.lang.Thread.run(Thread.java:748)"線程1" #11 prio=5 os_prio=0 tid=0x0000000027b4d800 nid=0x1d18 waiting for monitor entry [0x000000002869f000]java.lang.Thread.State: BLOCKED (on object monitor)at com.chapter12.Number.run(ThreadSyncTest.java:13)- waiting to lock <0x00000007164a1960> (a com.chapter12.Number)at java.lang.Thread.run(Thread.java:748)
  • 基本語法
  • -F:當正常輸出的請求不被響應時,強制輸出線程堆棧
  • -l:除堆棧外,顯示關于鎖的附加信息
  • -m:如果調用到本地方法的話,可以顯示C/C++堆棧
  • -h:幫助操作
jcmd
基本情況
  • 它是一個多功能工具,可以實現除了jstat之外所有命令的功能,用它來導出堆、內存使用、查看Java進程、導出線程信息、執行GC、JVM運行時間等
基本語法
  • -l:列出所有的JVM進程
  • pid help:針對指定的進程,
  • pid 具體命令

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

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

相關文章

MyBatis學習(二)--MyBatis獲取參數值的兩種方式

1、搭建新的module:mybatis_parameter MyBatis獲取參數值的兩種方式&#xff1a;${}和#{} ${}的本質就是字符串拼接&#xff0c;采用sql拼接&#xff0c;無法防止sql注入 #{}的本質就是占位符賦值 &#xff0c;采用預編譯 防止sql注入 不同參數使用案例 2、單個字面量類型…

OpenHarmony嵌套類對象屬性變化:@Observed裝飾器和@ObjectLink裝飾器

上文所述的裝飾器僅能觀察到第一層的變化&#xff0c;但是在實際應用開發中&#xff0c;應用會根據開發需要&#xff0c;封裝自己的數據模型。對于多層嵌套的情況&#xff0c;比如二維數組&#xff0c;或者數組項class&#xff0c;或者class的屬性是class&#xff0c;他們的第二…

實時瞳孔分割算法-RITnet論文復現

源代碼在這里RITnet-Github 這個模型比較小眾&#xff0c;我們實驗室使用了官方提供的模型進行瞳孔中心位置提取&#xff0c;以實現視線追蹤&#xff0c;效果很好 一、數據集準備 RITnet也是那一屆openEDS數據集挑戰賽的冠軍模型&#xff0c;openEDS數據集可以從Kaggle上下載&a…

數據結構--關鍵路徑

事件v1-表示整個工程開始&#xff08;源點&#xff1a;入度為0的頂點&#xff09; 事件v9-表示整個工程結束&#xff08;匯點&#xff1a;出度為0的頂點&#xff09; 關鍵路徑&#xff1a;路徑長度最長的路徑 求解關鍵路徑問題&#xff08;AOE網&#xff09; 定義四個描述量 …

網絡網絡層之(6)ICMPv4協議

網絡網絡層之(6)ICMPv4協議 Author: Once Day Date: 2024年6月2日 一位熱衷于Linux學習和開發的菜鳥&#xff0c;試圖譜寫一場冒險之旅&#xff0c;也許終點只是一場白日夢… 漫漫長路&#xff0c;有人對你微笑過嘛… 全系列文章可參考專欄: 通信網絡技術_Once-Day的博客-CS…

華為OD刷題C卷 - 每日刷題 7(字符串分隔(二)、歡樂的周末)

兩段代碼分別解決了兩個不同的問題&#xff0c;下面是對它們的概述&#xff1a; 1、&#xff08;字符串分隔&#xff08;二&#xff09;&#xff09;&#xff1a; 這段代碼是解決“字符串分隔&#xff08;二&#xff09;”的問題。它提供了一個Java類Main&#xff0c;其中包含…

Java面試題-Tomcat高級面試題

Tomcat 9相較于之前的版本有哪些主要的新特性&#xff1f; Tomcat 9相較于之前的版本&#xff0c;主要有以下幾個新特性&#xff1a; HTTP/2支持&#xff1a;Tomcat 9引入了對HTTP/2協議的支持&#xff0c;這可以顯著提高網站的性能和安全性。HTTP/2協議允許單個連接上進行多…

多語言for循環遍歷總結

多語言for循環遍歷總結 工作中經常需要遍歷對象&#xff0c;但不同編程語言之間存在一些細微差別。為了便于比較和參考&#xff0c;這里對一些常用的遍歷方法進行了總結。 JAVA 數組遍歷 Test void ArrayForTest() {String[] array {"劉備","關羽", &…

大模型備案項目補貼政策一覽【保持更新】

大模型項目、AI類項目、大模型備案通過后等一籃子財政補貼政策 上海市 加快創新體系構建 1. 提升自主創新水平&#xff1a;對引領大模型發展或取得顛覆性突破的項目&#xff0c;最高給予1000萬元補貼支持。 2. 加強算力資源保障&#xff1a;實施算力伙伴計劃&#xff0c;對…

力扣174題動態規劃:地下城游戲(含模擬面試)

?????? 歡迎來到我的博客。希望您能在這里找到既有價值又有趣的內容&#xff0c;和我一起探索、學習和成長。歡迎評論區暢所欲言、享受知識的樂趣&#xff01; 推薦&#xff1a;數據分析螺絲釘的首頁 關注微信公眾號 數據分析螺絲釘 免費領取價值萬元的python/java/商業…

Java進階學習筆記36——算法

什么是算法&#xff1f; 解決某個實際問題的過程和方法。 1&#xff09;導航&#xff1b; 2&#xff09;滴滴打車&#xff1b; 3&#xff09;抖音&#xff1b; 不同的算法&#xff0c;效率高、性能好&#xff01; 在Java中&#xff0c;代碼已經幫我們寫好了&#xff0c;但為…

雪花算法詳解及源碼分析

雪花算法的簡介&#xff1a; 雪花算法用來實現全局唯一ID的業務主鍵&#xff0c;解決分庫分表之后主鍵的唯一性問題&#xff0c;所以就單從全局唯一性來說&#xff0c;其實有很多的解決方法&#xff0c;比如說UUID、數據庫的全局表的自增ID 但是在實際的開發過程中&#xff0…

離散點云擬合三維平面參數推導(基于最小二乘)

1、背景介紹 實際中&#xff0c;很多人工構造物是由平面結構構造而成&#xff0c;如下圖所示&#xff0c;為一典型的由多個平面組成的人工構筑物。因此&#xff0c;根據離散點擬合成平面&#xff0c;獲取擬合平面方程&#xff0c;是點云數據處理中非常常見的數據處理操作。 2、…

鴻蒙Ability Kit(程序框架服務)【ExtensionAbility組件】

ExtensionAbility組件 ExtensionAbility組件是基于特定場景&#xff08;例如服務卡片、輸入法等&#xff09;提供的應用組件&#xff0c;以便滿足更多的使用場景。 每一個具體場景對應一個[ExtensionAbilityType]&#xff0c;開發者只能使用&#xff08;包括實現和訪問&#…

WPS的excel表格設置了編輯權限,要怎么取消?

在日常生活和工作中&#xff0c;我們經常會使用WPS Office辦公軟件來處理各種文檔&#xff0c;其中WPS Excel表格是我們進行數據處理和分析的重要工具。為了保護表格中的數據不被隨意修改&#xff0c;我們有時會設置編輯權限。然而&#xff0c;隨著時間的推移或需求的變更&…

基于FPGA的SystemVerilog練習

文章目錄 一、認識SystemVerilogSystemVerilog的語言特性SystemVerilog的應用領域SystemVerilog的優勢SystemVerilog的未來發展方向 二、流水燈代碼流水燈部分testbench仿真文件 三、用systemVerilog實現超聲波測距計時器測距部分led部分數碼管部分采樣部分頂層文件引腳綁定效果…

魯教版七年級數學下冊-筆記

文章目錄 第七章 二元一次方程組1 二元一次方程組2 解二元一次方程組3 二元一次方程組的應用4 二元一次方程與一次函數5 三元一次方程組 第八章 平行線的有關證明1 定義與命題2 證明的必要性3 基本事實與定理4 平行線的判定定理5 平行限的性質定理6 三角形內角和定理 第九章 概…

dpdk uio整體分析及網卡加載

參考:https://zhuanlan.zhihu.com/p/477600165 一、Linux內核知識點 1. __attribute__ constructor/destructor (1)若函數被設定為constructor屬性,則該函數會在 main()函數執行之前被自動的執行。 (2)若函數被設定為destructor屬性,則該函數會在main()函數執…

開發和滲透偷懶利器utools

目錄 1.前言 1.1 工具簡介 1.2 核心特性 1.3 使用場景 1.4 安裝與使用 1.4.1 下載&#xff1a; 1.4.2 安裝&#xff1a; 1.4.3 配置&#xff1a; 1.4.4 插件市場&#xff1a; 2.懶狗插件介紹 基本介紹 2.1 數據模擬 2.2 隨機生成虛假數據 2.3 API市場 2.4 Hoppscot…

【十二】圖解mybatis日志模塊之設計模式

圖解mybatis日志模塊之設計模式 概述 最近經常在思考研發工程師初、中、高級工程師以及系統架構師各個級別的工程師有什么區別&#xff0c;隨著年齡增加我們的技術級別也在提升&#xff0c;但是很多人到了高級別反而更加憂慮&#xff0c;因為it行業35歲年齡是個坎這是行業里的共…