Java程序崩溃时会生成hs_err_pid.log(或类似命名的文件),包含崩溃原因、线程堆栈、JVM状态等关键信息。默认路径为程序工作目录,可通过-XX:ErrorFile参数自定义位置(如java -XX:ErrorFile=/var/log/java/java_error_%p.log ...)。
操作命令:
# 进入程序工作目录查找日志
cd /path/to/your/app
ls -lh hs_err_*.log # 查找最近的崩溃日志
cat hs_err_pid*.log # 查看日志内容
日志中的Problematic Frame(如C [libmylibrary.so+0x8b07])会指向崩溃根源(JVM内部、本地库或JNI代码)。
崩溃日志的结构可分为以下几部分,需重点关注:
EXCEPTION_ACCESS_VIOLATION(内存访问违规,常见于JNI或JVM Bug)、SIGSEGV(段错误,通常由本地代码引起)、StackOverflowError(栈溢出,递归过深)。V表示JVM代码,C表示本地C代码,j表示解释执行的Java代码)。例如V [jvm.dll+0x15e87e]说明是JVM内部问题。at com.example.MyClass.myMethod(MyClass.java:25))。PermGen space耗尽)、GC情况(如Full GC频繁),可判断是否因资源不足导致崩溃。根据日志分析结果,针对性解决:
表现:日志中出现java.lang.OutOfMemoryError: Java heap space(堆内存不足)、java.lang.OutOfMemoryError: PermGen space(永久代空间不足,Java 8后为Metaspace)。
解决方法:
java -Xms512m -Xmx2048m -XX:MaxPermSize=512m -jar your_app.jar # Java 8及以下
java -Xms512m -Xmx2048m -XX:MaxMetaspaceSize=512m -jar your_app.jar # Java 8以上
表现:Problematic Frame为C开头(如C [libnative.so+0x1234]),或日志中出现UnsatisfiedLinkError。
解决方法:
-Djava.library.path指定):java -Djava.library.path=/path/to/native/libs -jar your_app.jar
.so文件)。ldd命令检查本地库依赖是否完整:ldd /path/to/libnative.so
表现:日志中出现EXCEPTION_ACCESS_VIOLATION,且Problematic Frame为JVM代码(如V [jvm.dll+0x5678])。
解决方法:
表现:日志中出现java.lang.StackOverflowError,通常伴随大量递归调用堆栈。
解决方法:
-Xss参数,单位为KB):java -Xss2m -jar your_app.jar # 默认栈大小通常为1MB
jstat(监控GC)、jstack(查看线程堆栈)、jmap(导出堆转储)等工具:# 每2秒监控一次GC情况(间隔2秒,共10次)
jstat -gcutil <PID> 2000 10
# 导出堆转储文件(用于分析内存泄漏)
jmap -dump:format=b,file=/tmp/heap.hprof <PID>
systemd或crontab监控Java进程,崩溃后自动重启(如systemctl restart your_java_service)。通过以上步骤,可快速定位并解决CentOS上Java程序崩溃的问题。若仍无法解决,可将崩溃日志、程序代码片段及环境信息(JDK版本、CentOS版本)发布到技术社区(如Stack Overflow),寻求进一步帮助。