Java程序崩潰時,JVM會自動生成hs_err_pid*.log文件(*代表進程ID),包含崩潰類型、堆棧跟蹤、JVM版本、系統環境等關鍵信息。
/var/log/java/
下,也可通過find / -name "hs_err_pid*.log"
全局搜索。SIGSEGV
(段錯誤,內存訪問違規)、OutOfMemoryError
(內存溢出);libjvm.so
表示JVM自身問題)。資源不足是Java崩潰的常見原因,需檢查以下指標:
free -m
查看內存剩余,top
按M
排序查看進程內存占用(若Java進程占用接近系統上限,可能觸發OutOfMemoryError
);top
按1
查看CPU核心使用率,htop
監控線程級CPU占用(高CPU可能導致線程阻塞或死鎖);df -h
檢查根分區及日志目錄(如/var/log
)的剩余空間(磁盤滿會導致寫入失敗,引發崩潰)。環境配置錯誤會導致程序無法正常運行:
java -version
確認安裝的JDK/JRE版本(如程序需要Java 11,而系統安裝的是Java 8,需升級或降級);echo $JAVA_HOME
檢查是否指向正確路徑(如/usr/lib/jvm/java-11-openjdk
),echo $PATH
確保包含$JAVA_HOME/bin
(避免調用錯誤Java版本)。依賴缺失或沖突會導致ClassNotFoundException
、NoClassDefFoundError
等錯誤:
-cp
參數指定依賴路徑(如java -cp ".:lib/*" com.example.Main
,lib
為依賴目錄);pom.xml
/build.gradle
中的依賴項(如版本沖突可通過mvn dependency:tree
分析)。針對特定問題,借助JVM工具進一步分析:
jmap
生成堆轉儲文件(jmap -dump:format=b,file=/tmp/heap.hprof <PID>
),再用Eclipse MAT分析內存中的對象占用(如大對象、重復加載的類);jstack
獲取線程快照(jstack <PID> > thread_dump.log
),分析線程狀態(如BLOCKED
狀態的線程可能因鎖競爭導致死鎖);-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/app/gc.log
啟用GC日志,用VisualVM或GCViewer分析GC頻率(如頻繁Full GC可能導致性能下降)。chmod +x /path/to/program
,chmod -R 755 /path/to/libs
);application.properties
、log4j.xml
)的路徑和內容(如數據庫連接字符串錯誤、日志路徑不存在會導致啟動失?。?。OutOfMemoryError
,增加堆內存大?。ㄈ?code>-Xms512m -Xmx2048m,初始堆512MB,最大堆2GB);-XX:+UseG1GC
),提升垃圾回收效率。若以上步驟無法解決,可將錯誤日志、JVM參數、程序環境(操作系統版本、JDK版本、依賴庫版本)整理后,在技術社區(如Stack Overflow、CSDN)提問,或聯系程序廠商獲取支持。