java - que - ¿Cómo accedo al uso de la memoria mediante programación a través de JMX?
mbeans que es (4)
Así es como se obtiene el MemoryMXBean de forma remota (para complementar la respuesta de @ Adamski):
MemoryMXBean memoryMXBeanProxy = JMX.newMXBeanProxy(
conn, new ObjectName("java.lang:type=Memory"), MemoryMXBean.class);
Estoy buscando un código Java JMX de muestra para acceder a los valores de los atributos JMX de otra máquina virtual.
Con JConsole, no tengo ningún problema mirando java.lang / Memory / Attributes / HeapMemory
¿Cómo obtendría la misma información de un programa Java que se ejecuta en una máquina virtual?
Ejemplos de las opciones de línea de comando necesarias, u otras cosas que se deben comenzar a apreciar.
La respuesta de @Kire se ve bien, pero pensé que agregaría algunos detalles sobre mi paquete SimpleJMX . Contiene soporte de servidor que le permite exportar beans fácilmente y también incluye una interfaz de cliente simple que funciona contra cualquier JVM que exporta información de JMX.
Para acceder al uso de la memoria harías algo como:
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"));
Necesitas configurar un JMXConnector. Aquí hay un fragmento de código que obtendrá el uso de memoria del montón comprometido en una máquina remota.
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");
}
Si no te importa la seguridad, puedes establecer el mapa en nulo. Necesita iniciar el servidor remoto con;
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
Es posible que desee echar un vistazo a wlshell que es una pequeña utilidad que le permite acceder a MBeans en un servidor remoto mediante una interfaz de texto o un script. Puede usarse con WebLogic, pero funciona para cualquier programa Java en el que haya habilitado monitoreo remoto.
// 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()));