目录
- 前提条件:安装 Java 开发工具包
- 核心概念:
JAVA_HOME和PATH - 基础 Java 命令详解
java:运行 Java 程序javac:编译 Java 源代码jar:打包/解包 Java 归档文件jps:查看当前运行的 Java 进程jstat:监控 JVM 性能
- 实战演练:从编写到运行一个 Java 程序
- 高级用法与技巧
- 设置 JVM 堆内存大小 (
-Xms,-Xmx) - 指定类路径 (
-cp或-classpath) - 使用外部 Jar 包
- 生成和分析堆转储文件 (
-XX:+HeapDumpOnOutOfMemoryError)
- 设置 JVM 堆内存大小 (
- 常见问题与解决方案
'java: command not found'错误Error: Could not find or load main class错误OutOfMemoryError: Java heap space错误
前提条件:安装 Java 开发工具包
在运行 Java 命令之前,你的 Linux 系统上必须安装 JDK (Java Development Kit),JDK 包含了运行 Java 程序所需的 JRE (Java Runtime Environment) 以及开发工具(如 javac, jar 等)。

如何检查是否已安装 JDK?
打开终端,输入以下命令:
java -version javac -version
如果两个命令都返回了版本号,说明你已经安装了 JDK,如果提示 command not found,则需要进行安装。
如何安装 JDK?(以 Ubuntu/Debian 为例)
使用 APT 包管理器(推荐)
这是最简单的方法,会自动处理依赖关系。

# 更新软件包列表 sudo apt update # 安装 OpenJDK 11 (LTS 版本,非常稳定) sudo apt install openjdk-11-jdk # 或者安装最新的 LTS 版本 OpenJDK 17 sudo apt install openjdk-17-jdk
手动下载安装
- 从 Oracle 官网 或 Adoptium (Eclipse Temurin) 下载对应 Linux 系统的 JDK 压缩包(如
.tar.gz)。 - 将下载的文件移动到
/opt目录(通常用于存放第三方软件)。sudo tar -xzf jdk-11.0.12_linux-x64_bin.tar.gz -C /opt/
- 设置环境变量(见下一节)。
核心概念:JAVA_HOME 和 PATH
为了让系统和 Java 工具找到 JDK,需要设置两个关键的环境变量。
JAVA_HOME
指向 JDK 的安装根目录,许多 Java 应用服务器(如 Tomcat, Jetty)和构建工具(如 Maven, Gradle)都需要这个变量来定位 JDK。
PATH
一个包含多个目录的列表,当你在终端输入一个命令时,系统会按顺序在这些目录中查找对应的可执行文件。必须将 JDK 的 bin 目录添加到 PATH 中,这样你才能在任何位置直接使用 java, javac 等命令。

如何设置环境变量?
临时设置(仅当前终端会话有效)
# 假设 JDK 11 安装在 /usr/lib/jvm/java-11-openjdk-amd64 export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 export PATH=$JAVA_HOME/bin:$PATH # 验证设置 echo $JAVA_HOME echo $PATH
永久设置(推荐)
编辑你的 shell 配置文件(通常是 ~/.bashrc 或 ~/.zshrc,取决于你使用的 Shell)。
# 使用 vim 或 nano 打开配置文件 vim ~/.bashrc
在文件末尾添加以下内容:
# Set Java environment variables export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 # <--- 务必修改为你的实际安装路径 export PATH=$JAVA_HOME/bin:$PATH
保存并退出(在 vim 中是 wq),然后让配置文件立即生效:
source ~/.bashrc
提示:如何找到
JAVA_HOME? 运行ls /usr/lib/jvm/查看已安装的 JDK 版本,选择其中一个路径即可。
基础 Java 命令详解
java:运行 Java 程序
这是运行编译后的 .class 文件的核心命令。
语法:
java [options] class [args...]
或
java [options] -jar jar-file [args...]
javac:编译 Java 源代码
将 .java 源文件编译成 .class 字节码文件。
语法:
javac [options] source-files...
jar:打包/解包 Java 归档文件
将多个 .class 文件和资源文件打包成一个 .jar 文件,便于分发和执行。
语法:
创建 JAR 包:
jar cvf my-app.jar com/
解压 JAR 包:
jar xvf my-app.jar
查看 JAR 包内容:
jar tf my-app.jar
jps:查看当前运行的 Java 进程
一个轻量级工具,类似于 Linux 的 ps 命令,但只显示 Java 进程。
语法:
jps [options] [hostid]
示例:
$ jps 1234 Jps 5678 Main
这里 1234 是 jps 进程本身,5678 是一个名为 Main 的 Java 进程。
jstat:监控 JVM 性能
一个强大的性能分析工具,可以实时查看 JVM 的内存使用、垃圾回收情况等。
语法:
jstat [options] vmid [interval] [count]
示例:
每 1 秒打印一次 PID 为 5678 的 Java 进程的垃圾回收统计信息:
$ jstat -gc 5678 1s S0C S1C ... GC GCT ... 512.0 512.0 ... 2 0.150 ...
实战演练:从编写到运行一个 Java 程序
让我们走一遍完整的流程。
步骤 1:创建项目目录和源文件
mkdir my-java-project cd my-java-project # 创建一个简单的 Hello World 程序 vim HelloWorld.java
在 HelloWorld.java 中输入以下代码:
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, Linux!");
System.out.println("The first argument is: " + args[0]);
}
}
步骤 2:编译源代码
使用 javac 命令编译 .java 文件。
javac HelloWorld.java
如果成功,当前目录下会生成一个 HelloWorld.class 文件。
步骤 3:运行程序
使用 java 命令运行。
# 基本运行 java HelloWorld # 输出: # Hello, Linux! # Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0
程序报错了,因为我们没有传递参数,让我们重新运行,并传递一个参数:
# 运行并传递参数 "LinuxUser" java HelloWorld LinuxUser # 输出: # Hello, Linux! # The first argument is: LinuxUser
注意:java 命令后面跟的是类名 HelloWorld,而不是文件名 HelloWorld.class,并且不要加 .class 后缀。
高级用法与技巧
设置 JVM 堆内存大小
当程序处理大量数据时,可能会遇到内存不足的错误,可以通过 -Xms (初始堆大小) 和 -Xmx (最大堆大小) 来调整。
# 初始堆大小设为 512MB,最大堆大小设为 2GB java -Xms512m -Xmx2g HelloWorld
指定类路径 (-cp 或 -classpath)
如果你的类文件不在当前目录,或者需要引用其他目录的类,就需要使用 -cp 来指定类搜索路径。
示例: 假设你的项目结构如下:
my-project/
├── bin/
│ └── HelloWorld.class
└── lib/
└── some-library.jar
你需要运行 bin 目录下的 HelloWorld 类,并且它依赖于 lib 下的 some-library.jar。
# 使用冒号 : 分隔多个路径 java -cp ./bin:./lib/some-library.jar HelloWorld
在 Windows 中,路径分隔符是分号 ,但在 Linux 和 macOS 中是冒号 。
使用外部 Jar 包
这是 -cp 的一个典型应用场景,许多项目都依赖第三方库(如 Spring, MySQL Connector 等)。
# 假设你有一个 my-app.jar 和两个依赖库 java -cp my-app.jar:lib/library1.jar:lib/library2.jar com.example.MainClass
生成和分析堆转储文件
当程序因 OutOfMemoryError 崩溃时,可以生成一个堆转储文件(.hprof),这个文件包含了崩溃时 JVM 中所有对象的信息,是分析内存泄漏的关键。
步骤 1:运行时启用堆转储
在运行 Java 程序时添加以下 JVM 参数:
java -Xms512m -Xmx1g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/path/to/dumps/heapdump.hpo MyApplication
-XX:+HeapDumpOnOutOfMemoryError:当发生 OOM 时自动生成堆转储。-XX:HeapDumpPath:指定堆转储文件的保存路径。
步骤 2:分析堆转储文件
可以使用 Eclipse MAT (Memory Analyzer Tool) 或 VisualVM 等工具来打开 .hprof 文件,分析哪个对象占用了过多内存,从而定位内存泄漏的根源。
常见问题与解决方案
问题 1:'java: command not found' 错误
原因:系统找不到 java 命令,通常是因为 JDK 的 bin 目录没有添加到系统的 PATH 环境变量中。
解决方案:
- 确认 JDK 已正确安装(
ls /usr/lib/jvm/)。 - 按照 第 2 节 的说明,正确设置并永久生效
JAVA_HOME和PATH。 - 重启终端或重新
source你的配置文件 (source ~/.bashrc)。
问题 2:Error: Could not find or load main class 错误
这是最常见的运行时错误,原因有多种:
原因 1:在错误的目录下运行
你必须在包含 .class 文件(或包含该类的包目录)的目录下运行,或者通过 -cp 指定正确的路径。
原因 2:类名与文件名不匹配
确保文件名(不含扩展名)与 public 类的名称完全一致,包括大小写。
原因 3:类在包中
如果类位于一个包(package)中,package com.example;,那么编译后的 .class 文件会在 com/example/ 目录下,运行时,你必须指定完整的类名(包含包路径),-cp 必须指向包含 com 目录的父目录。
# 假设结构为 ./src/com/example/HelloWorld.class # 类名是 com.example.HelloWorld # -cp 指向 ./src java -cp ./src com.example.HelloWorld
原因 4:使用 -jar 参数时,Main-Class 未正确指定
当你使用 java -jar my-app.jar 运行时,JVM 会忽略 -cp 中的类路径,并且只在 JAR 文件的 META-INF/MANIFEST.MF 文件中查找 Main-Class 属性。
-
手动创建 MANIFEST.MF:
vim MANIFEST.MFMain-Class: com.example.HelloWorld然后打包:
jar cvfm my-app.jar MANIFEST.MF com/ -
Maven/Gradle 自动处理:现代构建工具会自动处理这个步骤。
问题 3:OutOfMemoryError: Java heap space 错误
原因:JVM 的堆内存分配不足,无法容纳程序运行时创建的所有对象。
解决方案:
- 增加堆内存:使用
-Xmx参数增加最大堆内存。java -Xmx2g MyApplication # 将最大堆内存增加到 2GB
- 分析内存泄漏:如果增加内存后问题依旧,说明代码中可能存在内存泄漏(对象不再被使用,但无法被垃圾回收),使用 第 5 节 中介绍的
-XX:+HeapDumpOnOutOfMemoryError生成堆转储文件,并用工具分析。 - 优化代码:检查代码,确保及时释放不再需要的资源(如关闭数据库连接、文件流等),避免不必要的静态集合类等。
希望这份详细的指南能帮助你在 Linux 上顺利地运行和管理 Java 程序!
