目录
- 环境准备:如何配置 JDK 环境变量
- 核心命令:Java 开发和运行的基础
- 打包与工具命令:JAR、密钥库管理等
- 故障排查与性能分析命令:JVM 调试利器
- Java 模块化系统命令 (JPMS):Java 9+ 新特性
- 实用小技巧
环境准备:配置 JAVA_HOME 和 PATH
在使用任何 JDK 命令之前,必须确保你的系统环境变量配置正确。

JAVA_HOME: 指向你的 JDK 安装根目录。- Windows:
C:\Program Files\Java\jdk-17 - macOS / Linux:
/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home或/usr/lib/jvm/jdk-17
- Windows:
PATH: 包含%JAVA_HOME%\bin(Windows) 或$JAVA_HOME/bin(macOS/Linux),这样你才能在任何目录下直接执行java,javac等命令。
验证安装: 打开终端或命令提示符,输入以下命令:
java -version javac -version
如果都输出了对应的版本号(如 java version "17.0.2"),则表示配置成功。
核心命令
这些是 Java 开发中最常用、最基础的命令。
javac: Java 编译器
将 .java 源文件编译成 .class 字节码文件。

基本语法:
javac [选项] 源文件.java...
常用选项:
-d <目录>: 指定编译后的.class文件存放的目录。-classpath <路径>或-cp <路径>: 指定查找用户类文件和注释处理程序的位置。-sourcepath <路径>: 指定查找输入源文件的位置。-Xlint: 启用建议的编译器警告。
示例:
# 1. 编译当前目录下的 HelloWorld.java javac HelloWorld.java # 2. 编译并将 .class 文件输出到 target/classes 目录 mkdir -p target/classes javac -d target/classes HelloWorld.java # 3. 编译时引用外部 JAR 包 (lib/mylib.jar) javac -cp ".:lib/mylib.jar" Main.java # Linux/macOS (注意是冒号) javac -cp ".;lib\mylib.jar" Main.java # Windows (注意是分号) # 4. 启用所有编译器警告 javac -Xlint HelloWorld.java
java: Java 虚拟机
运行已编译的 .class 文件。

