Linux下查看 java 进程所在目录和占用情况

本文介绍了如何在Linux系统中通过ps、top和jstack等命令来管理和排查进程,包括获取PID、查看进程目录、监控CPU和内存使用、检查端口和线程栈。此外,还提到了一些常用的系统资源监控工具,如netstat、free、iostat和df。
摘要由CSDN通过智能技术生成

所在目录

  1. 获取PID;通过 ps 或 top 命令获取到进程的PID。(以下记为 12345)
$ ps aux |grep java
# ps aux与ps -ef 目的都是显示所有在运行的进程, aux是用bsd的格式输出,-ef是用标准格式输出。由于ps版本的原因,也支持ps -aux;
# ps aux最初用到Unix Style中,而ps -ef被用在System V Style中;
# -e 代表列出所有进程,-f 代表完整的格式,-l 代表长格式,有时候也用 -F 代表超完整的格式。
  • ps
    • aux: bsd 格式输出, 被用到 Unix Style 中 (由于一些ps版本的原因,也支持ps -aux)
    • ef: 标准格式输出, 被用在 System V Style 中
  1. 通过 proc 查看对应目录, 并接上上面查到的 PID 值
#使用命令 ls -l /proc/PID
$ ls -l /proc/12345

Linux在启动一个进程时,系统会在/proc下创建一个以PID命名的文件夹。

在该文件夹下会有我们的进程的信息

其中: 

cwd文件,符号链接的是进程运行目录;

exe文件,符号连接的是执行程序的绝对路径;

cmdline文件就是程序运行时输入的命令行命令;

environ文件记录了进程运行时的环境变量;

fd目录下是进程打开或使用的文件的符号连接;

查看 java 程序运行时的端口

# 显示java程序运行的端口;
netstat -nap | grep java

排查java程序CPU占用过高问题

  1. top 按下 p, 记下 pid (以下pid 均为 12345)
  2. 显示线程列表: ps -mp 12345 -o THREAD, tid, time # 记下tid 为 23456
  3. 将要选择的线程ID转换为16进制格式:printf “%x\n” 23456 # 记为 660a
  4. 最后打印线程的堆栈信息:jstack 12345 |grep 660a -A 30 # grep -A num, --after-context=num
  • 另一种
  1. top 记下 pid
  2. ps H -eo pid,tid,%cpu |grep [pid] # H 打印进程树 -eo 感兴趣的内容
  3. 或者 top Hp [pid]
  4. jstack [pid] 然后讲上面第2步找到的tid 换算为十六进制(原来为10进制), 在打印的信息中找到对应的 nid (nid is Native Thread ID). 得到堆栈.

案例

日志写入阻塞的问题

Runtime.getRuntime().exec("java -jar xxx.jar");

在这里插入图片描述

原因: 服务无法写入日志, 所以接口阻塞了

通常要获取 exec() 执行的日志, 通常是读取它的 OutputStream 流, 且输出流缓冲区大小有限制, 写满后不会自动覆盖, 而是阻塞

分析 Runtime.getRuntime().exec() 的源码, 调用了 ProcessBuilderstart() 方法, 最后调用 new ProcessImpl(), 该类与操作系统相关

最终调用 java.lang.ProcessImpl#create 方法, 这是一个 native 方法, 继续往下:

#define PIPE_SIZE (4096+24)
//......
     if (!CreatePipe(
            &pHolder->pipe[OFFSET_READ],
            &pHolder->pipe[OFFSET_WRITE],
            NULL, /* we would like to inherit
                     default process access,
                     instead of 'Everybody' access */
            PIPE_SIZE))

CreatePipe 是操作系统的 api: Creates an anonymous pipe, and returns handles to the read and write ends of the pipe.
When a process uses WriteFile to write to an anonymous pipe, the write operation is not completed until all bytes are written. If the pipe buffer is full before all bytes are written, WriteFile does not return until another process or thread uses ReadFile to make more buffer space available.

If the pipe buffer is full before all bytes are written, WriteFile does not return. 如果管道被写满 (4096+24) 字节, 那么写会被阻塞, 直到有空间为止;

所以, 打印日志的线程都被阻塞了, 因为代码根本没有读取 pipe

修改方法

  • 要么读取 pipe 的输出, 要么一开始就不写 console

如何不写 console: 命令后边加上 > /dev/null

  • 尽量使用文件日志等方式, 不要使用 ConsoleAppender

可以参考 Logback 的 Jira 问题中的评论: https://jira.qos.ch/browse/LOGBACK-1422

Writing to disk takes time. writing to the console takes even more time. Do not use ConsoleAppender in production.

基本排查命令

  1. top 查看整个系统资源使用情况, 可以查看实时的CPU使用情况, 也可以查看最近一段时间的CPU使用情况;
    P = CPU ⬇️ ; T = TIME ⬆️ ; M = MEM ⬆️
  2. ps 强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。
  3. jstack Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。
  4. pstack 可以查看某个进程的当前线程栈运行情况。
  5. free -m 查看内存使用情况;(m代表MB)
  6. iostat 查看磁盘读写活动情况;
  7. netstat 查看网络连接情况;
  8. df -h 查看磁盘空间使用情况;
  9. du -sh 查看文件大小情况;
  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux查看Java进程的ID和项目名称,可以使用以下命令: 1. 使用netstat命令查看Java程序运行的端口: ```shell netstat -nap | grep java ``` 这个命令会显示Java程序正在使用的端口信息。 2. 使用ps命令查看Java进程的ID和项目名称: ```shell ps -ef | grep java ``` 这个命令会列出正在运行的与Java相关的进程,并显示它们的进程ID和命令行信息。你可以从命令行中找到对应的项目名称。 另外,如果你想查看Java进程的线程信息,可以使用jstack命令: ```shell jstack <进程ID> ``` 这个命令会打印出Java进程的线程堆栈信息,可以用来检查线程的运行状态、运行代码等。 总结起来,要在Linux查看Java进程的ID和项目名称,你可以使用netstat命令查看端口信息,或者使用ps命令查看进程信息,并从命令行中找到对应的项目名称。另外,如果你需要查看Java进程的线程信息,可以使用jstack命令。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Linux 启动、停止、重启jar包脚本;查看java进程执行文件所在目录/具体位置(多文件夹同名jar包)](https://blog.csdn.net/weixin_26742753/article/details/114718195)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Linux查看 java 进程所在目录占用情况](https://blog.csdn.net/howeres/article/details/122322423)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值