Tomcat配置JMX远程监控(Windown7 Linxu)

一:Window7下配置方式。

1、配置catalina.bat 在第一行加入下面配置 注意下面这些配置要在一行,注意包含空格。

set JAVA_OPTS=-Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=192.168.10.126 -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.authenticate=true -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access

-Djava.rmi.server.hostname=xxx.xxx.xxx.xxx   主机地址,内网就写内网地址,外网就写外网地址。

-Dcom.sun.management.jmxremote.port=xxx  端口号、配置完端口号之后需要将此端口开放出来,注意防火墙拦截。

-Dcom.sun.management.jmxremote.authenticate=true是否开启认证、false的时候可以不使用密码访问。

如果不开启认证,下面配置可以省略。

以下配置是开启认证时使用的access文件和password文件。

-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password

-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access

2、拷贝授权文件,这二个文件在 \jdk1.7.0_07\jre\lib\management 文件夹下有模板文件,拷贝一份.放到tomcat/conf文件夹下面。

jmxremote.access

monitorRole   readonly
controlRole   readwrite               create javax.management.monitor.*,javax.management.timer.*               unregister

jmxremote.password

monitorRole  admin123
controlRole  admin321

3、给密码文件授权,不然tomcat startup.bat闪退.

需要修改jmxremote.password文件的访问权限,只有运行Tomcat的用户才能拥有访问权限 :Windows的NTFS文件系统下,选中文件,点右键 -->“属性”-->“安全”--> 点“高级”--> 点“更改权限”--> 去掉“从父项继承....”--> 弹出窗口中选“删除”,这样就删除了所有访问权限。再选“添加”--> “高级”--> “立即查找”,选中你的用户(或用户组,如果选用户不行那就选用户组),例administrator,点“确定",“确定"。来到权限项目窗口,勾选“完全控制”,点“确定”,OK了。

4、重新启动Tomcat,在Windows命令行输入“ntstat -a”查看配置的端口号是否已打开,如果打开,说明上面的配置成功了。 

二:Linxu下配置

1、配置startup.sh

export CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9008 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=true -Djava.rmi.server.hostname=136.16.19.82 -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access"

把上面的配置加在 exec "$PRGDIR"/"$EXECUTABLE" start "[email protected]" 这句话的前面。

2、制作授权文件和windows上面说的一样。

3、授权 chmod600jmx* 给文件授权,不然tomcat无法启动。

4、重新启动tomcat  在输入命令 netstat -an | grep 9008 查看端口是否被占用,如果占用,说明上面的配置成功了。

