Как получить доступ к использованию памяти программно через JMX? - PullRequest
18 голосов
/ 19 ноября 2009

Я ищу образец кода Java JMX для доступа к значениям атрибутов JMX из другой виртуальной машины.

С JConsole у меня нет проблем с просмотром java.lang / Memory / Attributes / HeapMemory

Как бы я мог получить ту же информацию от Java-программы, работающей на ВМ?

Примеры любых необходимых параметров командной строки или других вещей, которые необходимо запустить, приветствуются.

Ответы [ 4 ]

18 голосов
/ 23 ноября 2009

Вам необходимо установить JMXConnector. Вот фрагмент кода, который получит фиксированное использование памяти кучи на удаленном компьютере.

String host ="myHost";
int port = 1234;
HashMap map = new HashMap();
String[] credentials = new String[2];
credentials[0] = user;
credentials[1] = password;
map.put("jmx.remote.credentials", credentials);
JMXConnector c = JMXConnectorFactory.newJMXConnector(createConnectionURL(host, port), map);
c.connect();
Object o = c.getMBeanServerConnection().getAttribute(new ObjectName("java.lang:type=Memory"), "HeapMemoryUsage");
CompositeData cd = (CompositeData) o;
System.out.println(cd.get("committed"));

private static JMXServiceURL createConnectionURL(String host, int port) throws MalformedURLException
{
    return new JMXServiceURL("rmi", "", 0, "/jndi/rmi://" + host + ":" + port + "/jmxrmi");
}

Если вы не заботитесь о безопасности, вы можете установить карту на ноль. Вам необходимо запустить удаленный сервер с;

-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

Возможно, вы захотите взглянуть на wlshell , небольшую утилиту, которая позволяет вам получить доступ к MBeans на удаленном сервере с помощью текстового интерфейса или скрипта. Она может использоваться с WebLogic, но работает для любой Java-программы, в которой вы включили удаленный мониторинг.

5 голосов
/ 21 июня 2012

@ Ответ Кире выглядит неплохо, но я решил добавить некоторые подробности о моем пакете SimpleJMX . Он содержит поддержку сервера, которая позволяет легко экспортировать bean-компоненты, а также простой клиентский интерфейс, который работает с любой JVM, экспортирующей информацию JMX.

Чтобы получить доступ к памяти, вы должны сделать что-то вроде:

JmxClient client = new JmxClient("some.host.name", somePortNumber);
// get the memory composite information
CompositeData composite =
      (CompositeData)client.getAttribute(new ObjectName("java.lang:type=Memory"),
                                         "HeapMemoryUsage");
System.out.println(composite.get("committed"));
2 голосов
/ 19 ноября 2009
// Retrieve memory managed bean from management factory.
MemoryMXBean memBean = ManagementFactory.getMemoryMXBean() ;
MemoryUsage heap = memBean.getHeapMemoryUsage();
MemoryUsage nonHeap = memBean.getNonHeapMemoryUsage();

// Retrieve the four values stored within MemoryUsage:
// init: Amount of memory in bytes that the JVM initially requests from the OS.
// used: Amount of memory used.
// committed: Amount of memory that is committed for the JVM to use.
// max: Maximum amount of memory that can be used for memory management.
System.err.println(String.format("Heap: Init: %d, Used: %d, Committed: %d, Max.: %d",
  heap.getInit(), heap.getUsed(), heap.getCommitted(), heap.getMax()));
System.err.println(String.format("Non-Heap: Init: %d, Used: %d, Committed: %d, Max.: %d",
  nonHeap.getInit(), nonHeap.getUsed(), nonHeap.getCommitted(), nonHeap.getMax()));
1 голос
/ 13 октября 2017

Вот как вы получаете MemoryMXBean удаленно (в дополнение к ответу Адамски):

MemoryMXBean memoryMXBeanProxy = JMX.newMXBeanProxy(
            conn, new ObjectName("java.lang:type=Memory"), MemoryMXBean.class);
...