게시물 및 토론에 감사드립니다. 이 정보와 약간의 시행 착오를 토대로 이것을 함께 정리할 수있었습니다.
다른 사람들과 공유해도 동일한 다리 작업을 수행 할 필요가 없습니다. 이것은 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은이 호출을 사용하여 원격으로 에이전트를로드하는 예제를 보여줍니다. –
Right. 관리 에이전트 (/jre/lib/management-agent.jar)에 JRE 빌드를로드하고 수신 대기 포트 (예 : vm.loadAgent (agent, "com.sun.management.jmxremote.port = 5000");), JMX Remoting API를 사용하여 포트 5000의 MBeanServer에 연결할 수 있습니다. 포트 액세스없이 JVM에서 MBeanServer에 액세스하는 방법을 찾고 있다면 ...... 확실하지 않습니다 .... 당신은 FIFO 기반 프로토콜 또는 무엇인가를 개발할 수있을 것입니다. – Nicholas
포트 액세스없이 연결하려고하지 않았습니다 ... 사용할 포트를 지정하고 싶지 않았습니다. 포트를 지정하지 않으면 (즉, vm.loadAgent (agent, "com.sun.management.jmxremote")를 호출하면) jvm이 임의의 상위 포트를 선택합니다. 그런 다음 vm.getAgentProperties(). get ("com.sun.management.jmxremote.localConnectorAddress")를 호출하여 mBeanServer에 연결할 URL을 가져올 수 있습니다. 도움을 주신 Nicholas에게 감사드립니다. Scott Greenman familysearch.org –