找出Java进程ID pid的几种方法

本文介绍了如何使用进程ID(PID)来管理Java进程,包括终止进程、调整运行时选项、检查内存使用情况等操作。同时提供了多种获取PID的方法,如使用任务管理器、jps命令等。

拿到进程ID pid能做些什么呢?

暴力的杀掉它,比如:kill -9 123, taskkill /PID 123, 123也就是你要kill的pid。

使用 jinfo:可以输出并修改运行时的java 进程的opts(选项,项目项)。

如:jinfo 56860

Attaching to process ID 56860, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 25.31-b07

Java System Properties:

java.runtime.name = Java(TM) SE Runtime Environment

java.vm.version = 25.31-b07

sun.boot.library.path = D:\Java\jdk\jre\bin

java.vendor.url = http://java.oracle.com/

java.vm.vendor = Oracle Corporation

path.separator = ;

java.rmi.server.randomIDs = true

file.encoding.pkg = sun.io

java.vm.name = Java HotSpot(TM) 64-Bit Server VM

sun.os.patch.level = Service Pack 1

sun.java.launcher = SUN_STANDARD

user.script =

user.country = CN

user.dir = D:\javaProject\javatrans

java.vm.specification.name = Java Virtual Machine Specification

java.runtime.version = 1.8.0_31-b13

……省略N行

使用jmap:打印出某个java进程(使用pid)内存内的所有'对象'的情况(如:产生那些对象,及其数量)。

如:jmap 56860

Attaching to process ID 56860, please wait...

Debugger attached successfully.

Server compiler detected.

JVM version is 25.31-b07

0x000000000f000000      24K     C:\Program Files\NVIDIA Corporation\CoProcManage

r\detoured.dll

0x0000000057e70000      840K    D:\Java\jdk\jre\bin\msvcr100.dll

0x0000000069d90000      212K    D:\Java\jdk\jre\bin\jdwp.dll

0x000000006a0f0000      8552K   D:\Java\jdk\jre\bin\server\jvm.dll

0x000000006c760000      140K    D:\Java\jdk\jre\bin\instrument.dll

0x000000006e540000      52K     D:\Java\jdk\jre\bin\management.dll

0x000000006e550000      68K     D:\Java\jdk\jre\bin\nio.dll

0x000000006ee40000      104K    D:\Java\jdk\jre\bin\net.dll

0x000000006fc30000      32K     D:\Java\jdk\jre\bin\npt.dll

0x0000000070e10000      36K     D:\Java\jdk\jre\bin\dt_socket.dll

0x0000000070e20000      88K     D:\Java\jdk\jre\bin\zip.dll

0x0000000071220000      160K    D:\Java\jdk\jre\bin\java.dll

0x0000000071400000      60K     D:\Java\jdk\jre\bin\verify.dll

0x0000000076e70000      1000K   C:\Windows\system32\USER32.dll

0x0000000076f70000      1152K   C:\Windows\system32\kernel32.dll

……省略N行

使用jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。

如:jstat -gcnew 56860

 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT

 512.0  512.0    0.0   96.0  1  15  512.0  24064.0   2313.0     45    0.167

嗯嗯,大概的说了几种用法,下面我们看看找到PID的几种方法。

1、任务管理器

Windows下通过在任务管理器的进程中查找:

0?wx_fmt=png

执行main方法,或启动Tomcat,都是查找javaw.exe 这个进程。

Linux下,如:ps -aux | grep java

2、jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程ID。

0?wx_fmt=png

Windows和Linux下用法基本一致。

3、jconsole:一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM。

0?wx_fmt=png

可以在命令行窗口执行:jconsole 打开它,然后点击菜单》新建连接,在弹出的窗口中就可以看到进程的PID了。

Linux估计要支持图形界面才可以了,还没试过。

4、Windows下也要以使用命令来查找

如:tasklist | findstr javaw.exe

0?wx_fmt=png

5、Linux下的如:pidof,不过我还没用过。

6、Windows下的如:Process Monitor,Process Explorer

0?wx_fmt=png

0?wx_fmt=png

可能还有很多其它的工具,你知道的,这里没有的,快来告诉我!

