如果 Tomcat 作为 Windows 服务运行(使用 Windows Tomcat 安装程序创建),则不能简单地使用-Dcom.sun.management.jmxremote
. 您还需要设置-Dcom.sun.management.jmxremote.port=<port>
. 此处解释了这一点:Unable to use JConsole with Tomcat running as windows service
但是,我在任何地方都没有找到解释为什么会这样。
如果 Tomcat 作为 Windows 服务运行(使用 Windows Tomcat 安装程序创建),则不能简单地使用-Dcom.sun.management.jmxremote
. 您还需要设置-Dcom.sun.management.jmxremote.port=<port>
. 此处解释了这一点:Unable to use JConsole with Tomcat running as windows service
但是,我在任何地方都没有找到解释为什么会这样。
当我写下这个问题时,我有点迷茫和困惑。这是我在此期间学到的。通常 Tomcat Windows 服务在本地系统帐户下运行。这就是大家闹得沸沸扬扬的主要原因。
如果您只是-Dcom.sun.management.jmxremote
在服务配置的 JVM 设置中进行设置,则确实会启用 JMX。如果您有一个在同一个 JVM 实例中运行的 JMX 客户端(例如,因为它已嵌入到应用程序本身中),您可以获得类似的MBeanServer
东西:MBeanServerFactory.findMBeanServer(<specific-agent-ID-or-null>)
. 但是,JConsole 不会列出这个 Tomcat 进程。这一切都在这里解释:https ://blogs.oracle.com/nbprofiler/entry/monitoring_java_processes_running_as 。
如其他地方所述,如果这还不够好,您还需要设置-Dcom.sun.management.jmxremote.port=<port>
. 然后,您可以使用 JConsole 连接到 JMX localhost:<port>
。在 Java 代码中,这可以通过以下方式实现:
JMXServiceURL target = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://localhost:<port>/jmxrmi");
JMXConnector connector = JMXConnectorFactory.connect(target);
connector.getMBeanServerConnection();