新聞中心
在當今計算機技術不斷發(fā)展的時代,Linux已成為了一個非常流行的操作系統(tǒng)。而Java虛擬機(JVM)則是許多企業(yè)級和互聯(lián)網(wǎng)應用程序的關鍵組成部分。在這樣的情況下,Linux JVM的可視化監(jiān)控技巧變得尤為重要。本文將為讀者介紹Linux JVM的可視化監(jiān)控技巧,幫助讀者更好地了解和掌握這一技術。

我們提供的服務有:成都網(wǎng)站設計、網(wǎng)站建設、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、永寧ssl等。為上1000家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的永寧網(wǎng)站制作公司
1. 使用JVisualVM
JVisualVM是一個可視化監(jiān)控工具,它可以幫助用戶對JVM進行監(jiān)控和分析。它可以展示各種數(shù)據(jù),比如吞吐量、堆大小、垃圾回收信息等等。JVisualVM是一個自帶的工具,因此無需進行任何安裝即可使用。只需要輸入jvisualvm命令即可打開它。
在界面上,可以看到JVM進程的列表。選擇所需的進程,點擊“監(jiān)視”按鈕即可開始監(jiān)控。此時,JVisualVM會提供進一步的詳細信息和圖表,包括堆大小和使用情況、線程信息、類信息和垃圾回收狀態(tài)等等??梢愿鶕?jù)這些信息進行分析和調(diào)試。
2. 使用JConsole
類似于JVisualVM,JConsole也是一個監(jiān)控JVM并提供運行時信息的工具。不同的是,它是一個輕量級的工具。與JVisualVM不同的是,JConsole需要手動啟動JMX服務??梢允褂靡韵旅顔樱?/p>
“`
java -Dcom.sun.management.jmxremote.port= \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-jar /path/to/jconsole.jar
“`
啟動JConsole后,選擇所需的進程,即可開始監(jiān)控。類似于JVisualVM,JConsole會提供堆大小、線程信息、類信息和垃圾回收信息等等。
3. 使用VisualVM插件
VisualVM是一個用于分析JVM的開源工具。它具有擴展性,并支持多種插件。其中,VisualGC和VisualVM VSX插件被廣泛使用來監(jiān)控和分析JVM。
要安裝這些插件,請打開VisualVM,選擇“工具” -> “插件”菜單,然后選擇所需的插件進行安裝。接下來,選擇所需的JVM進程,使用VisualGC和VisualVM VSX插件進行監(jiān)控和分析。
4. 使用命令行工具
如果需要使用命令行工具來監(jiān)控JVM,則可以使用Jstat和Jmap命令。Jstat命令可用于監(jiān)控JVM性能。它可以顯示堆和垃圾回收信息。Jmap則可以用于生成JVM內(nèi)存的Dump文件。
以下是Jstat命令的使用示例:
“`
jstat -gcutil 1000 10
“`
此命令將顯示指定進程的垃圾回收情況,每秒更新一次,共持續(xù)10次。
以下是Jmap命令的使用示例:
“`
jmap -dump:format=b,file=myfile.bin
“`
此命令將生成一個名為myfile.bin的Dump文件,包含指定進程的JVM內(nèi)容。
結論
相關問題拓展閱讀:
- JVM對于signal的處理及案例分析
- 怎么查看linux的jvm內(nèi)存
- dump內(nèi)存format b什么意思
JVM對于signal的處理及案例分析
Windows的Signal相對少一些, 如下:
Linux的Signal比較多, 如下:
Linux中的Signal可以由 kill 命令發(fā)起, 比如 kill -1 是對某一個進程發(fā)出SIGHUP信息.
JVM 所使用的信號:
信號的類型為
異常、錯誤、中斷和控制碼鄭
。
表 1
注:
信號名稱后提供的數(shù)字是該信號的標準數(shù)值。
使用 -Xrs(減少信號使用)選項來防止 JVM 處理大多數(shù)的信號。有關更多信息,請參閱 Oracle 的 Java? 應用程序啟動程序頁面 。
JVM 線程上的信號 1(SIGHUP)、2(SIGINT)、4(SIGILL)、7(SIGBUS)、8(SIGFPE)、11(SIGSEGV)和 15(SIGTERM)導致 JVM 關閉;因此,應用程序信號處理程序不應該嘗試從這些信號恢復,除非它不再需要 JVM。
以上表格引用原文鏈接:
至于JVM是如何處理這些Signal的, 請參考以下鏈接:
除了JVM默認處理Signal的行為, 我們還可以自定義 SignalHandler 來做一些額外的工作, 比如在關閉JVM之前做一些回收或記錄的事情.
例子:
關閉鉤子使用的方法也很簡單, Runtime.getRuntime().addShutdownHook(Thread hook) 即可。關閉鉤子其實可以看成是一個已經(jīng)初始化了的但還沒啟動的線程,當
JVM關閉時會并發(fā)地執(zhí)行注冊的所有關閉鉤子
。
JVM的關閉方式可以分為三種:
注意:
Hook線程在JVM
正常關閉
才會執(zhí)行,在強制關閉時不會執(zhí)行。(異常關閉沒試過, 有空試一下..)
另外在使用關閉鉤子還要注意以下幾點:
Spring
在初始化容器的時候就會注冊一個hook線程用于清理容器.
JVM進程已經(jīng)不在了, 重遲棗頌啟后, 幾分鐘到半小時之間, 會看到獲取不到spring bean的錯誤日志, 同時系統(tǒng)服務異常.
奇怪的是, 2臺集群中的其他一臺一直都是穩(wěn)定運行, 只有這臺是一直異常狀態(tài).
從以上的日志, 可以看出spring容器已經(jīng)在銷毀中了, 感覺是一個正常的關閉系統(tǒng)的流程.
在監(jiān)控系統(tǒng)(Marvin)中觀察了內(nèi)存的情況, 沒有什么波動, 基本排除了oom的情況.
接下來, 我使用jstack輸出了當時的線程棧信息, 保留現(xiàn)場痕跡.
由上圖所示, 從jstack日志中發(fā)現(xiàn)了2個關鍵的點:
自此, 大家可能已經(jīng)看出來,
SIGHUP
正是JVM會處理的Signal之一, 并且在上面的表格中已經(jīng)清楚的寫著
SIGHUP
的操作是
掛起, 讓JVM正常退出
,
SIGHUP
是
中斷
類型的信號, 上面對于
中斷
類型的信號是這樣描述的:
將從 JVM 進程外部異步發(fā)出中斷信號以請求關閉。
結論:
可惜的是, 找了很多資料, 始終沒有找到確定信號來源的方案. Linux本身也沒有相關的日志, JVM也只能獲取信號的名稱, 對于信號源也是無法確定.(如果有這方面研究的同學望告知..)
找不到根本原因, 那么只能是想辦法繞過這個問題.
所幸的是, 在搜索問題的時候, 讓我知道了Linux還有一個巖漏 nohup 的命令.
nohup命令可以將
程序以忽略掛起信號(
SIGHUP)的方式運行起來,被運行的程序的輸出信息將不會顯示到終端。
于是把JVM的啟動腳本改動了一下:
再次啟動后, 穩(wěn)定運行, 問題解決.
實際上通過JVM本身 -Xrs 的參數(shù)應該也能控制忽略SIGHUP信號的, 但是時間關系, 我沒去實驗..
這里案例也讓我學到了很多JVM的處理細節(jié).
同時也有了一些思考:
排查線上故障的基本步驟無非就是
實際上, 前面3步基本上已經(jīng)能解決大部分的問題了, 剩下的一些疑難問題才會用到第4步. 但是第4步的操作對于實時性的要求是更高的, 必須之一時間搞定, 晚一點可能你就捕捉不到有效的證據(jù)了.
怎么查看linux的jvm內(nèi)存
以WAS為例:
$ ps -ef | grep java
root 1 0 Sep17 ?:02:48 /opt/IBM/帶帆WebSphere/AppServer/java/bin/java -Xms50m -Xmx256m
-Xms 和 -Xmx 分別代表分配JVM的最小內(nèi)存和更大內(nèi)存。
dump內(nèi)存format b什么意思
其中jmap是java自帶的工具查看整個JVM內(nèi)存狀態(tài)jmap-heap要注意的是在使用CMSGC情況下,jmap-heap的執(zhí)行有可能會備消導致JAVA進程掛起查看JVM堆中對象詳細占用情況jmap-histo導出整個JVM中內(nèi)存信息jmap-dump:format=b,file=文件名jhat是sun1.6及以上版本中自帶的一個用于分析JVM堆DUMP文件的工具,基于此工具可分析JVMHEAP中對象的內(nèi)存占用情況jhat-J-Xmx1024M執(zhí)行后等待console中輸入startHTTPserveronport7000即可使用瀏覽器訪問IP:7000eclipseMemoryAnalyzerEclipse提供的一個用于分析JVM堆Dump文件的插件。借助這個插件可查看對象的內(nèi)存占用狀況,引用關系,分析內(nèi)存泄露等。kill-3在Linux上找到Java所在的進程號,然后執(zhí)行以上命令,線程的相關信息就輸出到consolejstackjstack是sunJDK自帶的工具,通過該工具可以看到JVM中線程的運行狀況,包括鎖等待,線程是否在運行執(zhí)行jstack,線程的所有堆棧信息”http”daemonprio=10tid=x0a949bb60nid=0x884waitingformonitorentry”http”這個線程處于等待狀態(tài)。waitingformonitorentry如果在連續(xù)幾次輸出線程堆棧信息都存在于同一個或多個線程上時,則說明系統(tǒng)中有鎖競爭激烈,死鎖,或鎖餓死的想象?!癶ttp”daemonprio=10tix=xxxnid=xxxinobject.wait()java.lang.Thread.State:waiting(onobjectmonitor)該表示http的線程處芹搏于對象的Wait上,等待其他線程的喚醒,這也是線程池的常見用法?!癓owMemoryDetector”daemonprio=10tix=xxnid=xxxrunnablejava.lang.Thread.State:runnable表示“LowMemoryDetector”的線程處于Runable狀態(tài),等待獲取CPU的使用權.參考:/blog/static//jvisualvm一.JavaVisualVM概述對于使用命令行遠程監(jiān)控jvm太麻煩。在jdk1.6中Oracle提供了一個新的可視化的。JVM監(jiān)控工具JavaVisualVM。jvisualvm.exe在JDK的bin目錄下。雙擊啟動JavaVisualVM后可以看到窗口左側“應用程序”欄中有“本地”、“遠程”、“快照”三個項目?!氨镜亍毕嘛@示的是在localhost運行的Java程序的資源占用情況,如果本地有Java程序在運行的話啟動JavaVisualVM即可看到相應的程序名,點擊程序名打開相應的資源監(jiān)控菜單,以圖形的形式列出程序嫌滾祥所占用的CPU、Heap、PermGen、類、線程的統(tǒng)計信息?!斑h程”項下列出的遠程主機上的Java程序的資源占用情況,但需要在遠程主機上運行jstatd守護程序VisualVM分為3類,本地它會自動偵測到,并顯示出來雙擊Local下的任一節(jié)點,看到右邊的變化,你可以監(jiān)控CPU,內(nèi)存,類,線程等運行狀況,實時監(jiān)控服務器性能。右鍵VisualVM我們可以看到ThreadDump,HeapDump做ThreadDump很快,馬上就可以看到結果HeapDump要稍花費一些時間(可以看到當前heap里對象的數(shù)量及占用的比例,做OOM很好用)對其功能不再做描述,可以查閱網(wǎng)上相關質(zhì)量,我們主要講的是如何使用VisualVM遠程監(jiān)控。關于linux jvm可視化監(jiān)控的介紹到此就結束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關注本站。
香港服務器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務提供商,擁有超過10年的服務器租用、服務器托管、云服務器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務器、香港云服務器、免備案服務器等。
當前名稱:快速掌握LinuxJVM可視化監(jiān)控技巧(linuxjvm可視化監(jiān)控)
轉(zhuǎn)載來于:http://fisionsoft.com.cn/article/dpjgjcc.html


咨詢
建站咨詢