<think>我们正在讨论如何查看Linux系统中的Java进程。根据引用[1]和引用[4],我们可以使用几个命令:ps、jps和jstack。同时,引用[2]和引用[4]提到使用kill -3来获取Java进程的线程转储,但可能会因为JVM参数设置而失效,此时可以用jstack代替。 用户的问题是:在Linux系统中查看Java进程方法。 我们重点介绍以下几种方法: 1. 使用`ps`命令:通过grep过滤出Java进程。 2. 使用`jps`命令:这是JDK自带的工具,专门用于查看Java进程。 3. 使用`top`命令:可以查看进程的资源占用情况,然后过滤出Java进程。 此外,如果需要查看Java进程的线程转储(即详细的线程状态),可以使用: - `kill -3 <pid>`:但注意,如果JVM启动了`-Xrs`选项,则这个信号会被忽略,此时无效。 - `jstack <pid>`:这是更可靠的方法。 下面是详细的步骤: ### 1. 使用`ps`命令查看Java进程 ```bash ps -ef | grep java ``` 或者更精确一点: ```bash ps -aux | grep java ``` - `-e`:显示所有进程 - `-f`:显示完整格式 - `-aux`:显示所有用户的所有进程(BSD风格) - 通过管道`grep java`来过滤出包含"java"字符串的进程。 示例输出: ``` root 12345 0.0 0.0 12345 6789 ? S Jun01 0:00 java -jar myapp.jar ``` ### 2. 使用`jps`命令(推荐) `jps`是JDK自带的工具,位于`$JAVA_HOME/bin`目录下。它列出正在运行的Java进程,并显示进程ID和主类名。 ```bash jps ``` 或者显示更详细的信息(包括传递给主类的参数和JVM参数): ```bash jps -lvm ``` - `-l`:输出主类的全名 - `-v`:输出JVM参数 - `-m`:输出传递给main方法的参数 示例输出: ``` 12345 MyMainClass ``` ### 3. 使用`top`命令监控Java进程 ```bash top -p `pgrep -d, java` ``` 或者先运行`top`,然后按`Shift+P`按CPU排序,再按`c`显示完整命令,这样可以看到Java进程。 ### 4. 查看Java进程的线程转储(用于分析进程状态) 如果进程出现异常(如死锁、高CPU等),需要查看线程状态: 方法一:使用`kill -3`(可能无效) ```bash kill -3 <java_pid> ``` 然后线程转储会输出到标准错误(通常是控制台或者日志文件)。 方法二:使用`jstack`(推荐) ```bash jstack <java_pid> > jstack.out ``` 这会将线程转储输出到文件`jstack.out`中。 注意:如果`jstack`命令不可用,请确保已安装JDK并配置了环境变量。 ### 常见问题 - **问题1**:`jps`命令找不到? 解决:确保JDK已安装并配置了`PATH`环境变量。可以尝试使用绝对路径:`$JAVA_HOME/bin/jps`。 - **问题2**:`kill -3`无效? 原因:JVM可能设置了`-Xrs`选项(减少信号使用)。 解决:使用`jstack`命令代替,如:`jstack -l <pid> > thread_dump.txt`[^2][^4]。 ### 总结 - 快速查看Java进程:`jps` - 查看详细信息:`ps -ef | grep java` - 监控资源使用:`top` - 获取线程转储:`jstack` --- ### 相关问题 1. 如何查看Java进程的启动参数? 2. 如何实时监控Java进程的CPU和内存使用? 3. 如何分析jstack输出的线程转储? 4. 为什么有时候`jps`命令找不到运行中的Java进程? 5. 如何在Linux上配置Java环境变量? [^1]: [linux命令如何查看java进程](https://blog.51cto.com/u_16213330/11307799) [^2]: [linux系统中,kill -3查看java进程状态无效的解决方法](https://example.com) # 注意:原引用链接未给出,此处仅作示例 [^4]: [linux kill -3 java,linux系统中,kill -3查看java进程状态无效的解决方法](https://example.com) # 注意:原引用链接未给出,此处仅作示例 </think>### Linux系统中查看Java进程方法 在Linux系统中,查看Java进程主要通过以下方法实现: #### 1. **使用`ps`命令(通用方法)** ```bash ps -ef | grep java ``` - **说明**: - `-e`:显示所有进程 - `-f`:显示完整格式(包含PID、启动命令等) - 通过管道`grep java`过滤出Java进程 - **输出示例**: ```bash root 12345 0.0 0.0 12345 6789 ? S Jun01 0:00 java -jar myapp.jar ``` - **关键字段**: - 第二列:进程IDPID) - 最后一列:启动命令 #### 2. **使用`jps`命令(JDK原生工具 - 推荐)** ```bash jps -l ``` - **说明**: - `-l`:显示完整主类名或JAR路径 - 直接列出所有Java进程,无需过滤 - **输出示例**: ```bash 12345 com.example.Main 67890 /opt/app/myapp.jar ``` - **注意事项**: - 需先安装JDK(工具路径:`$JAVA_HOME/bin/jps`) - 若提示命令不存在,检查JDK安装和环境变量 #### 3. **使用`top`命令(实时监控)** ```bash top -p $(pgrep -d, java) ``` - **说明**: - `pgrep java`:获取所有Java进程PID - `-d,`:将PID用逗号分隔(如`12345,67890`) - 实时显示CPU/内存占用情况 - **操作技巧**: - 按`Shift+P`按CPU排序 - 按`c`显示完整启动命令 --- ### 常见问题解决方案 #### 问题1:`kill -3 <PID>`无法生成线程转储? [^2][^4] **原因**:JVM启用了`-Xrs`选项(禁止信号处理) **解决方案**: ```bash jstack -l <PID> > jstack.out # 输出线程转储到文件 ``` #### 问题2:`jps`找不到运行中的Java进程? **排查步骤**: 1. 检查JDK版本一致性: ```bash which java # 确认使用的JRE路径 $JAVA_HOME/bin/jps -l # 使用绝对路径 ``` 2. 检查用户权限: ```bash sudo -u <app_user> jps -l # 切换应用用户执行 ``` --- ### 方法对比表 | 方法 | 优势 | 局限性 | 适用场景 | |---------|-----------------------|--------------------------|------------------------| | `ps` | 无需JDK,通用性强 | 需手动过滤输出 | 快速检查进程是否存在 | | `jps` | 直接显示Java进程 | 依赖JDK安装 | 精准获取Java进程信息 | | `top` | 实时监控资源占用 | 输出复杂需解析 | 性能分析 | --- ### 相关问题 1. 如何查看Java进程的详细启动参数? 2. `jstack`输出的线程转储应该如何分析? 3. 为什么某些Java进程对`jps`命令不可见? 4. 如何持续监控Java进程的资源使用情况? 5. 在容器化环境中(如Docker)如何查看Java进程? [^1]: [linux命令如何查看java进程](https://blog.51cto.com/u_16213330/11307799) [^2]: [linux系统中,kill -3查看java进程状态无效的解决方法](https://example.com) # 注:原始引用未提供完整链接 [^4]: [linux kill -3 java,linux系统中,kill -3查看java进程状态无效的解决方法](https://example.com) # 注:原始引用未提供完整链接
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值