服务器开启JMX监控
如果想要对远程服务器的进程进行监控,需要在服务器进行相关设置,启动守护进程。如果想进一步定制自己的MXBean,可以考虑在应用程序中registerMXBean,当然在web应用中也可以借助Spring MBean相关类库进行该操作。
开启JStatd守护进程
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
nohup jstatd -J-Djava.security.policy=/home/java/jstatd.all.policy -J-Djava.rmi.server.logCalls=true &
jstatd -J-Djava.security.policy=jstatd.all.policy
Could not create remote object
access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
java.security.AccessControlException: access denied ("java.util.PropertyPermission" "java.rmi.server.ignoreSubClasses" "write")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:457)
at java.security.AccessController.checkPermission(AccessController.java:884)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.System.setProperty(System.java:789)
at sun.tools.jstatd.Jstatd.main(Jstatd.java:139)
-Dcom.sun.management.jmxremote.port=8888 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.1.165
- -Dcom.sun.management.jmxremote.port:这个是配置远程connection的端口号的,要确定这个端口没有被占用;
- -Dcom.sun.management.jmxremote.ssl=false 指定了 JMX 是否启用 ssl;
- -Dcom.sun.management.jmxremote.authenticate=false指定了JMX 是否启用鉴权(需要用户名,密码鉴权),
- 2,3两个是固定配置,是 JMX的远程服务权限的;
- -Djava.rmi.server.hostname:这个是配置server的IP的;
Could not bind /JStatRemoteHost to RMI Registry
java.rmi.ConnectIOException: Exception creating connection to: 0.0.0.2; nested exception is:
java.net.SocketException: Invalid argument or cannot assign requested address
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:631)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:341)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at java.rmi.Naming.rebind(Naming.java:177)
at sun.tools.jstatd.Jstatd.bind(Jstatd.java:57)
at sun.tools.jstatd.Jstatd.main(Jstatd.java:143)
Caused by: java.net.SocketException: Invalid argument or cannot assign requested address
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
... 7 more
通过阅读下面的文档 http://my.oschina.net/xiaotian120/blog/207015,经过服务器上的一番调研,发现问题出现在hostname上,服务端调用 hostname -i 命令,显示出来的服务器主机名为0.0.0.2(这一点日志中有体现)。
JMX监控认证
-Dcom.sun.management.jmxremote.authenticate=true
-Dcom.sun.management.jmxremote.access.file=/usr/java/jdk1.6.0_32/jre/lib/management/jmxremote.access -Dcom.sun.management.jmxremote.password.file=/usr/java/jdk1.6.0_32/jre/lib/management/jmxremote.password"
错误: 必须限制口令文件读取访问权限: /home/java/jmxremote.password
chmod 400 jmxremote.access 要求该文件是任何用户均不可写的
chmod 700 jmxremote.password 一定注意这个文件默认是不可写的

