Получение удаленных свойств JVM с использованием JMX

1

Может ли кто-нибудь дать мне несколько руководств о том, как получить свойства JVM после того, как я создал JMX-соединение с ним? Мне нужно получить эту информацию программно. Я искал это, не получив намека. Любые мысли были бы оценены.

Теги:
jmx
jvm
environment-variables

4 ответа

2
Лучший ответ

Посмотрите учебник JMX и примеры.

Свойства, которые вы хотите получить, можно получить в RuntimeMXBean.

  • 0
    Где вы найдете такой пример в руководстве по JMX? Я уже прочитал это. Что касается RuntimeMXBean, то это для локальной JVM. Пожалуйста, поправьте меня иначе. Спасибо, в любом случае.
  • 0
    Спасибо за разъяснение. Гораздо лаконичнее :).
Показать ещё 1 комментарий
0

Ни один из ответов, которые уже были предоставлены, действительно сработал для меня. Некоторые проблемы, которые у меня были с ними:

  • Принятый ответ - это не что иное, как указатель на документы, а не ошибочный, но никакой реальной помощи в разработке всех деталей.
  • TabularDataSupport - это немного PITA для распаковки, если вы просто хотите получить свойства Map of System. (Ключи будут обернуты в списки и должны быть распакованы, а "значения" TabularDataSupport Map на самом деле не являются значениями, которые вы хотите... но также все еще упакованы в объект "CompositeDataSupport", который также должен быть дополнительно распакован.).
  • Использование JMX.newMXBeanProxy выглядело многообещающим, чтобы избежать всей этой распаковки. Но хотя он компилируется... во время выполнения, я обнаружил, что результат из proxy getSystemProperties самом деле фактически не распакован. Он по-прежнему является объектом TabularDataSupport (да, хотя его тип времени компиляции говорит, что он должен быть Map<String,String>, на самом деле это не так).

Итак, вот что-то, что на самом деле работает для меня со всеми этими ловушками, разработанными таким образом, чтобы они отображали свойства системы как Map<String,String> же, как вы, вероятно, захотите.

package example;

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.Map;
import java.util.Map.Entry;

import javax.management.MBeanServerConnection;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;

public class GetJmxSystemProps {

    public static void main(String[] args) throws Exception {
        JMXServiceURL serviceUrl =  new JMXServiceURL("service:jmx:rmi://localhost:9111/jndi/rmi://localhost:9111/jmxrmi");
        JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceUrl, null);
        MBeanServerConnection connection = jmxConnector.getMBeanServerConnection();
        RuntimeMXBean proxy = ManagementFactory.getPlatformMXBean(connection, RuntimeMXBean.class);
        Map<String, String> sysprops = proxy.getSystemProperties();
        for (Entry<String, String> e : sysprops.entrySet()) {
            System.out.println(e.getKey()+"="+e.getValue());
        }
    }
}

Подводя итог: ключевым моментом здесь является то, что использование JMX.newMXBeanProxy для получения компонента типа RuntimeMXBean выполняется с RuntimeMXBean и не распаковывает объект TabularDataSupport в Map<String,String> правильно. Эту проблему можно избежать, используя вместо этого метод ManagementFactory.getPlatformMXBean.

0

В качестве подсказки: после подключения к JMX мне кажется, что существует стандартный интерфейс MXBean, который реализует java.lang.management.RuntimeMXBean. Связанное ObjectName должно быть:

ObjectName objName = new ObjectName("java.lang:type=Runtime");

и получение объекта экземпляра прокси выглядит так:

RuntimeMXBean runtimeMXBean = JMX.newMXBeanProxy(mbeanServer, objName, RuntimeMXBean.class, true);

Может быть, это поможет кому-то другому.

NB. Если кто-то может предоставить ссылку на документацию, которая указывает на необходимость интерфейса RuntimeMXBean для JMX-совместимых систем, то это будет приветствоваться.

  • 0
    Этот ответ глючит, по крайней мере, для меня. Когда вы вызываете runtimeMXBean.getSystemProperties он возвращает что-то, что на самом деле не является Map<String,String> (оно типизируется как таковое компилятором, а что-то другое во время выполнения). Я думаю, что использование JMX.newMXBeanProxy виновато в этом. Вместо этого мы должны использовать ManagementFactory.getPlatformMXBean чтобы получить прокси, который правильно распаковывает данные.
0

Я думаю, что самый маленький пример должен выглядеть так:

public class JMXSystemProperties {

public static void main(String[] args) throws Exception {
    JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:9004/jmxrmi");
    JMXConnector jmxc = JMXConnectorFactory.connect(url, null);

    MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
    TabularDataSupport data = (TabularDataSupport) mbsc.getAttribute(new ObjectName("java.lang:type=Runtime"), "SystemProperties");
    for (Entry<Object, Object> entry : data.entrySet()) {
        CompositeDataSupport value = (CompositeDataSupport) entry.getValue();
        System.out.println(entry.getKey() + " = " + value.values());
    }
}
}

Вы все равно можете использовать jvisualvm, чтобы убедиться, что все данные верны.

Вы можете заменить localhost и порт 9004 в URL-адресе на сервер и порт, который лучше для вас.

благодаря

  • 0
    Мне нужно, чтобы это было сделано из кода Java.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню