JVMj之console Java監視與管理控制臺

jconsole Java監視與管理控制臺

1、jconsole介紹

jconsole (java monitoring and management console)是一款基于JMX (Java Management Extensions)

的可視化監視和管理工具。

2、啟動jconsole

1、在linuxwindwos下通過jconsole啟動即可。

2、然后會自動搜索本機運行的所有虛擬機進程。

3、選擇其中一個進程可開始進行監控。

在這里插入圖片描述

在這里插入圖片描述

3、jconsole基本介紹

jconsole 基本包括以下基本功能:概述內存線程VM概要MBean

運行下面的程序,然后使用jconsole進行監控,注意設置虛擬機參數。

package com.example.controller;import java.util.ArrayList;
import java.util.List;public class Demo1 {static class OOMObject {public byte[] placeholder = new byte[64 * 1024];}public static void fillHeap(int num) throws InterruptedException {// 先運行程序,在執行監控Thread.sleep(20000);List<OOMObject> list = new ArrayList<OOMObject>();for (int i = 0; i < num; i++) {// 稍作延時,令監視曲線的變化更加明顯Thread.sleep(50);list.add(new OOMObject());}System.gc();}public static void main(String[] args) throws Exception {fillHeap(1000);while (true) {//讓其一直運行著}}
}

配置啟動參數:-Xms100M -XX:+UseSerialGC -XX:+PrintGCDetails

在這里插入圖片描述

在這里插入圖片描述

可以切換頂部的選項卡查看各種指標信息:

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

內存監控

內存頁簽相當于可視化的jstat 命令,用于監視受收集器管理的虛擬機內存的變換趨勢。

在這里插入圖片描述

代碼運行,控制臺也會輸出gc日志:

[GC (Allocation Failure) [DefNew: 27305K->3392K(30720K), 0.0087378 secs] 27305K->14929K(99008K), 0.0088041 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 30720K->3369K(30720K), 0.0125603 secs] 42257K->38591K(99008K), 0.0125827 secs] [Times: user=0.01 sys=0.00, real=0.01 secs] 
[GC (Allocation Failure) [DefNew: 30697K->3367K(30720K), 0.0206170 secs] 65919K->63766K(99008K), 0.0206669 secs] [Times: user=0.00 sys=0.02, real=0.02 secs] 
[Full GC (System.gc()) [Tenured: 60398K->66528K(68288K), 0.0339940 secs] 66709K->66528K(99008K), [Metaspace: 9255K->9255K(1058816K)], 0.0343586 secs] [Times: user=0.05 sys=0.00, real=0.04 secs] 

4、線程監控

如果上面的內存頁簽相當于可視化的jstat命令的話,線程頁簽的功能相當于可視化的jstack命令,遇到線程停頓

時可以使用這個頁簽進行監控分析。線程長時間停頓的主要原因主要有:等待外部資源(數據庫連接、網絡資源、

設備資源等)、死循環、鎖等待(活鎖和死鎖)

下面三個方法分別等待控制臺輸入、死循環演示、線程鎖等待演示。

**第一步:**運行下面的代碼。

package com.example.controller;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;public class Demo2 {public static void main(String[] args) throws IOException {waitRerouceConnection();createBusyThread();createLockThread(new Object());}/*** 等待控制臺輸入** @throws IOException*/public static void waitRerouceConnection() throws IOException {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));try {br.readLine();} catch (IOException e) {e.printStackTrace();}}}, "waitRerouceConnection");thread.start();}/*** 線程死循環演示*/public static void createBusyThread() {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {while (true) {;}}}, "testBusyThread");thread.start();}/*** 線程鎖等待演示*/public static void createLockThread(final Object lock) {Thread thread = new Thread(new Runnable() {@Overridepublic void run() {synchronized (lock) {try {lock.wait();} catch (InterruptedException e) {e.printStackTrace();}}}}, "testLockThread");thread.start();}
}

**第二步:**打開jconsole中查看上面程序運行情況,可以查看到3個目標線程。

在這里插入圖片描述

在這里插入圖片描述

**第三步:**查看目標線程信息

waitRerouceConnection線程處于讀取數據狀態,如下圖:

在這里插入圖片描述

testBusyThread線程位于代碼45行,處于運行狀態,如下圖:

在這里插入圖片描述

testLockThread處于活鎖等待狀態,如下圖:

在這里插入圖片描述

只要lock對象的notify()或notifyAll()方法被調用,這個線程便可能激活以繼續執行。

通過 線程 這個窗口可以很方便查詢虛擬機中的線程堆棧信息,對發現系統中的一些問題非常有幫助。

5、線程死鎖演示

**第一步:**運行下面代碼:

package com.example.controller;public class Demo3 {public static void main(String[] args) {User u1 = new User("u1");User u2 = new User("u2");Thread thread1 = new Thread(new SynAddRunalbe(u1, u2, 1, 2, true));thread1.setName("thread1");thread1.start();Thread thread2 = new Thread(new SynAddRunalbe(u1, u2, 2, 1, false));thread2.setName("thread2");thread2.start();}/*** 線程死鎖等待演示*/public static class SynAddRunalbe implements Runnable {User u1, u2;int a, b;boolean flag;public SynAddRunalbe(User u1, User u2, int a, int b, boolean flag) {this.u1 = u1;this.u2 = u2;this.a = a;this.b = b;this.flag = flag;}@Overridepublic void run() {try {if (flag) {synchronized (u1) {Thread.sleep(100);synchronized (u2) {System.out.println(a + b);}}} else {synchronized (u2) {Thread.sleep(100);synchronized (u1) {System.out.println(a + b);}}}} catch (InterruptedException e) {e.printStackTrace();}}}public static class User {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;}public User(String name) {this.name = name;}@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +'}';}}
}

thread1持有u1的鎖,thread2持有u2的鎖,thread1等待獲取u2的鎖,thread2等待獲取u1的鎖,相互需要獲取

的鎖都被對方持有者,造成了死鎖。程序中出現了死鎖的情況,我們是比較難以發現的。需要依靠工具解決。剛好

jconsole就是這個美妙的工具。

**第二步:**在jconsole中打開上面程序的監控信息:

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

在這里插入圖片描述

從上面可以看出代碼39行和46行處導致了死鎖。

在這里插入圖片描述

關于程序死鎖的,我們還可以使用命令行工具jstack來查看java線程堆棧信息,也可以發現死鎖。

在這里插入圖片描述

在這里插入圖片描述

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

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

相關文章

【開源】基于Vue和SpringBoot的獨居老人物資配送系統

項目編號&#xff1a; S 045 &#xff0c;文末獲取源碼。 \color{red}{項目編號&#xff1a;S045&#xff0c;文末獲取源碼。} 項目編號&#xff1a;S045&#xff0c;文末獲取源碼。 目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊三、系統展示四、核心代碼4.1 查詢社區4…

Linux(6):文件與文件系統的壓縮,打包與備份

壓縮文件的用途與技術 由于 1 byte 8 bits &#xff0c;所以每個byte當中會有8個空格&#xff0c;而每個空格可以是0,1。 其實文件里面有相當多的『空間』存在&#xff0c;并不是完全填滿的&#xff0c;而『壓縮』的技術就是將這些『空間』填滿&#xff0c;以讓整個文件占用…

微信小程序商城實例mpvue-xbyjShop-master(附精選源碼32套,涵蓋商城團購等)

mpvue-xbyjShop 基于mpvue的微信小程序商城&#xff08;小程序端&#xff0c;服務端&#xff09; 小程序端 技術棧 mpvue mpvue-router-patch mpvue-entry vuex webpack ES6/7 flyio mpvue-wxparse 項目運行 微信開發中工具選中mpvue-xbyjShop/buyer作為項目目錄即可功…

JavaScript的學習

HTML的學習-CSDN博客 從html的學習中 其實我已經用到了 JavaScript的腳本 &#xff08;GPT&#xff09; 例如 echo <script>alert("賬號密碼錯誤"); window.location"index.html";</script>; 彈窗 然后定位到 index.html 這里能夠讓我們更…

品牌線上竄貨查的出來嗎

如果竄貨不治理會出現什么局面&#xff0c;顯見的當然是渠道混亂&#xff0c;低價叢生&#xff0c;嚴重的還會導致真假混賣&#xff0c;最后所有的后果都會由品牌承擔&#xff0c;口碑的影響是必然的&#xff0c;那品牌的衰敗也會是一種趨勢&#xff0c;所以治理竄貨是品牌發展…

C現代方法(第22章)筆記——輸入/輸出

文章目錄 第22章 輸入/輸出22.1 流22.1.1 文件指針22.1.2 標準流和重定向22.1.3 文本文件與二進制文件 22.2 文件操作22.2.1 打開文件22.2.2 模式22.2.3 關閉文件22.2.4 為打開的流附加文件22.2.5 從命令行獲取文件名22.2.6 臨時文件22.2.7 文件緩沖22.2.8 其他文件操作 22.3 格…

Windows | 模仿網易云任務欄實現自定義按鈕及縮略圖

前言 最近更新網易云發現任務欄按鈕中除了播放相關的按鈕&#xff0c;多了一個喜歡的按鈕&#xff1a; 之前我一直以為網易云任務欄的按鈕只是 Windows 為音樂軟件專門提供的&#xff0c;于是我又看了一眼系統自帶的播放器&#xff0c;發現并沒有愛心按鈕&#xff1a; 這時我就…

計算給定字符串中各個數字的和的平均值…… ← Python 列表

【題目描述】 給定字符串 s"9876543210"。 請編程計算給定字符串中各個數字的和的平均值&#xff0c;并統計大于平均值的數字個數。【算法分析】 ◆ alist("abcd") # Create a list with characters a, b, c, d◆ eval(a[i]) # Converts characters to i…

C在國內就業已經拉胯,ChatGPT告訴我的

