之前写了一篇在Linux系统中携带时间的文章:Java的jstat命令输出GC信息时携带时间信息(Linux系统中)
但是很多时候,我们都是在Windows系统中开发,可能有些人没有Linux环境,所以这篇文章就讲一下在Windows系统中jstat命令怎么在输出GC信息的时候携带时间信息。
- 使用
git bash
Windows系统是跑不了Linux中的脚本,但是git bash
里面是可以执行一部分Linux脚本的。所以可以借助git bash
来跑Linux中的脚本。
更多具体用法可以参考Java的jstat命令输出GC信息时携带时间信息(Linux系统中)这篇文章jstat -gc 25392 1000 999999 | while read -r line; do timestamp=$(date +"%H:%M:%S"); echo "$timestamp $line"; echo "$timestamp $line" >> one.log; done
注意事项:
在git bash
中,nohup
和&
也是可以用的,并且也是后台运行的意思。但是,他的后台运行只是说你在这个git bash
窗口中后台运行,只要你不关闭这个窗口,就会在后台运行,你可以在窗口中输入其他命令执行。如果你关闭这个窗口,就会提示你,还有在运行的会话,是否要全部关闭。如果点击OK,git bash
直接退出了,jstat也就关闭了。
- 使用编程语言调用cmd
可以借助编程语言,调用cmd来执行语句,然后把输出的结果处理一下,给他加上日期时间等import java.io.BufferedReader; import java.io.InputStreamReader; import java.time.LocalDateTime; public class JStatGcMonitor { public static void main(String[] args) { // 监控的进程ID final String pid = "25392"; // 输出间隔时间,单位毫秒 final int interval = 1000; // 构造命令 如果想一直跑,就可以不加 + " " + 2 次数限制 final String command = "jstat -gc " + pid + " " + interval + " " + 2; System.out.println("执行:" + command); try { // 执行命令 Process process = Runtime.getRuntime().exec(command); // 获取命令的输出流 BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); // 读取并打印输出 String line; while ((line = reader.readLine()) != null) { // 获取当前的日期时间,如果只需要时间部分的可以使用LocalTime LocalDateTime now = LocalDateTime.now(); // 这里直接输出,如果需要特定的日期时间格式,可以自己格式化一下 System.out.println(now + " | " + line); } reader.close(); // 等待子进程结束 int exitCode = process.waitFor(); System.out.println("cmd脚本执行完毕,退出" + exitCode); } catch (Exception e) { e.printStackTrace(); } } }
- 使用
Windows PowerShell
处理- 只输出在控制台
jstat -gc 25580 1000 9999 | foreach{(Get-Date -Format "yyyy-MM-dd HH:mm:ss ") + $_}
foreach
是ForEach-Object
的别名,%
也是,所以这三个用哪一个都行。(Get-Date -Format "yyyy-MM-dd HH:mm:ss ")
意思是获取当前时间,并格式化,$_
是拿到管道符之前的那个命令的输出,在这里把当前时间和输出加起来,就到达了我们需要的效果。
- 输出在控制台的同时保存在文件中
jstat -gc 25580 1000 9999 | foreach{(Get-Date -Format "yyyy-MM-dd HH:mm:ss ") + $_} | tee-object one.log
tee-object
命令可以将管道符之前输出的内容保存到文件中,并且输出在控制台中,这里面one.log
会保存在当前所在的路径。可以使用绝对路径。
- 只保存在文件中,控制台不输出
jstat -gc 25580 1000 9999 | foreach{(Get-Date -Format "yyyy-MM-dd HH:mm:ss ") + $_} | Out-File two.log
Out-File
把前一个输出保存到指定的文件,也可以使用绝对路径
- 只输出在控制台