投稿とディスカッションのおかげでニコラスとスコットに感謝します。この情報といくつかの試行錯誤に基づいてこれをまとめることができました。
他の人と共有すると、同じ脚の仕事をする必要はありません。これはJVMに接続し、そのメモリ使用量を取得します。
import com.sun.tools.attach.VirtualMachine;
import com.sun.tools.attach.VirtualMachineDescriptor;
import com.sun.tools.attach.spi.AttachProvider;
import javax.management.MBeanServerConnection;
import javax.management.ObjectName;
import javax.management.openmbean.CompositeData;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class AttachFun {
public static void main(String[] args) throws Exception {
final AttachProvider attachProvider = AttachProvider.providers().get(0);
VirtualMachineDescriptor descriptor = null;
for (VirtualMachineDescriptor virtualMachineDescriptor : attachProvider.listVirtualMachines()) {
if (pickThisOne(virtualMachineDescriptor)) {
descriptor = virtualMachineDescriptor;
break;
}
}
if (descriptor == null) throw new RuntimeException("You didn't pick one");
final VirtualMachine virtualMachine = attachProvider.attachVirtualMachine(descriptor);
virtualMachine.loadAgent("/System/Library/Frameworks/JavaVM.framework/Home/lib/management-agent.jar", "com.sun.management.jmxremote");
final Object portObject = virtualMachine.getAgentProperties().get("com.sun.management.jmxremote.localConnectorAddress");
final JMXServiceURL target = new JMXServiceURL(portObject + "");
final JMXConnector connector = JMXConnectorFactory.connect(target);
final MBeanServerConnection remote = connector.getMBeanServerConnection();
final ObjectName memory = new ObjectName("java.lang:type=Memory");
CompositeData cd = (CompositeData) remote.getAttribute(memory, "HeapMemoryUsage");
final Long used = (Long) cd.get("used");
System.out.println(used);
}
private static boolean pickThisOne(VirtualMachineDescriptor virtualMachineDescriptor) {
// TODO
return false;
}
}
添付APIは、JVMのハンドルを取得しますが、そのJVMのmBeanServerは取得しません。 attach APIのjavadocは、この呼び出しを使用してリモートでエージェントをロードする例を示しています。 –
右。 JREのビルドを管理エージェント(/jre/lib/management-agent.jar)にロードし、リスニングポート(vm.loadAgent(エージェント、 "com.sun.management.jmxremote.port = 5000"など)を指定する場合は、 )、JMX Remoting APIを使用してポート5000上のMBeanServerに接続することができます。ポートアクセスなしでJVM内のMBeanServerにアクセスする方法を探していたら......わかりません.... FIFOベースのプロトコルなどを開発することができます。 – Nicholas
私はポートアクセスなしで接続しようとしていませんでした...私はちょうど使用するポートを指定する必要はありませんでした。ポートを指定しない場合(つまり、vm.loadAgent(エージェント、 "com.sun.management.jmxremote")を呼び出す場合)、jvmはランダムな上位ポートを選択します。その後、vm.getAgentProperties()。get( "com.sun.management.jmxremote.localConnectorAddress")を呼び出して、mBeanServerに接続するためのURLを取得できます。 おかげさまでニコラスに感謝します。 Scott Greenman familysearch.org –