基本语法:
java [选项] 类名 [参数]
关键点:
- 不要加
.class后缀:java命令后面跟的是类名,不是文件名。 classpath: 如果类不在当前目录或标准位置,需要用-cp或-classpath指定其位置。
常用选项:
-classpath <路径>或-cp <路径>: 指定查找.class文件的路径。-jar <jar文件>: 执行一个打包好的 JAR 文件。-D<名称>=<值>: 设置一个系统属性。-verbose:class: 打载类的详细信息。-Xms和-Xmx: 设置 JVM 删堆大小和最大堆大小。
示例:
# 1. 运行当前目录下的 HelloWorld 类
java HelloWorld
# 2. 运行 target/classes 目录下的 Main 类
java -cp target/classes Main
# 3. 运行时传入参数
# 假设 Main 类中有 public static void main(String[] args)
java -cp target/classes Main arg1 arg2 "arg with space"
# 4. 设置 JVM 堆大小为 512MB (初始) 和 2GB (最大)
java -Xms512m -Xmx2g -cp target/classes MyApplication
# 5. 设置自定义系统属性,并在代码中通过 System.getProperty("my.config") 读取
java -Dmy.config=/path/to/config.xml -cp target/classes MyApp
打包与工具命令
jar: Java 归档工具
用于创建和管理 JAR (Java Archive) 文件。
基本语法:
jar {ctxui}[vfmn0PME] [jar-file] [manifest-file] [-C dir] files ...
c: 创建新档案t: 列出档案目录x: 从档案中提取指定文件(或所有文件)u: 更新现有档案v: 生成详细输出到标准输出f: 指定档案文件名m: 包含指定清单文件中的清单信息0: 仅存储,不使用任何 ZIP 压缩
常用示例:
# 1. 将 target/classes 下的所有文件打包成 app.jar jar -cvf app.jar -C target/classes . # 2. 查看 app.jar 中包含哪些文件 jar -tf app.jar # 3. 从 app.jar 中提取所有文件到当前目录 jar -xvf app.jar # 4. 创建一个可执行的 JAR (需要指定 Main-Class) # a) 先创建一个清单文件 MANIFEST.MF echo "Main-Class: com.example.Main" > MANIFEST.MF # b) 打包时指定清单文件 jar -cvfm app.jar MANIFEST.MF -C target/classes . # c) 运行 java -jar app.jar
keytool: 密钥和证书管理工具
用于管理密钥库(Keystore),常用于生成 SSL/TLS 证书。
示例: 创建一个用于本地开发的自签名证书。
# 创建一个名为 mykeystore.jks 的密钥库,并生成一个别名为 "mykey" 的证书 keytool -genkeypair -alias mykey -keyalg RSA -keystore mykeystore.jks -storepass changeit -keypass changeit -dname "CN=localhost, OU=MyOrg, O=MyCompany, L=City, S=State, C=US"
故障排查与性能分析命令
这些是生产环境中排查问题(如内存溢出、死锁、性能瓶颈)的利器。
jps: Java Virtual Machine Process Status Tool
列出当前运行的 Java 虚拟机进程及其 ID。
jps [options] [hostid]
示例:
# 列出本机所有 Java 进程 jps # 输出可能如下: # 12345 Main # 67890 Jps # 列出进程的完整主类名和传递给 main 方法的参数 jps -l jps -v
jps 的搭档:jinfo, jstat, jstack, jmap
这些工具通常需要目标 Java 进程的 PID (Process ID),可以通过 jps 获取。
jstack: Java Stack Trace Tool
生成 Java 虚拟机中指定 Java 线程的 Java 堆栈跟踪信息。
主要用途:
- 排查死锁:
jstack -l <pid>会自动检测并报告死锁。 - 分析线程卡顿:查看线程是处于
RUNNABLE(运行中)、WAITING(等待中)还是BLOCKED(阻塞)状态。
示例:
# 1. 生成 PID 为 12345 的进程的堆栈跟踪 jstack 12345 > stacktrace.log # 2. 生成堆栈跟踪,并包含关于锁的额外信息(推荐用于死锁分析) jstack -l 12345 # 3. 每 1000ms(1秒)打印一次堆栈跟踪,动态观察线程状态 jstack -l 12345 1000
jmap: Memory Map for Java
用于生成 Java 虚拟机的内存转储快照,或查看堆内存的详细信息。
主要用途:
- 生成堆转储文件:用于后续使用 MAT (Memory Analyzer Tool) 或 VisualVM 等工具进行详细的内存分析,查找内存泄漏。
- 查看堆内存使用情况。
示例:
# 1. 查看目标进程的内存使用情况(包括堆、非堆、类加载等) jmap -heap 12345 # 2. 生成一个二进制的堆转储文件 (heap dump) # 注意:此操作会使目标 JVM 暂停,生产环境需谨慎使用 jmap -dump:format=b,file=heapdump.hprof 12345
jstat: Java Virtual Machine Statistics Monitoring Tool
监视虚拟机各种运行时信息,如类加载、垃圾回收、编译器等。
主要用途:
- 监控 GC 活动:观察 GC 的频率和耗时,判断是否需要优化 JVM 参数。
示例:
# 1. 监控 PID 为 12345 的进程的 GC 情况,每 1 秒打印一次 jstat -gc 12345 1000 # 输出列解释: # S0C, S1C: Survivor 0/1 区容量 # S0U, S1U: Survivor 0/1 区使用量 # EC, EU: Eden 区容量和使用量 # OC, OU: Old 区容量和使用量 # MC, MU: 元空间容量和使用量 # CCSC, CCSU: 压缩类空间容量和使用量 # YGC, YGCT: Young GC 次数和耗时 # FGC, FGCT: Full GC 次数和耗时 # GCT: 总 GC 耗时
jconsole 和 jvisualvm: 可视化监控工具
JDK 自带的图形化工具,功能强大,是日常开发、测试和简单生产环境监控的首选。
jconsole: 简单的监控工具,可以查看内存使用、线程状态、类加载情况等。jvisualvm: 更强大的工具,集成了jstat,jmap的功能,并能分析堆转储文件 (heapdump.hprof)。
启动方式:
jconsole & jvisualvm &
启动后,你可以选择本地或远程的 Java 进程进行连接和监控。
Java 模块化系统命令 (JPMS)
从 Java 9 开始引入,用于构建更可靠、可维护的大型应用。
javac: 模块化编译
使用 --module-source-path 和 --module 选项。
# 假设项目结构如下: # src/ # com.myapp/ # module-info.java # Main.java # org.mylib/ # module-info.java # MyLib.java # 编译所有模块 javac --module-source-path src -d mods --module com.myapp,org.mylib
java: 模块化运行
使用 --module-path 和 --module 选项。
# 运行 com.myapp 模块中的 Main 类 java --module-path mods --module com.myapp/com.example.Main
jdeps: Java 依赖分析工具
分析类文件或 JAR 文件的依赖关系,对模块化开发非常有用。
# 分析 app.jar 的依赖关系 jdeps app.jar # 分析模块路径下的依赖 jdeps --module-path mods --list-deps com.myapp
实用小技巧
-
命令帮助: 任何 JDK 命令都支持
-h或-help参数来查看其所有选项。java -help javac -help jmap -help
-
管道 和
grep: 在 Linux/macOS 上,可以将命令的输出通过管道传递给grep来过滤信息。# 查找所有处于 "BLOCKED" 状态的线程 jstack -l 12345 | grep BLOCKED
-
find命令: 在大型项目中查找.java或.class文件。# 在当前目录及其子目录下查找所有 .java 文件 find . -name "*.java"
| 命令 | 主要用途 | 关键点 |
|---|---|---|
javac |
编译 .java 源文件 |
-d (输出目录), -cp (类路径) |
java |
运行 .class 字节码 |
不加 .class 后缀, -cp (类路径), -jar (运行JAR) |
jar |
创建/管理 JAR 包 | -c (创建), -t (列表), -x (解压), -f (指定文件) |
jps |
列出 Java 进程 ID | jps -l (查看完整类名) |
jstack |
生成线程堆栈跟踪 | 排查死锁, -l (显示锁信息) |
jmap |
生成内存转储/查看内存 | jmap -dump (生成 heap dump), -heap (查看堆信息) |
jstat |
监控 JVM 运行时统计 | jstat -gc (监控 GC 活动) |
jvisualvm |
图形化监控利器 | 集成多种功能,分析 heap dump |
掌握这些命令是成为一名合格 Java 开发者的必备技能,从 javac 和 java 开始,逐步熟悉 jstack, jmap, jvisualvm 等排查工具,你的问题解决能力将得到质的飞跃。
