Как инициализировать дерево JRockit MBean

У меня есть следующий код, который просто перечисляет все имена 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 и в этот момент подключусь к этой JVM с помощью JRMC, тогда JRMC отобразит гораздо больше MBean, а также после того, как я продолжу выполнение программы, он также распечатает другой список, который содержит больше MBean, связанных с JRockit:

[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 без необходимости явного подключения JRMC? Проблема в том, что я пытаюсь написать код, который повторно использует некоторые из этих MBean, но они недоступны, пока я не подключусь к JRMC.

ОБНОВЛЕНИЕ: похоже, это проблема JRockit jdk1.5.0_4.0.1. Тот же код работает, как и ожидалось, на JRockit jdk6.0_4.1.0.


person Andrey Adamovich    schedule 17.02.2012    source источник
comment
Имейте в виду, что mbean-компоненты oracle* и com.oracle* не поддерживаются для доступа за пределами JRMC.   -  person staffan    schedule 17.02.2012


Ответы (2)


Похоже, это проблема версии JRockit для Windows, которую я использую:

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)

Тот же код работает, как и ожидалось, в последней версии JRockit для JDK 1.6.0 в Windows:

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)
person Andrey Adamovich    schedule 17.02.2012

попробуйте свой запрос с именами объектов *:*

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

Возможно, в JRockit есть более одного MBeanServer, и JRMC находит все MBeanServer.

person ams    schedule 17.02.2012
comment
это дает тот же результат. кроме того, в приведенном выше коде я уже перебираю все доступные домены. - person Andrey Adamovich; 17.02.2012