【发布时间】:2011-11-08 18:21:41
【问题描述】:
我有一个程序需要动态(即在运行时)打开可用套接字并在其上启动 JMX 代理。此 JMX 参数是在 Java 代码中设置的,而不是通过命令行设置的。这工作正常。此后需要通过 Java Visual VM 进行监控(即发出 JMX 命令等) 远程
程序中的 RMI 服务器代理采用开箱即用的管理方式,如下所述: http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html
我的问题可以概括为: 这样的命令行属性如何设置到系统级别 通过Java代码,以便可以使用远程分析??
-Dcom.sun.management.jmxremote.port=1234
如果通过命令行设置“jmxremote.port”等参数, 远程监控工作正常。我正在尝试通过Java找到一种方法来做到这一点 而不是通过命令行。
程序不能通过命令行指定端口,因为新的可用端口必须在运行时计算出来。
该过程需要远程监控,并且在本地运行良好。 如果在命令行中没有指定以下参数,Java Visual VM 不会连接到进程。
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=10.0.0.128
我试过了。
System.setProperty("com.sun.management.jmxremote.port",Integer.toString(port));
这是在启动 JMXConnectorServer 之前在程序中完成的第一件事。不幸的是,它不被认可。 Java Visual VM 仅识别运行时属性(即通过命令行指定的 JMX 连接)。
还遇到了可以从java集合类中提取属性但无法跟踪属性“com.sun.management.jmxremote.port=”的方式
public static void setEnv(Map<String, String> newenv) throws Exception {
Class[] classes = Collections.class.getDeclaredClasses();
Map<String, String> env = System.getenv();
for(Class cl : classes) {
if("java.util.Collections$UnmodifiableMap".equals(cl.getName())) {
Field field = cl.getDeclaredField("m");
field.setAccessible(true);
Object obj = field.get(env);
Map<String, String> map = (Map<String, String>) obj;
//map.clear();
map.putAll(newenv);
}
}
}
任何帮助将不胜感激!
【问题讨论】:
-
您应该编辑您的原始问题并包含您在 cmets 中发布的代码示例。