菜鸟科技网

JDK命令有哪些常用参数及使用场景?

目录

  1. 环境准备:如何配置 JDK 环境变量
  2. 核心命令:Java 开发和运行的基础
  3. 打包与工具命令:JAR、密钥库管理等
  4. 故障排查与性能分析命令:JVM 调试利器
  5. Java 模块化系统命令 (JPMS):Java 9+ 新特性
  6. 实用小技巧

环境准备:配置 JAVA_HOMEPATH

在使用任何 JDK 命令之前,必须确保你的系统环境变量配置正确。

JDK命令有哪些常用参数及使用场景?-图1
(图片来源网络,侵删)
  • 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
  • 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 字节码文件。

JDK命令有哪些常用参数及使用场景?-图2
(图片来源网络,侵删)

基本语法:

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 文件。

JDK命令有哪些常用参数及使用场景?-图3
(图片来源网络,侵删)

基本语法:

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 耗时

jconsolejvisualvm: 可视化监控工具

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

实用小技巧

  1. 命令帮助: 任何 JDK 命令都支持 -h-help 参数来查看其所有选项。

    java -help
    javac -help
    jmap -help
  2. 管道 和 grep: 在 Linux/macOS 上,可以将命令的输出通过管道传递给 grep 来过滤信息。

    # 查找所有处于 "BLOCKED" 状态的线程
    jstack -l 12345 | grep BLOCKED
  3. 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 开发者的必备技能,从 javacjava 开始,逐步熟悉 jstack, jmap, jvisualvm 等排查工具,你的问题解决能力将得到质的飞跃。

分享:
扫描分享到社交APP
上一篇
下一篇