web-dev-qa-db-ja.com

JMXを介してプログラムでメモリ使用量にアクセスするにはどうすればよいですか?

別のVMからJMX属性の値にアクセスするためのサンプルJava JMXコードを探しています。

JConsoleを使用すると、Java.lang/Memory/Attributes/HeapMemoryを問題なく確認できます。

VMで実行されているJavaプログラムから同じ情報を取得するにはどうすればよいですか?

必要なコマンドラインオプションの例、または開始する必要のあるその他のものを高く評価します。

18

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

セキュリティを気にしない場合は、マップをnullに設定できます。次のコマンドでリモートサーバーを起動する必要があります。

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

wlshell を確認することをお勧めします。これは、テキストインターフェイスまたはスクリプトを使用してリモートサーバー上のMBeanにアクセスできる小さなユーティリティです。WebLogicで使用できますが、リモート監視を有効にした任意のJavaプログラム。

18
Kire Haglin

@Kireの答えは良さそうですが、私の SimpleJMXパッケージ についていくつか詳細を追加したいと思いました。 Beanを簡単にエクスポートできるサーバーサポートが含まれ、JMX情報をエクスポートするJVMに対して機能するシンプルなクライアントインターフェイスも含まれています。

メモリ使用量にアクセスするには、次のようにします。

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"));
5
Gray
// 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()));
2
Adamski

これは、MemoryMXBeanをリモートで取得する方法です(@Adamskiの回答を補完するため)。

MemoryMXBean memoryMXBeanProxy = JMX.newMXBeanProxy(
            conn, new ObjectName("Java.lang:type=Memory"), MemoryMXBean.class);
1
Juan Bustamante