三、Java代码调用

  1 package com;
  2
  3 import java.io.IOException;
  4 import java.lang.management.ClassLoadingMXBean;
  5 import java.lang.management.ManagementFactory;
  6 import java.lang.management.MemoryMXBean;
  7 import java.lang.management.MemoryUsage;
  8 import java.lang.management.OperatingSystemMXBean;
  9 import java.lang.management.ThreadMXBean;
 10 import java.net.MalformedURLException;
 11 import java.util.HashMap;
 12 import java.util.Map;
 13 import java.util.Timer;
 14 import java.util.TimerTask;
 15 import java.util.concurrent.TimeUnit;
 16
 17 import javax.management.AttributeNotFoundException;
 18 import javax.management.InstanceNotFoundException;
 19 import javax.management.MBeanException;
 20 import javax.management.MBeanServerConnection;
 21 import javax.management.ReflectionException;
 22 import javax.management.remote.JMXConnector;
 23 import javax.management.remote.JMXConnectorFactory;
 24 import javax.management.remote.JMXServiceURL;
 25
 26 public class T {
 27
 28     //private final static String SERVICE_1 = "service:jmx:rmi:///jndi/rmi://xxx.xxx.xxx.xxx:9008/jmxrmi";
 29     private final static String SERVICE_1 = "service:jmx:rmi:///jndi/rmi://xxx.xxx.xxx.xxx:9008/jmxrmi";
 30
 31     /**
 32      * @param args
 33      */
 34     public static void main(String[] args) {
 35
 36         // 10秒调用一次
 37         Timer timer = new Timer();
 38         timer.schedule(new T().new MonitorTask(SERVICE_1), 0, 10000);
 39
 40     }
 41
 42     private class MonitorTask extends TimerTask {
 43
 44         private String service;
 45
 46         public MonitorTask(String service) {
 47             this.service = service;
 48         }
 49
 50         @Override
 51         public void run() {
 52
 53             JMXmonitor(service);
 54         }
 55
 56     }
 57
 58     private static void JMXmonitor(String service) {
 59         JMXConnector jmxConnector = null;
 60
 61         try {
 62             JMXServiceURL ServiceURL = new JMXServiceURL(service);
 63             Map<String, String[]> environment = new HashMap<String, String[]>();
 64             // 用户名密码,在jmxremote.password文件中的密码
 65             String[] credentials = new String[] {"controlRole", "admin321"};
 66             environment.put("jmx.remote.credentials", credentials);
 67             jmxConnector = JMXConnectorFactory.connect(ServiceURL, environment);
 68
 69             MBeanServerConnection mBeanServerConnection = jmxConnector
 70                     .getMBeanServerConnection();
 71
 72             // 获取MemoryMXBean
 73             System.out.println("\nMemory");
 74             MemoryMXBean memoryMXBean = ManagementFactory
 75                     .newPlatformMXBeanProxy(mBeanServerConnection,
 76                             ManagementFactory.MEMORY_MXBEAN_NAME,
 77                             MemoryMXBean.class);
 78
 79             MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();
 80             System.out.println("heapMemoryUsage :");
 81             System.out.println("committed = "
 82                     + convertKB(heapMemoryUsage.getCommitted()));
 83             System.out
 84                     .println("init = " + convertKB(heapMemoryUsage.getInit()));
 85             System.out.println("max = " + convertKB(heapMemoryUsage.getMax()));
 86             System.out
 87                     .println("used = " + convertKB(heapMemoryUsage.getUsed()));
 88
 89             MemoryUsage nonHeapMemoryUsage = memoryMXBean
 90                     .getNonHeapMemoryUsage();
 91             System.out.println("\nnonHeapMemoryUsage :");
 92             System.out.println("committed = "
 93                     + convertKB(nonHeapMemoryUsage.getCommitted()));
 94             System.out.println("init = "
 95                     + convertKB(nonHeapMemoryUsage.getInit()));
 96             System.out.println("max = "
 97                     + convertKB(nonHeapMemoryUsage.getMax()));
 98             System.out.println("used = "
 99                     + convertKB(nonHeapMemoryUsage.getUsed()));
100
101             // 获取 ThreadMXBean
102             System.out.println("\nThread");
103             ThreadMXBean threadMXBean = ManagementFactory
104                     .newPlatformMXBeanProxy(mBeanServerConnection,
105                             ManagementFactory.THREAD_MXBEAN_NAME,
106                             ThreadMXBean.class);
107             System.out
108                     .println("ThreadCount = " + threadMXBean.getThreadCount());
109             System.out.println("DaemonThreadCount = "
110                     + threadMXBean.getDaemonThreadCount());
111             System.out.println("PeakThreadCount = "
112                     + threadMXBean.getPeakThreadCount());
113             System.out.println("CurrentThreadCpuTime = "
114                     + threadMXBean.getCurrentThreadCpuTime());
115             System.out.println("CurrentThreadUserTime = "
116                     + threadMXBean.getCurrentThreadUserTime());
117
118             System.out.println("\nClassLoading");
119             ClassLoadingMXBean classLoadingMXBean = ManagementFactory
120                     .newPlatformMXBeanProxy(mBeanServerConnection,
121                             ManagementFactory.CLASS_LOADING_MXBEAN_NAME,
122                             ClassLoadingMXBean.class);
123             // 当前加载到Java虚拟机中类的数量
124             System.out.println("LoadedClassCount = "
125                     + classLoadingMXBean.getLoadedClassCount());
126             // Java 虚拟机开始执行到目前已经加载的类的总数。
127             System.out.println("TotalLoadedClassCount = "
128                     + classLoadingMXBean.getTotalLoadedClassCount());
129             // Java 虚拟机开始执行到目前已经卸载的类的总数。
130             System.out.println("UnloadedClassCount = "
131                     + classLoadingMXBean.getUnloadedClassCount());
132
133             System.out.println("\nCpu");
134             OperatingSystemMXBean operatingSystemMXBean = ManagementFactory
135                     .newPlatformMXBeanProxy(mBeanServerConnection,
136                             ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME,
137                             OperatingSystemMXBean.class);
138             System.out.println("AvailableProcessors = "
139                     + operatingSystemMXBean.getAvailableProcessors());
140             double ratio = 0.0;
141             long start = System.currentTimeMillis();
142             long startC;
143             try {
144                 startC = (Long) mBeanServerConnection.getAttribute(operatingSystemMXBean.getObjectName(),"ProcessCpuTime");
145                 try {
146                     TimeUnit.SECONDS.sleep(5);
147                 } catch (InterruptedException e) {
148                     e.printStackTrace();
149                 }
150
151                 long end = System.currentTimeMillis();
152                 long endC = (Long) mBeanServerConnection.getAttribute(operatingSystemMXBean.getObjectName(),"ProcessCpuTime");
153
154                 int availableProcessors = operatingSystemMXBean
155                         .getAvailableProcessors();
156                 ratio = (endC - startC) / 1000000.0 / (end - start)
157                         / availableProcessors;
158
159             } catch (AttributeNotFoundException e1) {
160                 // TODO Auto-generated catch block
161                 e1.printStackTrace();
162             } catch (InstanceNotFoundException e1) {
163                 // TODO Auto-generated catch block
164                 e1.printStackTrace();
165             } catch (MBeanException e1) {
166                 // TODO Auto-generated catch block
167                 e1.printStackTrace();
168             } catch (ReflectionException e1) {
169                 // TODO Auto-generated catch block
170                 e1.printStackTrace();
171             }
172
173             System.out.println("CUP使用率" + round(ratio * 100) + "%");
174
175         } catch (MalformedURLException e) {
176             e.printStackTrace();
177             System.out.println("非法的ServiceURL");
178         } catch (IOException e) {
179             e.printStackTrace();
180         } finally {
181             try {
182                 if (jmxConnector != null) {
183                     jmxConnector.close();
184                 }
185             } catch (IOException e) {
186                 e.printStackTrace();
187             }
188         }
189
190     }
191
192     private static String convertKB(long src) {
193
194         if (src <= 0L) {
195             return "0KB";
196         }
197         double conversrc = src / 1024 / 1024;
198
199         return round(conversrc) + "MB";
200     }
201
202     private static float round(double src) {
203         return (float) (Math.round(src * 100)) / 100;
204     }
205 }
时间: 2024-10-20 01:10:30

