如何通过控制台计算多线程Java程序的执行时间与内存占用?
解决Java多线程程序的命令行性能分析问题
针对你遇到的主线程先于子线程结束、传统计时方法失效的场景,这里有几个纯命令行的方案来统计执行时间和分析内存占用:
一、统计程序总执行时间
因为你的主线程会提前退出,但整个Java进程要等所有非守护线程结束才会终止,所以可以用系统自带的命令行计时工具直接统计进程的完整运行时间:
Linux/macOS:time命令
直接在启动命令前加上time即可:
time java class1
执行完成后会输出三个时间值:
real:从程序启动到完全退出的总墙钟时间(就是你关心的实际耗时)user:程序在用户态消耗的CPU时间总和sys:程序在内核态消耗的CPU时间总和
Windows:PowerShell Measure-Command
打开PowerShell,用以下命令:
Measure-Command { java class1 }
输出会包含TotalSeconds、TotalMilliseconds等精确的时间统计,直接反映进程的完整运行时长。
二、命令行内存占用分析
不用图形化的jconsole,JDK自带了多个纯命令行工具可以分析内存:
1. jps + jstat:实时监控堆内存与GC情况
- 第一步:用
jps找到你的Java进程ID(PID):
这个命令会列出当前运行的Java进程,jps -l-l参数会显示主类的全限定名,方便你找到class1对应的PID。 - 第二步:用
jstat实时监控堆内存和GC:
其中jstat -gc <你的PID> 10001000表示每1000毫秒(1秒)输出一次数据,内容包括Eden区、Survivor区、老年代的内存使用量,以及GC的次数和耗时,能帮你观察内存变化趋势。
2. jmap:查看堆内存分布与生成快照
- 查看堆的整体配置与当前使用情况:
会输出堆的大小、新生代/老年代的划分、当前已使用内存等信息。jmap -heap <你的PID> - 按类统计内存占用(找出大对象):
会列出所有类的实例数量、占用内存大小,按内存排序,方便定位内存占用大户。jmap -histo <你的PID>
3. jcmd:多功能命令行诊断工具
jcmd是JDK 7+自带的多功能工具,能替代多个老工具的功能:
- 查看堆内存信息:
jcmd <你的PID> GC.heap_info - 查看本地内存使用(包括堆外内存):
jcmd <你的PID> VM.native_memory
这些工具都是JDK自带的,无需额外安装,全程命令行操作,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Ankur Parihar
相关产品推荐
相关产品推荐

