JDK的命令行工具是Java开发过程中不可或缺的重要组成部分,它们为开发者提供了从代码编译、调试到性能监控、打包部署等一系列高效的操作手段,这些工具通常位于JDK安装目录的bin
文件夹下,通过命令行方式执行,能够直接与Java虚拟机(JVM)和底层系统交互,帮助开发者快速定位问题、优化性能并完成开发任务,以下将详细介绍JDK中常用的命令行工具及其功能、使用场景和操作示例。

基础开发工具
javac:Java编译器
javac
是Java语言的核心编译工具,负责将Java源代码(.java
文件)编译成Java字节码(.class
文件),其基本语法为javac [选项] 源文件名
,常用选项包括:
-d
:指定.class
文件的输出目录,例如javac -d ./src/classes HelloWorld.java
会将编译后的类文件输出到src/classes
目录。-classpath
或-cp
:设置类路径,用于指定编译时依赖的类文件或JAR包,例如javac -cp ./lib/* HelloWorld.java
。-source
和-target
:分别指定源代码兼容的Java版本和目标字节码版本,例如javac -source 1.8 -target 1.8 HelloWorld.java
确保编译结果兼容Java 8。
java:Java运行工具
java
命令用于启动JVM运行编译后的.class
文件或JAR包,基本语法为java [选项] 类名 [参数]
,常用选项包括:
-jar
:运行JAR包中的主类,例如java -jar app.jar
。-classpath
:设置运行时类路径,与javac
类似,但用于运行时依赖加载。-Xms
和-Xmx
:设置JVM堆内存的初始值和最大值,例如java -Xms512m -Xmx1024m HelloWorld
。-D
:设置系统属性,例如java -Dfile.encoding=UTF-8 HelloWorld
指定文件编码为UTF-8。
jar:归档工具
jar
命令用于将.class
文件、资源文件等打包成JAR(Java Archive)文件,便于分发和部署,常用操作包括:
- 创建JAR包:
jar cvf myapp.jar -C ./src/classes .
,其中c
表示创建,v
显示详细过程,f
指定输出文件名。 - 列出JAR内容:
jar tf myapp.jar
,t
表示列出内容。 - 解压JAR包:
jar xvf myapp.jar
,x
表示解压。
调试与监控工具
jdb:Java调试器
jdb
是一个命令行调试工具,支持设置断点、查看变量、单步执行等调试操作,使用时需先以调试模式运行程序:java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 HelloWorld
,然后通过jdb -attach 5005
连接调试会话,常用命令包括:

break
:设置断点,例如break com.example.MyClass:20
。run
:启动程序执行。print
:查看变量值,例如print this.name
。cont
:继续执行程序。
jps:Java虚拟机进程状态工具
jps
用于查看当前系统中运行的Java进程及其ID(LVMID),类似于Linux的ps
命令,常用选项包括:
-l
:输出主类的完整名称,包括包名。-v
:输出JVM启动参数。-q
:仅输出进程ID,不输出其他信息。
jstat:JVM统计监控工具
jstat
用于实时监控JVM的运行时数据,如堆内存使用、垃圾回收(GC)情况、类加载统计等,语法为jstat [选项] [vmid] [间隔时间] [采样次数]
,常用选项包括:
-gc
:显示GC堆信息,包括年轻代、老年代、元空间的容量和使用情况。-gcutil
:显示GC堆各区域的内存使用百分比。-class
:显示类加载信息,如加载的类数量、卸载的类数量。
性能分析与故障排查工具
jstack:Java堆栈跟踪工具
jstack
用于生成Java线程的堆栈跟踪信息,常用于排查死锁、线程阻塞等问题,基本用法为jstack [vmid] > thread_dump.txt
,生成的堆栈信息会显示每个线程的名称、状态、调用栈等。
jmap:内存映像工具
jmap
用于生成JVM的内存堆转储(heap dump)文件,或查看内存使用情况,常用选项包括:

-heap
:打印堆内存配置信息。-histo
:打印堆中对象的统计信息,如类名、实例数量、内存占用。-dump:format=b,file=heap.hprof
:生成二进制格式的堆转储文件,可通过MAT(Memory Analyzer Tool)等工具分析。
jhat:堆分析工具
jhat
用于分析堆转储文件,并以HTTP方式提供交互式界面查看对象引用关系,使用时需先通过jmap
生成堆转储文件,然后执行jhat heap.hprof
,最后通过浏览器访问http://localhost:7000
查看分析结果。
其他实用工具
keytool:密钥与证书管理工具
keytool
用于管理密钥库(Keystore),生成数字证书、管理公钥和私钥等,常用于SSL/TLS配置,生成自签名证书:keytool -genkey -alias mykey -keystore keystore.jks -keyalg RSA
。
jarsigner:JAR签名工具
jarsigner
用于对JAR文件进行数字签名,确保文件的完整性和来源可信,基本用法为jarsigner -keystore keystore.jks -signedjar signed.jar myapp.jar mykey
,其中mykey
是密钥库中的别名。
工具使用场景对比
工具名称 | 主要功能 | 典型使用场景 |
---|---|---|
javac | 编译Java源代码 | 将.java 文件编译为.class 文件,生成可执行的字节码 |
java | 运行Java程序 | 启动JVM执行类文件或JAR包,可配置运行时参数 |
jdb | 调试Java程序 | 定位代码逻辑错误,查看变量状态,支持断点调试 |
jps | 查看Java进程 | 快速定位运行中的Java进程ID,辅助调试和监控 |
jstat | 监控JVM性能 | 实时查看内存使用、GC频率等,分析性能瓶颈 |
jstack | 分析线程堆栈 | 排查死锁、线程阻塞问题,查看线程执行状态 |
jmap | 生成内存转储 | 分析内存泄漏,查看对象分布情况 |
相关问答FAQs
Q1: 如何使用jstat监控JVM的GC情况?
A1: 使用jstat -gc <vmid> <interval> <count>
命令监控GC情况。jstat -gc 12345 1000 10
表示每隔1秒(1000毫秒)打印一次进程ID为12345的JVM的GC信息,共打印10次,输出结果包括Eden区、Survivor区、老年代、元空间的容量、已用空间、GC次数和时间等,通过这些数据可以判断GC是否频繁、内存是否充足。
Q2: 遇到内存泄漏问题时,如何使用jmap和jhat定位原因?
A2: 首先通过jmap -dump:format=b,file=heap.hprof <vmid>
生成堆转储文件,然后使用jhat heap.hprof
启动堆分析服务,最后通过浏览器访问http://localhost:7000
,在jhat界面中,使用OQL
(对象查询语言)查询大对象或可疑对象,例如select * from java.lang.String s where s.value.length > 10000
,找出占用内存较大的对象及其引用链,定位内存泄漏的根源。