我正在开发一个监控应用程序,该应用程序使用Sigar进行监控以监控不同类型的应用程序。 Sigar的一个问题是,当监视Java应用程序(JVM)的堆使用情况时,我只能获取最大堆大小,而不能获取JVM的实际使用堆大小。 因此,我扩展了监视应用程序以使用JMX连接到JVM,并检索CPU以及堆使用情况。到目前为止,这工作正常,但 我想尽可能地自动化所有内容,并且我不希望在启用JMX的情况下启动所有受监视的应用程序,但需要时使用以下代码动态激活它:检查tools.jar是否可用并在运行时动态加载
private void connectToJVM(final String pid) throws IOException, AgentLoadException, AgentInitializationException {
List<VirtualMachineDescriptor> vms = VirtualMachine.list();
for (VirtualMachineDescriptor desc : vms) {
if (!desc.id().equals(pid)) {
continue;
}
VirtualMachine vm;
try {
vm = VirtualMachine.attach(desc);
} catch (AttachNotSupportedException e) {
continue;
}
Properties props = vm.getAgentProperties();
String connectorAddress = props.getProperty(CONNECTOR_ADDRESS);
if (connectorAddress == null) {
String agent = vm.getSystemProperties().getProperty("java.home") + File.separator + "lib"
+ File.separator + "management-agent.jar";
vm.loadAgent(agent);
// agent is started, get the connector address
connectorAddress = vm.getAgentProperties().getProperty(CONNECTOR_ADDRESS);
}
vm.detach();
JMXServiceURL url = new JMXServiceURL(connectorAddress);
this.jmxConnector = JMXConnectorFactory.connect(url);
}
}
目前为止工作正常,但问题是我现在依赖于来自JDK的tools.jar
。 我的问题是现在我可以在运行时检查tools.jar
是否在JAVA_HOME
路径中可用,并在它是否加载时加载它?因为如果它不可用,我只想用Sigar进行正常监视,但如果可用,我想使用JMX监视Java应用程序。 我的项目是一个maven项目,我正在使用maven-shade-plugin
来创建一个可执行的jar文件,其中包含所有的依赖关系。
目前我使用的是互联网中发现的肮脏的黑客,它使用反射将tools.jar
动态添加到系统类路径(如果存在)。但我想知道是否有可能以不同的方式做到这一点? 预先感谢您的支持。
这是一个坏主意,不是因为这个JAR在Java 9中消失了。你应该使用Compiler API来访问'javac'。 –