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 "$@" 这句话的前面。
2、制作授权文件和windows上面说的一样。
路径也可以写成绝对路径
-Dcom.sun.management.jmxremote.password.file=/usr/apache-tomcat-7.0.47/conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=/usr/apache-tomcat-7.0.47/conf/jmxremote.access"
3、授权 chmod
600
jmx* 给文件授权,不然tomcat无法启动。
4、重新启动tomcat 在输入命令 netstat -an | grep 9008 查看端口是否被占用,如果占用,说明上面的配置成功了。
三、Java代码调用
package com; import java.io.IOException;
import java.lang.management.ClassLoadingMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.MemoryUsage;
import java.lang.management.OperatingSystemMXBean;
import java.lang.management.ThreadMXBean;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.TimeUnit; import javax.management.AttributeNotFoundException;
import javax.management.InstanceNotFoundException;
import javax.management.MBeanException;
import javax.management.MBeanServerConnection;
import javax.management.ReflectionException;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL; public class T { //private final static String SERVICE_1 = "service:jmx:rmi:///jndi/rmi://xxx.xxx.xxx.xxx:9008/jmxrmi";
private final static String SERVICE_1 = "service:jmx:rmi:///jndi/rmi://xxx.xxx.xxx.xxx:9008/jmxrmi"; /**
* @param args
*/
public static void main(String[] args) { // 10秒调用一次
Timer timer = new Timer();
timer.schedule(new T().new MonitorTask(SERVICE_1), 0, 10000); } private class MonitorTask extends TimerTask { private String service; public MonitorTask(String service) {
this.service = service;
} @Override
public void run() { JMXmonitor(service);
} } private static void JMXmonitor(String service) {
JMXConnector jmxConnector = null; try {
JMXServiceURL ServiceURL = new JMXServiceURL(service);
Map<String, String[]> environment = new HashMap<String, String[]>();
// 用户名密码,在jmxremote.password文件中的密码
String[] credentials = new String[] {"controlRole", "admin321"};
environment.put("jmx.remote.credentials", credentials);
jmxConnector = JMXConnectorFactory.connect(ServiceURL, environment); MBeanServerConnection mBeanServerConnection = jmxConnector
.getMBeanServerConnection(); // 获取MemoryMXBean
System.out.println("\nMemory");
MemoryMXBean memoryMXBean = ManagementFactory
.newPlatformMXBeanProxy(mBeanServerConnection,
ManagementFactory.MEMORY_MXBEAN_NAME,
MemoryMXBean.class); MemoryUsage heapMemoryUsage = memoryMXBean.getHeapMemoryUsage();
System.out.println("heapMemoryUsage :");
System.out.println("committed = "
+ convertKB(heapMemoryUsage.getCommitted()));
System.out
.println("init = " + convertKB(heapMemoryUsage.getInit()));
System.out.println("max = " + convertKB(heapMemoryUsage.getMax()));
System.out
.println("used = " + convertKB(heapMemoryUsage.getUsed())); MemoryUsage nonHeapMemoryUsage = memoryMXBean
.getNonHeapMemoryUsage();
System.out.println("\nnonHeapMemoryUsage :");
System.out.println("committed = "
+ convertKB(nonHeapMemoryUsage.getCommitted()));
System.out.println("init = "
+ convertKB(nonHeapMemoryUsage.getInit()));
System.out.println("max = "
+ convertKB(nonHeapMemoryUsage.getMax()));
System.out.println("used = "
+ convertKB(nonHeapMemoryUsage.getUsed())); // 获取 ThreadMXBean
System.out.println("\nThread");
ThreadMXBean threadMXBean = ManagementFactory
.newPlatformMXBeanProxy(mBeanServerConnection,
ManagementFactory.THREAD_MXBEAN_NAME,
ThreadMXBean.class);
System.out
.println("ThreadCount = " + threadMXBean.getThreadCount());
System.out.println("DaemonThreadCount = "
+ threadMXBean.getDaemonThreadCount());
System.out.println("PeakThreadCount = "
+ threadMXBean.getPeakThreadCount());
System.out.println("CurrentThreadCpuTime = "
+ threadMXBean.getCurrentThreadCpuTime());
System.out.println("CurrentThreadUserTime = "
+ threadMXBean.getCurrentThreadUserTime()); System.out.println("\nClassLoading");
ClassLoadingMXBean classLoadingMXBean = ManagementFactory
.newPlatformMXBeanProxy(mBeanServerConnection,
ManagementFactory.CLASS_LOADING_MXBEAN_NAME,
ClassLoadingMXBean.class);
// 当前加载到Java虚拟机中类的数量
System.out.println("LoadedClassCount = "
+ classLoadingMXBean.getLoadedClassCount());
// Java 虚拟机开始执行到目前已经加载的类的总数。
System.out.println("TotalLoadedClassCount = "
+ classLoadingMXBean.getTotalLoadedClassCount());
// Java 虚拟机开始执行到目前已经卸载的类的总数。
System.out.println("UnloadedClassCount = "
+ classLoadingMXBean.getUnloadedClassCount()); System.out.println("\nCpu");
OperatingSystemMXBean operatingSystemMXBean = ManagementFactory
.newPlatformMXBeanProxy(mBeanServerConnection,
ManagementFactory.OPERATING_SYSTEM_MXBEAN_NAME,
OperatingSystemMXBean.class);
System.out.println("AvailableProcessors = "
+ operatingSystemMXBean.getAvailableProcessors());
double ratio = 0.0;
long start = System.currentTimeMillis();
long startC;
try {
startC = (Long) mBeanServerConnection.getAttribute(operatingSystemMXBean.getObjectName(),"ProcessCpuTime");
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
} long end = System.currentTimeMillis();
long endC = (Long) mBeanServerConnection.getAttribute(operatingSystemMXBean.getObjectName(),"ProcessCpuTime"); int availableProcessors = operatingSystemMXBean
.getAvailableProcessors();
ratio = (endC - startC) / 1000000.0 / (end - start)
/ availableProcessors; } catch (AttributeNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (InstanceNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (MBeanException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ReflectionException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} System.out.println("CUP使用率" + round(ratio * 100) + "%"); } catch (MalformedURLException e) {
e.printStackTrace();
System.out.println("非法的ServiceURL");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (jmxConnector != null) {
jmxConnector.close();
}
} catch (IOException e) {
e.printStackTrace();
}
} } private static String convertKB(long src) { if (src <= 0L) {
return "0KB";
}
double conversrc = src / 1024 / 1024; return round(conversrc) + "MB";
} private static float round(double src) {
return (float) (Math.round(src * 100)) / 100;
}
}
Tomcat配置JMX远程监控(Windown7 Linxu)的更多相关文章
- 用JMX远程监控Tomcat
要通过JMX远程监控Tomcat,首先需要进行Tomcat的JMX远程配置. 注意:此配置添加在catalina.bat文件开头的注释行(rem)后面即可. 不需鉴权的配置: 先修改Tomcat的启动 ...
- VisualVM使用Jstatd和JMX远程监控配置(转载)
一.Jstatd远程监控服务器配置 jstat可以实时显示本地或远程JVM进程中类装载.内存.垃圾收集.JIT编译等数据.如果要显示远程JVM信息,需要远程主机开启RMI支持,详情如下: 1. 在JA ...
- JMX 远程监控 Linux tomcat 功能实现
作者远程服务器操作系统 CentOS 7.0, tomcat 版本 7.0 1. Linux tomcat 配置 1.1 catalina_opt 配置 可以在 catalina.sh 文件中添加如下 ...
- 利用VisualVm和JMX远程监控Java进程
自Java 6开始,Java程序启动时都会在JVM内部启动一个JMX agent,JMX agent会启动一个MBean server组件,把MBeans(Java平台标准的MBean + 你自己创建 ...
- JMX远程监控JVM
远程监控JVM状态需要在JVM启动的时候需要加上一段代码开启这个功能.(以下全部以ubuntu-14-04-server.jdk1.8.tomcat7.0环境为基础) 配置的时候分两种情况:1.无需配 ...
- JMeter Plugin插件配置及远程监控
下载jmeter plugins 插件: https://jmeter-plugins.org/downloads/all/ 官网建议我们直接下载plugins-manager.jar,然后进行可选择 ...
- tomcat配置JMX
最近看JDK的命令行工具,使用Java VisualVM和Jconsole工具都可以监控java程序的运行情况(包括CUP和内存等的使用情况,线程的运行状态等) 在Java VisualVM 工具里可 ...
- jvm添加jmx远程监控
调JVM监控的时候需要远程连接机器,所以服务器需要开放JMX协议,配置如下. 现在我的项目是jboot-jfinal项目,用的是undertow容器,在启动脚本里面加入 JAVA_OPTS=" ...
- linux 安装jdk,tomcat 配置vsftp 远程连接
不知不觉入行也有一年了,这两天在公司上班有空了就自己装了个vmware虚拟机,装了个红帽6.1完全命令行的操作系统,想着搭个公司现在在用的测试环境,没想到中间碰到了很多问题,不过大部分都解决了,现在可 ...
随机推荐
- Python 文件 fileno() 方法
描述 Python 文件 fileno() 方法返回一个整型的文件描述符(file descriptor FD 整型),可用于底层操作系统的 I/O 操作. 语法 fileno() 方法语法如下: f ...
- SQL触发器 常用语句
一.创建一个简单的触发器 CREATE TRIGGER 触发器名称 ON 表名 FOR INSERT.UPDATE 或 DELETE AS T-SQL 语句 注意:触发器名称是不加引号的. ...
- RGB 常用颜色对照表
http://blog.csdn.net/xiaoting451292510/article/details/8226325
- Objective-C如何使用对象集合学习系列之一
本章介绍如何通过 Foundation 框架使用 Objective-C 处理数组与字典.本章内容: ● 使用 NSArray 与 NSMutableArray 创建数组 ● 在数组中添加.删除与 ...
- python3 bytes 和 string转换
转自:http://www.jb51.net/article/105064.htm 前言 Python 3 最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分. 文本总是 Unicode,由 ...
- ELK日志相关
转: Logstash 讲解与实战应用 原创qw871122016-08-20 16:06:07评论(1)40217人阅读 一.Logstash 介绍 Logstash 是一款强大的数据处理工具,它可 ...
- robotframework + appium 获取android toast
android toast 获取主要方式是在出现toast的时候查找元素:xpath=//*[contains(@text,'记同步')] ,该xpath 表示为toast信息含有 "记 ...
- jmeter经验---java 追加写入代码一例
最近最项目参数化的时候用到,场景是这样的,需要测试A和B两个接口,其中B接口传入的参数必须是传递给A接口过的,所以整理一个思路就是: 1. 正常调用A接口,但是将传递给A接口的参数保存到文本里,此处要 ...
- Bug:java.lang.StackOverflowError: stack size 8MB
在开发的时候遇到了这个Bug:java.lang.StackOverflowError: stack size 8MB Log: 11-27 14:16:37.093 21892-21892/com. ...
- Atitit mybatis 3 3.2 3.3 3.4 新特性attilax总结
Atitit mybatis 3 3.2 3.3 3.4 新特性attilax总结 1.1. iBATIS 3 内的新特性.html1 1.2. MyBatis团队于2013年2月21日正式发布 M ...