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

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


咨詢(xún)
建站咨詢(xún)
