Как использовать программный доступ к памяти через JMX?

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

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

Как получить ту же информацию из Java-программы, запущенной в VM?

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

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

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"); } 

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

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

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

@ Ответ Кира выглядит неплохо, но я подумал, что добавлю некоторые подробности о моем пакете SimpleJMX . Он содержит серверную поддержку, которая позволяет легко экспортировать компоненты, а также простой клиентский интерфейс, который работает против любой 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")); 
 // 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())); 

Так вы получаете память MemoryXXBean удаленно (в дополнение к ответу Адамски):

 MemoryMXBean memoryMXBeanProxy = JMX.newMXBeanProxy( conn, new ObjectName("java.lang:type=Memory"), MemoryMXBean.class); 
Давайте будем гением компьютера.