新建第一个MXBean
MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
ControllerMBean controllerMBean = new ControllerBean();
mbs.registerMBean(controllerMBean, new ObjectName("MyAppmbean:name=controller"));
javax.management.NotCompliantMBeanException: jmx.ControllerBean: Class jmx.ControllerBean is not a JMX compliant MXBean
at com.sun.jmx.mbeanserver.Introspector.throwException(Introspector.java:466)
at com.sun.jmx.mbeanserver.Introspector.getMXBeanInterface(Introspector.java:357)
at com.sun.jmx.mbeanserver.Introspector.checkCompliance(Introspector.java:166)
at com.sun.jmx.interceptor.DefaultMBeanServerInterceptor.registerMBean(DefaultMBeanServerInterceptor.java:317)
at com.sun.jmx.mbeanserver.JmxMBeanServer.registerMBean(JmxMBeanServer.java:522)
at jmx.Main.main(Main.java:16)
public static boolean isMXBeanInterface(Class<?> interfaceClass) {
if (!interfaceClass.isInterface())
return false;
if (!Modifier.isPublic(interfaceClass.getModifiers()) &&
!Introspector.ALLOW_NONPUBLIC_MBEAN) {
return false;
}
MXBean a = interfaceClass.getAnnotation(MXBean.class);
if (a != null)
return a.value();
return interfaceClass.getName().endsWith("MXBean");
// We don't bother excluding the case where the name is
// exactly the string "MXBean" since that would mean there
// was no package name, which is pretty unlikely in practice.
}
<bean id="mbServer" class="org.springframework.jmx.export.MBeanExporter">
<property name="autodetectModeName" value="AUTODETECT_ALL"/>
</bean> <bean name="mydomain:myobj=MyObjectMBean" class="com.api.example.jmx.ControllerBean"/>
基于注解的MBean管理
@Component
@ManagedResource(objectName = "org.springexample.jmx:name=ServerManager", description = "Server Manager")
public class ServerManagerImpl { private String serverName = "springServer";
private boolean serverRunning = true;
private int minPoolSize = 5;
private int maxPoolSize = 10; @ManagedAttribute(description = "The server name.")
public String getServerName() {
return serverName;
} @ManagedAttribute(description = "Server's running status.")
public boolean isServerRunning() {
return serverRunning;
} @ManagedAttribute(description = "Whether or not the server is running.", currencyTimeLimit = 20, persistPolicy = "OnUpdate")
public void setServerRunning(boolean serverRunning) {
this.serverRunning = serverRunning;
} @ManagedOperation(description = "Change db connection pool size.")
@ManagedOperationParameters({
@ManagedOperationParameter(name = "min", description = "Minimum pool size."),
@ManagedOperationParameter(name = "max", description = "Maximum pool size.")
})
public int changeConnectionPoolSize(int minPoolSize, int maxPoolSize) {
Assert.isTrue(minPoolSize > 0, "Minimum connection pool size must be larger than 0, min=" + minPoolSize);
Assert.isTrue(maxPoolSize > minPoolSize, String.format("Minimum connection pool size must be smaller than maximum, min=%s, max=%s", minPoolSize, maxPoolSize)); this.minPoolSize = minPoolSize;
this.maxPoolSize = maxPoolSize; int diff = maxPoolSize - minPoolSize; Random random = new Random();
int currentSize = (minPoolSize + random.nextInt(diff)); return currentSize;
} }
<context:component-scan base-package="com.api.example"/>
<context:mbean-export/>
服务器开启JMX监控的更多相关文章
- Tomcat开启JMX监控 visualvm
Tomcat开启JMX监控 https://blog.csdn.net/dongdong2980/article/details/78476393
- Tomcat开启JMX监控
搭建模拟环境: 操作系统:centos7内存:1Gjdk:1.8.0_131tomcat:8.0.48 环境准备我们这里就不直接演示了,直接配置tomcat的jmx 1.进入到tomcat的bin目录 ...
- Jetty服务器jmx监控
Jetty服务器jmx监控 Jetty 服务器增加jmx,jmx-remote模块 1.修改对应jetty服务器的配置文件start.ini追加如下两行–module=jmx–module=jmx-r ...
- Tomcat调优及JMX监控
Tomcat调优及JMX监控 实验背景 ====================================================== 系统版本:CentOS release 6.5 ( ...
- zabbix通过jmx监控tomcat
Zabbix版本: Zabbix 3.0.2 一.服务端配置 1.安装jdk(版本1.7.0_79) 安装与配置比较简单,过程省略.执行java -version命令,出现类似界面表示成功. 2. ...
- zabbix监控tomcat(使用jmx监控,但不使用系统自带模版)
一,zabbx使用jmx监控tomcat的原理分析 1.Zabbix-Server找Zabbix-Java-Gateway获取Java数据 2.Zabbix-Java-Gateway找Java程序(j ...
- Linux记录-JMX监控JAVA进程
3.修改xxx.sh 加入export JAVA_OPTS="-Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.mana ...
- Linux记录-JMX监控Tomcat上传到falcon
1.登录测试服务器xxxxxx xxxxxx su root输入xxxx 2.先修改Tomcat的启动脚本,(linux下为catalina.sh),添加以下内容: CATALINA_OPTS=&qu ...
- 如何使用JMX监控Kafka
使用kafka做消息队列中间件时,为了实时监控其性能时,免不了要使用jmx调取kafka broker的内部数据,不管是自己重新做一个kafka集群的监控系统,还是使用一些开源的产品,比如yahoo的 ...
随机推荐
- Loom
<iframe width="630" height="394" src="https://www.useloom.com/embed/a9d4 ...
- 获取exe所在目录路径,速度
// test.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <Windows.h> #include &l ...
- RESTful API 学习
/********************************************************************************* * RESTful API 学习 ...
- [LeetCode&Python] Problem 806. Number of Lines To Write String
We are to write the letters of a given string S, from left to right into lines. Each line has maximu ...
- Linux系统nat模式联网——VM是12 系统是cantos7
>点击还原默认设置,然后确定 >选择Vmnet8,VMnet信息自动选中NAT模式 记住子网IP和子网掩码 >点击NAT设置,记住网关IP >点击DHCP.记住IP范围 > ...
- Xcode7( linker command failed with exit code 1)
”Build Settings”->”Enable Bitcode”设置为NO ,因为有些SDK不支持Bitcode
- 动态绑定AJAX,获取下级分类并延迟执行
HTML: <div id='allType'> <div class='allTypeHead'><span>所有分类</span></div& ...
- cache、session与cookie
cache.session.cookie的区别 session把数据保存在服务器端,每一个用户都有属于自己的Session,与别人的不冲突 就是说,你登陆系统后,你的信息(如账号.密码等)就会被保存在 ...
- B树就想到这个
比如要查找60 先在根结点中查,根结点里面有 17 35这2个关键字, 60 > 35,则从右边开始查找 p3指针开始查找 , 到了第二层的最右边的那个结点开始查找 , 里面有 65 8 ...
- 红黑树-算法大神的博客-以及java多线程酷炫的知识
http://www.cnblogs.com/skywang12345/p/3245399.html 解释第5条:从 ->根节点(或者任意个结点)到->所有的末端节点的路径中 ->黑 ...