如何查看Java进程占用哪个端口

在开发和运维过程中,我们经常需要查看Java进程占用哪个端口。这篇文章将介绍几种不同的方法来实现这个目标。

1. 使用命令行工具

在命令行中,我们可以使用netstat命令来查看当前系统的网络连接和端口占用情况。下面是一个简单的示例:

netstat -ano | findstr :<port>

其中,<port>是要查看的端口号。这个命令会列出所有占用该端口的进程的PID。如果你知道Java进程的PID,你就可以直接找到它了。

然而,通过PID来查找Java进程并不是一种优雅的方式。下面将介绍一种更好的方法。

2. 使用jcmd命令

jcmd是Java提供的一个命令行工具,用于操作和监控Java进程。它可以帮助我们查看Java进程的信息,包括占用的端口。

首先,我们需要找到Java进程的PID。可以使用jps命令来列出当前系统上的Java进程,例如:

jps -l

然后,我们可以使用jcmd命令来查看Java进程的详细信息,包括它占用的端口。下面是一个示例:

jcmd <pid> VM.management_agent_properties

其中,<pid>是Java进程的PID。这个命令会输出Java进程的一些属性,包括com.sun.management.jmxremote.port属性,它表示Java进程所使用的JMX连接端口。

3. 使用Java代码

除了命令行工具,我们还可以使用Java代码来查看Java进程占用的端口。下面是一个示例:

import java.io.IOException;
import java.lang.management.ManagementFactory;

public class JavaPortViewer {
    public static void main(String[] args) throws IOException {
        String processName = ManagementFactory.getRuntimeMXBean().getName();
        long pid = Long.parseLong(processName.split("@")[0]);
        System.out.println("PID: " + pid);

        // 获取占用的端口
        Process process = Runtime.getRuntime().exec("netstat -ano | findstr :" + getPort());
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        }
    }

    private static int getPort() {
        return Integer.parseInt(System.getProperty("com.sun.management.jmxremote.port"));
    }
}

这个代码片段使用了ManagementFactory类来获取当前Java进程的PID,然后使用Runtime类来执行命令行命令并读取输出。最后,它将输出打印到控制台。

请注意,这个代码片段假设Java进程已经启用了JMX远程连接,并且设置了com.sun.management.jmxremote.port属性。如果Java进程没有启用JMX远程连接,或者没有设置该属性,那么它将无法打印出占用的端口。

总结

本文介绍了几种不同的方法来查看Java进程占用哪个端口,包括使用命令行工具、jcmd命令和Java代码。通过这些方法,我们可以轻松地找到Java进程所使用的端口,并在开发和运维过程中进行相应的调试和监控工作。

注:以上方法适用于Windows和Unix/Linux系统。在不同的操作系统上,命令行工具的语法可能会有所不同。请根据实际情况进行调整。

参考资料:

  • [Java Management Extensions (JMX)](
  • [How can a Java program get its own process ID?](