Tomcat配置JMX远程监控(Windown7 Linxu)的相关文章

修改jmx远程监控wildfly/jboss配置,然后通过jdk自带的visualvm工具来进行性能监控

近新搭建了系统环境,进行压力测试的时候没有一个好的图形化监控方法来比较直观.方便.动态.实时的来监控应用服务器内存.GC.CPU.进程和磁盘等信息,功能非常强大,图像也很友好.但是wildfy配置jmx的文章资料很少,我通过参考官网和一些贴吧实践琢磨出了配置jmx的流程: 1]确认监控端口(一般都是8080端口) standalone:查看standalone.xml中jboss.http.port为8080 domain:查看standalone.xml中jboss.http.port为808

JMX远程监控JVM

远程监控JVM状态需要在JVM启动的时候需要加上一段代码开启这个功能.(以下全部以ubuntu-14-04-server.jdk1.8.tomcat7.0环境为基础) 配置的时候分两种情况:1.无需配置用户访问权限:2.需要配置用户访问权限 先看第一种:首先更改tomcat启动参数(vim catalina.sh)找到 # OS specific support. $var _must_ be set to either true or false. 添加如下变量:JAVA_OPTS="-Dco

利用VisualVm和JMX远程监控Java进程

自Java 6开始,Java程序启动时都会在JVM内部启动一个JMX agent,JMX agent会启动一个MBean server组件,把MBeans(Java平台标准的MBean + 你自己创建的MBean)注册到它里面,然后暴露给JMX client管理.简单来说就是每个Java程序都可以通过JMX来被JMX client管理,而且这一切都是自动发生的.而VisualVm就是一个JMX Client. VisualVm能够自动发现本机的Java进程,如果要监控远程主机上的Java进程则需

