zabbix监控java

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"]

posted @ 2018-07-24 16:37  MlxgzZ  阅读(5311)  评论(3编辑  收藏  举报