带java.lang.前缀的是Java层面异常,说明JVM已启动并执行到业务代码;不带该前缀的如Segmentation fault等,多为JVM自身崩溃或JNI问题,需查hs_err_pid*.log和core dump文件。

看报错信息本身有没有 java.lang. 前缀
带 java.lang. 的(比如 java.lang.NullPointerException、java.lang.OutOfMemoryError: Java heap space)是 Java 层面的异常,说明 JVM 已启动并执行到了业务代码或标准库。这类错误优先查堆栈、线程状态、内存使用和 GC 日志。
不带这个前缀的(比如直接报 Segmentation fault、SIGSEGV (11)、Aborted (core dumped)),大概率是 JVM 自身崩溃或 JNI 层问题,必须立刻找 hs_err_pid*.log 和 core dump 文件。
- 用
find / -name "hs_err_pid*.log" -mtime -1 2>/dev/null快速定位最近的崩溃日志 - 确认是否启用了
-XX:+CreateCoredumpOnCrash,再查ulimit -c是否为unlimited - 没生成 core?检查磁盘空间和
/proc/sys/kernel/core_pattern路径是否可写
确认 JDK 版本和运行时参数是否匹配报错场景
同一段代码在 OpenJDK 8 和 OpenJDK 17 上可能抛出完全不同的错误。比如 UnsupportedClassVersionError 直接指向编译/运行版本不一致;而 PKIX path building failed 在 OpenJDK 8u292+ 后常因 CA 证书更新策略变化引发。
必须立刻执行:
-
java -version—— 看是不是你认为的那个版本(注意:有些系统java是 symlink,实际指向/usr/lib/jvm/java-11-openjdk-amd64/bin/java) -
ps -ef | grep java或jps -lvm—— 抓到真实启动命令,确认有没有漏掉-Djavax.net.ssl.trustStore=...这类关键参数 -
java -XshowSettings:properties -version 2>&1 | grep -E "(java.version|java.home|os.name)"—— 验证系统属性是否被意外覆盖
区分是构建时报错还是运行时报错
构建阶段(如 Maven 编译、Rainbond 构建)报错,重点不在 JVM 参数,而在 classpath 和依赖完整性。典型例子:package javafx.util does not exist 不是缺内存,是 OpenJDK 8 默认不带 JavaFX,而你的本地 Oracle JDK 8 有。
运行阶段报错才需要深挖 JVM 状态。但要注意:某些“运行时”错误其实是构建残留导致的,比如 Rainbond 构建时没读取 system.properties 里的 java.runtime.version,结果用了默认 OpenJDK 11 运行 Java 8 字节码。
- 查构建上下文:是否有
system.properties?内容是否含java.runtime.version=1.8? - 进容器或构建环境执行
ls $JAVA_HOME/jre/lib/ext/,看有没有jfxrt.jar(OpenJDK 8 没有,得手动加) - CI 环境(如 Jenkins)默认用系统级 OpenJDK,和本地 IDE 绑定的 JDK 往往不是同一个——别直接对比本地能跑
别跳过 JAVA_HOME 和 PATH 的交叉验证
90% 的“找不到命令”或“版本混乱”问题,根子都在这两个变量没对齐。尤其在 Rainbond 或 Docker 中,JAVA_HOME 可能被镜像写死,但 PATH 里混进了另一个 JDK 的 bin。
执行这三行,缺一不可:
-
echo $JAVA_HOME—— 确认它指向的是 JDK 根目录(不是jre/子目录,也不是带空格的Program Files) -
which java—— 输出路径必须是$JAVA_HOME/bin/java,否则就是 PATH 污染 -
readlink -f $(which java)—— 看最终解析到哪个二进制文件,排除 symlink 嵌套干扰
真正容易被忽略的是:Rainbond 构建器会自己调用 readJavaRuntimeInfo() 函数去解析 system.properties,但它不读 JAVA_HOME。也就是说,你在宿主机配得再好,对 Rainbond 构建过程也无效——得靠项目根目录下的配置文件驱动。











