2018-03-19 | 3 評論 | 300 瀏覽html
前言:java
年後找工做,第一次面試就被一個面試官批評個人系統沒有監控是不行的(其餘的都沒怎麼聊),雖然這個面試好像只是在走個過場(浪費我時間,我請假是要扣工資的!),於我有點不尊重,可是我仍是在此次面試者知道一個經常使用的監控jvm的東西叫JMX(Java Management Extensions,即Java管理擴展)。(後面也有了解到一個叫zabbix的系統,也能夠經過JMX實現對jvm監控,這個系統功能比較多,還能作到微信公衆號異常通知,讀者能夠自行去了解,這裏很少描述)。在搭建這個JMX環境的時候遇到了一些問題,在這裏總結一下,但願有興趣搭建的同窗避免一些沒必要要的坑。git
效果預覽:
github
開始面試
一:經過jmx監控jvmcentos
(ps:全部環境在虛擬機下運行,操做系統爲:centos 7 64)tomcat
安裝虛擬機,用寶塔快速構建一個java(1.8),tomcat8環境。自行下載VisualVm客戶端服務器
開啓tomcat的jmx支持微信
在tomcat的安裝目錄下/www/server/tomcat/bin 修改catalina.sh文件,加入如下一段代碼:jvm
CATALINAOPTS=「$CATALINAOPTS -Dcom.sun.management.jmxremote #開啓遠程
-Dcom.sun.management.jmxremote.port=12345 #開啓jmx監控的端口
-Dcom.sun.management.jmxremote.ssl=false #是否開啓ssl
-Dcom.sun.management.jmxremote.authenticate=false #是否須要權限認證(帳戶密碼)
-Djava.rmi.server.hostname=192.168.181.137」 #本機IP地址
(ps:這是無密碼訪問模式)
**關閉tomcat,必定要確認tomcat是完整關閉的。能夠直接殺死tomcat進程來關閉tomcat
**
kill -9 ps -ef|grep tomcat|awk '{print $2}'
啓動tomcat,觀察啓動日誌
/www/server/tomcat/bin/startup.sh
VisuaIVM 鏈接服務
建立jmx連接
確定會出現這個提示
爲何了?
這是我從網上找到的:這是由於JMX在遠程鏈接時,會隨機開啓一個RMI端口做爲鏈接的數據端口,頗有可能這個端口會被防火牆給阻止,以致於鏈接超時失敗。好在在Java7u25版本後可-Dcom.sun.management.jmxremote.rmi.port=端口號
來定死這個端口,好消息是,你能夠將這個端口和jmx.port
的端口設置成一個端口,這樣防火牆策略就只須要同行一個端口就能夠了。
因此只須要在第2步哪裏添加多一條屬性,指定這個RMI端口,而且與jmx.port一致,而後重啓tomcat就行了。
固然這只是一個簡單的監控,這裏還有一個好用的工具visual GC(能夠看到每個代的jvm內存狀況),可是jmx沒法顯示他。如何可讓這個插件運行起來了?下面繼續。
二:經過jstatd 監控 GC
在Visualvm客戶端上安裝Visual gc 插件,可是因爲oracla已經關閉了這個下載頁面因此在工具上不能自動下載成功
查資料發現,visualvm 已經遷移到了github上了,地址,當即前往
找到適合本身JDK的版本
**把對應的更新地址複製一下,回到Visualvm->工具->插件->設置
把這個地址改爲你剛纔複製的連接,我這裏已經改好了。
修改以後從新更新可用插件,安裝就能夠了。而後重啓Visualvm 就會發現多了一個插件
到如今爲止,咱們仍是不能直接經過jstatd鏈接到服務器上監聽jvm!,首先在服務器上建立一個文件命名爲jstatd.all.policy內容爲:
grant codebase 「file:${java.home}/../lib/tools.jar」 {
permission java.security.AllPermission;
};
命令爲:
vi jstatd.all.policy ,而後把內容複製進去。保存退出!
而後複製到jdk安裝目錄的bin裏面,我這裏的安裝目錄是:/usr/java/jdk1.8.0_121/bin
cp jstatd.all.policy /usr/java/jdk1.8.0_121/bin
進入jdk安裝目錄下:cd /usr/java/jdk1.8.0_121/bin/
運行jstatd
指定端口運行:(切記:必定要把端口放開,不要被防火牆攔截了)
jstatd -J-Djava.security.policy=jstatd.all.policy -p 1099
後面加多一個「&」 能夠後臺運行。
嘗試鏈接,jstatd
默認就是1099端口
你會發現如今仍是連不上的!連不上!連不上!
網上說是由於這個緣由:
須要把這個127.0.0.1 修改爲本機ip地址。(主要不是這個緣由),能夠不修改這個,經過參數的方式指定IP
jstatd -J-Djava.security.policy=jstatd.policy -J-Djava.rmi.server.hostname=192.168.181.138 -p 1099
其實這個並非主要緣由!!!
通過個人反覆測試發現,jstatd 打開的同時還會註冊一個rmi的通訊端口,因爲防火牆的緣由,這個端口被隔離
開了,致使ViualVM 鏈接不上jstatd。
解決方法:
一、關閉防火牆(正式環境中,防火牆是確定開啓的)
二、開啓一個端口對應的通訊端口。(我通常會把39000以上的端口放開,寶塔自動回放開39000-40000的端口)
只要修改下啓動的語句就好
最終版運行語句:
rmiregistry 39000 & jstatd -J-Djava.security.policy=jstatd.policy -J-Djava.rmi.server.hostname=192.168.181.138 -p 1099
這句話的意思:指定註冊的端口爲 39000以上的端口 ,鏈接端口爲 1099(這麼作的好處就是,我不須要再去找出這個註冊的端口是哪個,而後再手動去放開,這樣指定了39000以上端口,會出如今個人開放端口範圍以內。)
手動打開的方法
而後經過pid 查看到相關的端口
而後把它從防火牆放開就好!!!
最終!!!
從新jstatd鏈接以後,GC 獲得了監控!
* ps:這篇博客是整理網上的教程,而後經過本身的屢次試驗得出的方法(避免了網上重複複製的一堆錯誤的教程),若是有不當的地方,還請大佬們提出,共同窗習進步。