【问题标题】:How to initialize JRockit MBean tree如何初始化 JRockit MBean 树
【发布时间】:2012-02-17 07:02:13
【问题描述】:

我的以下代码仅列出了在平台 MBean 服务器中找到的所有 MBean 名称:

  public static void main(final String[] args) throws Exception {

    initJMX();

  }

  @SuppressWarnings("unchecked")
  private static void initJMX() throws IOException, MalformedURLException, AttributeNotFoundException,
      InstanceNotFoundException, MalformedObjectNameException, MBeanException, ReflectionException,
      NullPointerException {
    JMXConnector jmxc = null;
    final Map<String, String> map = new HashMap<String, String>();
    jmxc = JMXConnectorFactory.newJMXConnector(createConnectionURL("localhost", 7788), map);
    jmxc.connect();
    final MBeanServerConnection connection = jmxc.getMBeanServerConnection();
    final String[] domains = connection.getDomains();
    for (final String domain : domains) {
      final Set<ObjectName> mBeans = connection.queryNames(new ObjectName(domain + ":*"), null);
      for (final ObjectName name : mBeans) {
        System.out.println(name);
      }
    }
    jmxc.close();
  }

当我尝试使用带有以下参数的 JRockit 1.5.0_4.0.1 运行此代码时:

-Xmanagement:ssl=false,authenticate=false,autodiscovery=false,port=7788

它会打印以下列表:

[INFO ][mgmnt  ] Remote JMX connector started at address localhost:7788 
[INFO ][mgmnt  ] Local JMX connector started
com.oracle.jrockit:type=FlightRecorder
java.util.logging:type=Logging
JMImplementation:type=MBeanServerDelegate
java.lang:type=Compilation
java.lang:type=GarbageCollector,name=Garbage collection optimized for throughput Young Collector
java.lang:type=MemoryManager,name=Class Manager
java.lang:type=MemoryPool,name=ClassBlock Memory
java.lang:type=GarbageCollector,name=Garbage collection optimized for throughput Old Collector
java.lang:type=Runtime
java.lang:type=MemoryPool,name=Nursery
java.lang:type=ClassLoading
java.lang:type=Threading
java.lang:type=MemoryPool,name=Class Memory
java.lang:type=OperatingSystem
java.lang:type=Memory
java.lang:type=MemoryPool,name=Old Space

但是,如果我在调用 initJMX 方法之前放置一个断点,然后使用 JRMC 连接到该 JVM,那么 JRMC 会显示更多的 MBean,并且在我继续执行程序之后,它还会打印一个不同的列表,其中包含更多与 JRockit 相关的MBean:

[INFO ][mgmnt  ] Remote JMX connector started at address T500W7AAD:7788 
[INFO ][mgmnt  ] Local JMX connector started
com.oracle.jrockit:type=FlightRecorder
oracle.jrockit.management:type=PerfCounters
oracle.jrockit.management:type=Compilation
oracle.jrockit.management:type=Log
oracle.jrockit.management:type=Profiler
oracle.jrockit.management:type=MemLeak
oracle.jrockit.management:type=JRockitConsole
oracle.jrockit.management:type=GarbageCollector
oracle.jrockit.management:type=Runtime
oracle.jrockit.management:type=Threading
oracle.jrockit.management:type=DiagnosticCommand
oracle.jrockit.management:type=Memory
java.util.logging:type=Logging
JMImplementation:type=MBeanServerDelegate
java.lang:type=Compilation
java.lang:type=GarbageCollector,name=Garbage collection optimized for throughput Young Collector
java.lang:type=MemoryManager,name=Class Manager
java.lang:type=MemoryPool,name=ClassBlock Memory
java.lang:type=GarbageCollector,name=Garbage collection optimized for throughput Old Collector
java.lang:type=Runtime
java.lang:type=MemoryPool,name=Nursery
java.lang:type=ClassLoading
java.lang:type=Threading
java.lang:type=MemoryPool,name=Class Memory
java.lang:type=OperatingSystem
java.lang:type=Memory
java.lang:type=MemoryPool,name=Old Space

有没有办法说 JRockit 在 JVM 启动时自动初始化这些 bean 而无需显式 JRMC 连接?问题是我正在尝试编写一些代码来重用其中一些 MBean,但在我连接 JRMC 之前它们不可用。

更新:这似乎是 JRockit jdk1.5.0_4.0.1 的问题。由于相同的代码在 JRockit jdk6.0_4.1.0 上按预期工作。

【问题讨论】:

  • 请注意,不支持在 JRMC 外部访问 oracle* 和 com.oracle* mbean。

标签: java initialization jmx jrockit


【解决方案1】:

这似乎是我使用的 Windows 版本的 JRockit 的问题:

java version "1.5.0_24"
Java(TM) Platform, Standard Edition for Business (build 1.5.0_24-b02)
Oracle JRockit(R) (build R28.0.1-21-133393-1.5.0_24-20100512-2131-windows-x86_64, compiled mode)

相同的代码在 Windows 上的最新 JRockit for JDK 1.6.0 上按预期工作:

java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Oracle JRockit(R) (build R28.2.2-7-148152-1.6.0_29-20111221-2104-windows-x86_64, compiled mode)

在相同的 JRockit 版本上,但适用于 Linux:

java version "1.5.0_24"
Java(TM) Platform, Standard Edition for Business (build 1.5.0_24-b02)
Oracle JRockit(R) (build R28.1.0-123-138454-1.5.0_24-20101014-1350-linux-x86_64, compiled mode)

【讨论】:

    【解决方案2】:

    使用 *:* 的对象名称尝试查询

    final Set<ObjectName> mBeans = connection.queryNames(new ObjectName("*:*"),
    

    JRockit 中可能存在不止一个 MBeanServer,JRMC 会找到所有 MBeanServer。

    【讨论】:

    • 它给出了相同的结果。除了上面的代码,我已经遍历了所有可用的域。
    猜你喜欢
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 2021-12-22
    • 1970-01-01
    • 2021-04-29
    • 2019-05-17
    • 2023-04-07
    • 2021-07-29
    相关资源
    最近更新 更多