文章目錄 一、前言二、ChatGPT查到的數據三、數據亮點 1.C語言近3年數據大跌2.招聘數量每年都在劇增的是全棧工程師3.薪資漲幅最高的是全棧和網安 四、結語 一、前言 不僅前在微信群里搭建了一個ChatGPT 5.0做智能助手&#xff0c;讓他來幫我回答群問題&#xff0c; 搭建好…

數十億美元商機!英國數字基礎設施公司Equinix與法國量子計算公司Alice Bob 合作

?&#xff08;圖片來源&#xff1a;網絡&#xff09; 近日&#xff0c;全球數字基礎設施公司Equinix宣布與全球領先的法國量子計算公司Alice & Bob合作&#xff0c;旨在共同開發市場上最為可靠的量子處理器之一。此次合作將使Equinix公司的客戶通過使用Equinix Metal和Eq…

好的程序員有什么特質呢?

程序員想要提升自己&#xff0c;一定要關注到工作中的方方面面。而一個好的程序員&#xff0c;一般都有這些特質&#xff1a; 弱者抱怨環境&#xff0c;強者改變環境 不要試圖通過抱怨環境來獲得工作環境上的改變&#xff0c;這不僅不會給你帶來任何實質性的改變&#xff0c;…

自定義字符-攝氏度漢字一

本文為博主 日月同輝&#xff0c;與我共生&#xff0c;csdn原創首發。希望看完后能對你有所幫助&#xff0c;不足之處請指正&#xff01;一起交流學習&#xff0c;共同進步&#xff01; > 發布人&#xff1a;日月同輝,與我共生_單片機-CSDN博客 > 歡迎你為獨創博主日月同…

springboot+vue項目如何集成onlyoffice開源文檔組件

一、onlyoffice是什么 ONLYOFFICE 是一個開源的辦公套件&#xff0c;適合多人在線協作。由總部位于總部在拉脫維亞的 IT 公司Acensio System SIA 開發。它提供在線協作文檔編輯器&#xff08;包括文檔、電子表格、演示文稿和表單&#xff09;&#xff0c;適用于 Windows、Linu…

python tkinter使用(五)

python tkinter使用(五) 本篇文章講述tkinter 中treeview的使用 Treeview是一個多列列表框&#xff0c;可以顯示層次數據。 #!/usr/bin/python3 # -*- coding: UTF-8 -*- """Author: zhTime 2023/11/23 下午8:28 .Email:Describe: treeview 使用 "&quo…

項目經理面試題持續更新

1.項目中常用的文檔有哪些&#xff1f; 1、可行性報告 可行性報告的目的是調查和展示任務要求&#xff0c;并確定項目是否值得和可行。可行性由五個主要因素驗證——技術和系統、成本、法律、運營和進度。次要可行性因素包括市場、資源和文化因素。 2、項目章程 項目章程是證明…

Linux上自動掛載windows下的網絡共享文件夾

比如我們想在ubuntu上掛載一個windows的共享文件夾&#xff0c;我們可以用如下方式實現。 首先我們將windows下的文件夾右鍵選擇【屬性】&#xff0c;然后選擇【共享】。 選擇需要共享的用戶&#xff0c;然后設置權限級別。 點擊共享&#xff0c;然后點擊完成。 這樣我們在wi…

Go語言網絡爬蟲工程經驗分享:pholcus庫演示抓取頭條新聞的實例

網絡爬蟲是一種自動從互聯網上獲取數據的程序&#xff0c;它可以用于各種目的&#xff0c;如數據分析、信息檢索、競爭情報等。網絡爬蟲的實現方式有很多&#xff0c;不同的編程語言和框架都有各自的優勢和特點。在本文中&#xff0c;我將介紹一種使用Go語言和pholcus庫的網絡爬…

基于opencv+ImageAI+tensorflow的智能動漫人物識別系統——深度學習算法應用(含python、JS、模型源碼)+數據集(一)

目錄 前言總體設計系統整體結構圖系統流程圖 運行環境爬蟲1.安裝Anaconda2.安裝Python3.63.更換pip源4.安裝Python包5.下載phantomjs 模型訓練1.安裝依賴2.安裝lmageAl 實際應用1.前端2.安裝Flask3.安裝Nginx 相關其它博客工程源代碼下載其它資料下載 前言 本項目通過爬蟲技術…

Word怎么看字數?簡單教程分享!

“我在寫文章時&#xff0c;總是想看看寫了多少字。但是我發現我的Word無法看到字數。在Word中應該怎么查看字數呢&#xff1f;請幫幫我&#xff01;” Word是一個廣泛使用的文檔編輯工具。在我們編輯文章時&#xff0c;如果想查看寫了多少字&#xff0c;也是可以輕松完成的。 …

leetcode:環形鏈表的入環點

題目描述 題目鏈接:力扣&#xff08;LeetCode&#xff09;官網 - 全球極客摯愛的技術成長平臺 題目分析 我們假設起點到環的入口點的距離是L&#xff0c;入口點到相遇點的距離是X&#xff0c;環的長度是C 那么畫圖我們可以得知&#xff1a; 從開始到相遇時slow走的距離是LX從…