jvm監控需要在配置zabbix編譯環境的時候支持java --enable-java #需要安裝依賴包 yum install java* -y
https://zh.osdn.net/projects/sfnet_zabbix/releases/
1. 重新編譯安裝zabbix ./configure --prefix=/usr/local/zabbix --with-mysql --with-net-snmp --with-libcurl --enable-server --enable-agent --enable-proxy --enable-java --with-openipmi && make && make install
2. 查看是否支持jvm監控 ls /usr/local/zabbix/sbin ------此處為我zabbix安裝目錄 zabbix_agent zabbix_agentd zabbix_java zabbix_proxy zabbix_server-->啟動zabbix_java /usr/local/zabbix/sbin/zabbix_java/startup.sh
3. 編輯catalina.sh,加入如下配置 CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=12345" ----需要將hostname寫入到hosts中
注意:CATALINA_OPTS表示僅對tomcat有效,如果是JAVA_OPTS表示對所有的JAVA進程都有效 --------啟動tomcat和zabbix_java #/usr/local/zabbix/sbin/zabbix_java/start.sh
4. 修改zabbix_server.conf開啟zabbix_java監控
配置zabbix監控java
選擇java模板
5. zabbix監控多台jvm 在tomcat服務器上添加如下配置: CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.0.244"
6. 在zabbix管理頁面配置主機監控即可 如步驟4,ip為tomcat服務器ip,端口為tomcat開放的端口
7. 監控的兩台tomcat jvm都可以看到數據
新生代:主要是用來存放新生的對象。一般占據堆的1/3空間。由於頻繁創建對象,所以新生代會頻繁觸發MinorGC進行垃圾回收。 新生代又分為 Eden區、ServivorFrom、ServivorTo三個區。 Eden區:Java新對象的出生地(如果新創建的對象占用內存很大,則直接分配到老年代)。當Eden區內存不夠的時候就會觸發MinorGC,對新生代區進行一次垃圾回收。 ServivorTo:保留了一次MinorGC過程中的幸存者。 ServivorFrom:上一次GC的幸存者,作為這一次GC的被掃描者 老年代:主要存放應用程序中生命周期長的內存對象。 老年代的對象比較穩定,所以MajorGC不會頻繁執行。在進行MajorGC前一般都先進行了一次MinorGC,使得有新生代的對象晉身入老年代,導致空間不夠用時才觸發。當無法找到足夠大的連續空間分配給新創建的較大對象時也會提前觸發一次MajorGC進行垃圾回收騰出空間。 永久代 指內存的永久保存區域,主要存放Class和Meta(元數據)的信息,Class在被加載的時候被放入永久區域. 它和和存放實例的區域不同,GC不會在主程序運行期對永久區域進行清理。所以這也導致了永久代的區域會隨着加載的Class的增多而脹滿,最終拋出OOM異常。 在Java8中,永久代已經被移除,被一個稱為“元數據區”(元空間)的區域所取代。 元空間的本質和永久代類似,都是對JVM規范中方法區的實現。不過元空間與永久代之間最大的區別在於:元空間並不在虛擬機中,而是使用本地內存。因此,默認情況下,元空間的大小僅受本地內存限制。類的元數據放入 native memory, 字符串池和類的靜態變量放入java堆中. 這樣可以加載多少類的元數據就不再由MaxPermSize控制, 而由系統的實際可用空間來控制. 采用元空間而不用永久代的幾點原因:(參考:http://www.cnblogs.com/paddix/p/5309550.html) 1、為了解決永久代的OOM問題,元數據和class對象存在永久代中,容易出現性能問題和內存溢出。 2、類及方法的信息等比較難確定其大小,因此對於永久代的大小指定比較困難,太小容易出現永久代溢出,太大則容易導致老年代溢出(因為堆空間有限,此消彼長)。 3、永久代會為 GC 帶來不必要的復雜度,並且回收效率偏低。 堆內存和非堆內存:http://www.importnew.com/27645.html
=============================================================================================================================================
更新一下,這個問題困擾了我兩天,百度搜索出來的都是大同小異,沒什么區別。由於我們生產機器firewalld都是開啟的,所以上面的配置會出現No route to host (Host unreachable)情況
cd /mkt/tomcat/8.5.32/
mkdir ./10001/lib ----此處有不同,我們生產的機器用的是同一個catalina.sh,setclasspath.sh,是自己編寫的start.sh來調用tomcat的bin目錄下的腳本和lib下的jar包和類
wget http://mirror.bit.edu.cn/apache/tomcat/tomcat-9/v9.0.12/bin/extras/catalina-jmx-remote.jar -O ./10001/lib
vim ./10001/bin/start.sh 添加一下參數 一般是在catalina.sh添加參數,我們生產是自己寫的啟動腳本,再調用catalina腳本。所以只能在啟動腳本里面添加參數。
export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.0.16 -Djavax.management.builder.initial=" vim ./10001/conf/server.xml <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="12345" rmiServerPortPlatform="12346" /> ---12345為通信端口,12346為數據傳輸端口 firewall-cmd --zone=public --add-port=12345/tcp --permanent firewall-cmd --zone=public --add-port=12346/tcp --permanent fire-cmd --reload 在zabbix監控頁面監控12345端口即可
[liutao@app1 8.5.32]$ cat 10001/bin/startup.sh #!/bin/bash export JAVA_HOME=/mkt/jdk1.8.0_171 export JRE_HOME=/mkt/jdk1.8.0_171/jre export CATALINA_HOME=/mkt/tomcat/8.5.32 export CATALINA_BASE="/mkt/tomcat/8.5.32/10001" export CATALINA_TMPDIR="$CATALINA_BASE/temp" export CATALINA_PID="$CATALINA_BASE/bin/tomcat.pid" #export JAVA_OPTS="-server -Xms512m -Xmx512m -Djava.awt.headless=true -Dtomcat.name=10001 -javaagent:/mkt/skywalking/5.0.0/agent/skywalking-agent.jar -Dskywalking.agent.application_code=dev.mstore10001" export JAVA_OPTS="-server -Xms512m -Xmx512m -Djava.awt.headless=true -Dtomcat.name=10001" export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.0.175 -Djavax.management.builder.initial=" #創建logs目錄 if [ ! -d "$CATALINA_BASE/logs" ]; then mkdir $CATALINA_BASE/logs fi #創建temp目錄 if [ ! -d "$CATALINA_BASE/temp" ]; then mkdir $CATALINA_BASE/temp fi # 調用tomcat啟動腳本 bash $CATALINA_HOME/bin/startup.sh "$@"
[liutao@app1 8.5.32]$ cat 10001/bin/shutdown.sh #!/bin/bash export JRE_HOME=/mkt/jdk1.8.0_171/jre export CATALINA_HOME=/mkt/tomcat/8.5.32 export CATALINA_BASE="/mkt/tomcat/8.5.32/10001" export CATALINA_TMPDIR="$CATALINA_BASE/temp" export CATALINA_PID="$CATALINA_BASE/bin/tomcat.pid" bash $CATALINA_HOME/bin/shutdown.sh "$@"
==================================================================================================== 監控公司jar包 下載cmdline-jmxclient-0.10.3.jar java -jar cmdline-jmxclient-0.10.3.jar - 192.168.0.252:9802 另外沒有加載的類可以使用jdk解壓目錄下bin下面的jstat -gc PID去抓取參數,進行自定義監控
獲取參數:java -jar cmdline-jmxclient-0.10.3.jar - 192.168.0.252:9802 java.lang:name=Metaspace,type=MemoryPool 獲取參數值:java -jar cmdline-jmxclient-0.10.3.jar - 192.168.0.252:9802 java.lang:name=Metaspace,type=MemoryPool Usage 對應的zabbix key為:jmx["java.lang:name=Metaspace,type=MemoryPool","Usage.used"]