JDK(Java Development Kit)除了提供运行Java程序所需的基础环境,还附带了一系列开发者和运维人员常用的命令行工具。这些工具分布在JDK安装目录的bin文件夹中,按用途可以划分为编译构建、运行监控、故障诊断、文档生成等多个类别。掌握它们的功能,有助于在本地开发、测试联调和生产排障中快速定位问题。

一、编译与构建类工具
这类工具是Java开发中最基础的部分,主要负责将源代码转换为可执行的字节码或打包产物。其中javac是最核心的编译器,它把.java文件编译为.class文件,支持指定编码、输出路径和依赖的源码版本。
另一个常用工具是jar,用于将多个.class文件及资源打包成.jar归档文件,也可以生成可执行的胖包。在模块化之后,jmod用于创建和查看JMOD格式模块,而javap则可以反汇编类文件,查看字节码指令,对理解底层机制很有帮助。
# 编译单个源码文件 javac -encoding UTF-8 -d out/ src/Main.java # 打包为可执行jar jar cfe app.jar Main -C out/ . # 查看类文件结构 javap -p -c out/Main.class
二、运行与进程查看工具
java命令本身用于启动JVM并运行程序,可以配合-Xmx、-Xms等参数调整堆内存。与之配合的jps相当于Java版的ps,能列出当前用户所有HotSpot虚拟机进程及对应的LVMID,方便后续用其他工具附着。
在容器化部署中,由于进程号映射复杂,jps依然能准确识别Java进程。结合jstat可实时观察垃圾回收、类加载等统计信息,不需要额外代理,对轻量监控非常实用。
# 列出Java进程 jps -l # 查看某进程GC情况,每1秒采样一次,共5次 jstat -gc 12345 1000 5
三、故障诊断与内存分析工具
当系统出现卡顿、内存溢出或死锁时,JDK自带的诊断工具能发挥关键作用。jstack用于生成线程快照,从中可以看到每个线程的调用栈与状态,是排查死锁和忙等的第一选择。
jmap可以导出堆转储文件(heap dump),配合离线分析工具查看对象占用。而jhat虽然已被标记为废弃,但仍能启动一个简易HTTP服务浏览堆内容。新版本中更推荐用jcmd统一发送诊断指令,功能覆盖前述多个工具。
# 导出线程快照 jstack 12345 > thread.txt # 生成堆转储 jmap -dump:live,format=b,file=heap.hprof 12345 # 使用jcmd等效操作 jcmd 12345 GC.heap_dump heap.hprof
四、可视化与综合工具
除了纯命令行,JDK也提供了带界面的工具。jconsole基于JMX连接本地或远程JVM,可动态查看内存、线程、CPU使用情况。 jvisualvm功能更丰富,支持插件扩展、采样和性能分析,适合开发阶段深度观测。
这些可视化工具底层仍调用同样的JVM接口,因此在受限环境无法启用图形界面时,应回退到前面介绍的命令行工具。根据场景灵活搭配,才能既高效又低侵入地完成工作。
| 工具名 | 类别 | 主要用途 |
|---|---|---|
| javac | 编译 | 将Java源码编译为字节码 |
| jar | 构建 | 打包类与资源为归档文件 |
| jps | 运行 | 查看Java进程列表 |
| jstack | 诊断 | 输出线程快照排查阻塞 |
| jmap | 诊断 | 堆内存统计与转储 |
| jconsole | 可视化 | 图形化监控JVM状态 |
五、文档与其他辅助工具
javadoc能从源码注释提取API文档,是项目交付的重要一环。此外还有keytool管理密钥和证书,jrunscript执行脚本语言,满足安全与自动化需求。
总体来看,JDK工具链覆盖了从写代码到上线运维的完整生命周期。理解它们的定位与局限,可以避免盲目引入外部组件,也能在紧急故障时依靠环境自带能力迅速响应。