JMeter Plugin插件配置及远程监控

下载jmeter plugins 插件: https://jmeter-plugins.org/downloads/all/ 官网建议我们直接下载plugins-manager.jar,然后进行可选择性(勾选)地安装需要的插件功能,这种安装插件方式虽然便捷,不用手工配置jmeter,即可以使用. 但是,作为学习一门技术,动手学习,不断摸索实践,是最有效的学习方法. JMeter Plugins共提供了五类组件:Standard Set . Extras Set .Extras with Libs

tomcat配置JMX

最近看JDK的命令行工具,使用Java VisualVM和Jconsole工具都可以监控java程序的运行情况(包括CUP和内存等的使用情况,线程的运行状态等) 在Java VisualVM 工具里可以直接看到本地运行的java程序(比如Eclipse)的运行状态 如果需要需要监控在tomcat中运行的web应用程序的运行状态的话就要打开tomcat的JMX支持 按照网上的说法,在tomcat 的bin目录下的catalina.bat文件中加入下面一段话(注意不要换行,10000是我自己设置的J

linux 安装jdk,tomcat 配置vsftp 远程连接

不知不觉入行也有一年了,这两天在公司上班有空了就自己装了个vmware虚拟机,装了个红帽6.1完全命令行的操作系统,想着搭个公司现在在用的测试环境,没想到中间碰到了很多问题,不过大部分都解决了,现在可以达到自行上传项目等等操作,在这里把这两天学习的东西记录一下,防止记忆丢失. 一开始,要下载安装虚拟机,我选的是vmware,当然你也可以选择别的虚拟机,比如virtualBox等,虚拟机只是用来装操作系统的一个工具而已,当然vmware可能更强大一些,但是对于我们现在做的操作,随便一个工具就可以.

tomcat配置后台管理监控页面

在tomncat-users.xml文件中添加如下信息 输入地址: http://192.168.1.244:8080/manager/html 输入配置的用户名,密码

jvm远程监控配置,以openfire为例,jmx方式监控

我们有时候需要远程的监控jvm,监控jvm有两种方式: 1.jmx               #测试能监控cpu和内存,线程 2.jstatd          #测试后发现无法监控cpu和内存,线程 由此用jmx来监控,jmx的连接有两种方式rmi和jmxmp 1.以生产环境openfire3.10为例: openfire采用源码的形式安装: 修改 openfire的启动脚本 /var/openfire/bin/openfire.sh,在OPENFIRE_OPTS参数中添加jmx的配置 (t

使用JVisualVM 远程监控Tomcat程序中使用JMX鉴权访问

如何配置JVisualVM远程监控Tomcat程序请参考:http://hiandroidstudio.blog.51cto.com/5902332/1795310 1.配置JMX访问文件     # cd $CATALINA_HOME/conf/     # cp $JAVA_HOME/jre/lib/management/jmxremote.password.template jmxremote.password     # chmod 700 jmxremote.password    (