◀返回
使用远程 JMX 构建和运行原生可执行文件
使用 Java 管理扩展 (JMX) 在使用 GraalVM Native Image 构建的原生应用程序中进行远程管理是可行的。
注意:此功能尚处于实验阶段。
本指南涵盖了构建、运行和使用 JMX 与原生可执行文件交互所需的步骤。它还将向您展示如何将自定义托管 Bean (MBean) 注册到 JMX 服务器,以及使其与 Native Image 协同工作所需的额外步骤。
目前支持的功能和限制
支持从客户端到远程 MBean 服务器的 JMX 连接。客户端、服务器或两者都可能是原生可执行文件。仅支持 MXBean 和标准用户定义 MBean。不支持动态 MBean 和模型 MBean,因为它们的管理接口是在运行时定义的。虽然支持 MXBean 的远程管理,但并非所有平台 MXBean 功能都已实现或适用于由 Native Image 生成的原生可执行文件。此外,要定义和使用标准 MBean,您必须指定元数据配置。本指南将对此进行进一步说明。
运行演示
先决条件
确保已安装 GraalVM JDK。最简单的入门方法是使用 SDKMAN!。有关其他安装选项,请访问 下载部分。
- 将以下代码保存到名为 SimpleJmx.java 的文件中。应用程序的
main()
方法注册一个自定义 MBean,然后无限循环,以便您有时间使用 VisualVM 检查进程。import javax.management.MBeanServer; import javax.management.ObjectName; import java.lang.management.ManagementFactory; public class SimpleJmx { public static void main(String args[]) throws Exception { ObjectName objectName = new ObjectName("com.jmx.test.basic:name=simple"); Simple simple = new Simple(); simple.setName("someName"); MBeanServer server = ManagementFactory.getPlatformMBeanServer(); server.registerMBean(simple, objectName); while (true) { Thread.sleep(1000); System.out.println("JMX server running..."); } } public static interface SimpleMBean { String getName(); void setName(String name); String print(); } static class Simple implements SimpleMBean { private String name; @Override public String getName() { return name; } @Override public void setName(String name) { this.name = name; } @Override public String print() { return "Print output " + name; } } }
- 将您的工作目录更改为保存文件的位置。然后使用 GraalVM JDK 编译应用程序
javac SimpleJmx.java
这将创建 SimpleJmx.class、SimpleJmx$Simple.class 和 SimpleJmx$SimpleMBean.class 文件。
- 添加动态代理配置。JMX 使用动态代理(Java 的 动态功能)来访问 MBean。要能够在运行时与自定义
SimpleMBean
交互,您需要为 Native Image 提供 MBean 接口的额外 动态代理元数据。为此,请创建或修改名为 reachability-metadata.json 的 JSON 文件,其内容如下{ "reflection": [ { "type": { "proxy": ["SimpleJmx$SimpleMBean"] } } ] }
- 使用启用了 VM 监控功能构建原生可执行文件,并将 JSON 配置文件传递给
native-image
native-image --enable-monitoring=jmxserver,jmxclient,jvmstat -H:DynamicProxyConfigurationFiles=proxy-config.json SimpleJmx
--enable-monitoring=jmxserver
选项启用 JMX 服务器功能(以接受传入连接)。--enable-monitoring=jmxclient
选项启用 JMX 客户端功能(以建立传出连接)。这两个功能可以一起使用,用逗号隔开,例如--enable-monitoring=jmxserver,jmxclient
。如果您想启用 VisualVM 和其他 JVM 的发现,也应包含jvmstat
选项:--enable-monitoring=jmxserver,jmxclient,jvmstat
。 - 使用 JMX 属性运行您的原生可执行文件
./simplejmx -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=9996 -Dcom.sun.management.jmxremote.ssl=false
这将应用程序作为简单的 JMX 服务器启动,不使用密码身份验证或 SSL,使用端口
9996
。您可以配置 JMX 以应用所有通常的属性,如 本指南 所示,但本示例为简单起见使用了基本配置。
现在 JMX 服务器正在运行,可以使用 VisualVM 检查 MBean。
使用 VisualVM 检查 MBean
-
启动 VisualVM 以便以用户友好的方式查看托管 Bean。
-
确保已安装 VisualVM-MBeans 插件(转到 工具,然后转到 插件,在 可用插件 下,选择 VisualVM-MBeans,然后单击 安装)。
-
转到 应用程序 选项卡并选择 SimpleJmx 进程。从那里您可以选择 MBeans 选项卡。
-
在 MBeans 选项卡中,您可以检查之前创建的自定义 MBean 并对其执行操作。
总之,Native Image 提供对使用 JMX 进行远程管理的支持。用户可以在原生可执行文件中启用 JMX 代理以监控在远程系统上运行的客户端应用程序。