原因:编译Java程序的JDK版本高于运行环境的JRE版本(如用JDK 11编译,用JRE 8运行)。
解决方法:
sudo yum install java-11-openjdk-devel
);javac -target 1.8 MyClass.java
)。原因:JAVA_HOME
未指向正确JDK路径,或PATH
未包含$JAVA_HOME/bin
,导致java
/javac
命令无法识别。
解决方法:
ls /usr/lib/jvm/
查看OpenJDK目录);/etc/profile
)添加:export JAVA_HOME=/usr/lib/jvm/java-11-openjdk # 替换为实际路径
export PATH=$JAVA_HOME/bin:$PATH
source /etc/profile
);echo $JAVA_HOME
应显示路径,java -version
应输出版本信息)。原因:JVM堆内存(-Xmx
)或元空间(-XX:MaxMetaspaceSize
)设置过小,或程序存在内存泄漏。
解决方法:
java -Xms512m -Xmx2048m MyApp
,其中-Xms
为初始堆,-Xmx
为最大堆);catalina.sh
中添加:JAVA_OPTS="-Xms1024m -Xmx2048m -XX:MaxMetaspaceSize=512m"
jmap
(jmap -histo:live <pid>
)分析内存泄漏,修复代码中未释放的对象(如静态集合、未关闭的流)。原因:运行时未找到所需的类文件,常见于:
-cp
(类路径)参数;java -cp ".:lib/*" com.example.Main
,.
表示当前目录,lib/*
表示lib文件夹下所有JAR);maven-assembly-plugin
生成Fat JAR);com/example/Main.class
应在com/example/
目录下)。原因:
package com.example;
但未放在com/example/
目录下);java -cp "/path/to/classes" com.example.Main
);com.example.Main
需放在com/example/Main.java
);原因:
/home/user/data.txt
)或确认相对路径的正确性(pwd
查看当前目录);chmod +r /path/to/file
允许读取);ls /path/to/file
)。原因:系统缺少中文字体,或JVM未指定字符编码(默认使用系统编码,如CentOS默认UTF-8
但部分环境可能不同)。
解决方法:
mkdir -p /usr/share/fonts/chinese/TrueType
wget https://example.com/simsun.ttf -O /usr/share/fonts/chinese/TrueType/simsun.ttf # 替换为实际字体URL
chmod 644 /usr/share/fonts/chinese/TrueType/simsun.ttf
fc-cache -fv # 更新字体缓存
java -Dfile.encoding=UTF-8 com.example.Main
)。原因:程序依赖的外部JAR包未添加到类路径中。
解决方法:
lib/
);-cp
参数(如java -cp "lib/*:." com.example.Main
,注意冒号分隔路径,Windows用分号)。原因:错误信息不明确,需通过日志定位具体问题。
解决方法:
catalina.out
,或自定义日志文件):tail -f /path/to/logfile.log # 实时查看日志
grep "ERROR" /path/to/logfile.log # 筛选错误信息
jstack <pid>
:查看线程堆栈(定位死锁、线程阻塞);jmap -heap <pid>
:查看堆内存使用情况;jstat -gc <pid> 1000
:每秒监控GC情况(判断内存泄漏)。原因:当前用户无权限执行Java程序或访问相关文件(如/usr/lib/jvm/
目录权限不足)。
解决方法:
chmod +x /path/to/java/application
);sudo
运行需要管理员权限的命令(谨慎使用);chown -R user:user /path/to/java
,将user
替换为当前用户)。