【问题标题】:Segfault when running JavaFX and Swing from IntelliJ从 IntelliJ 运行 JavaFX 和 Swing 时出现段错误
【发布时间】:2025-11-27 16:55:02
【问题描述】:

从 IntelliJ 2016.1 社区版运行以下缩小示例时,我总是遇到分段错误:

import javax.swing.*;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class Repro extends Application {

    public static void main(String[] args) {
        JFrame swingFrame = new JFrame();
        swingFrame.setTitle("Repro start");
        swingFrame.setSize(200, 350);
        swingFrame.setVisible(true);

        Application.launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        Pane root = new Pane();
        root.setMinHeight(200);
        root.setMinWidth(350);
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.show();
    }
}

环境如下:

  • Ubuntu 15.10
  • openjdk-8 (1.8.0_u66 build 17)
  • openjfx-8 (8u60-b27-4)
  • IntelliJ 2016.1 社区版(内部版本 #IC-145.258)

javac 运行到java 中无法重现该问题
通过oraclejdk(1.8.0_u77-b03)运行时也没有显示该问题

作为参考,程序的“输出”如下:

Prism-ES2 Error : GL_VERSION (major.minor) = 1.4
Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" Exception in thread "JavaFX Application Thread" #
# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (safepoint.cpp:712), pid=16937, tid=140197878814464
#  fatal error: Illegal threadstate encountered: 6
#
# JRE version: OpenJDK Runtime Environment (8.0_66-b17) (build 1.8.0_66-internal-b17)
# Java VM: OpenJDK 64-Bit Server VM (25.66-b17 mixed mode linux-amd64 compressed oops)
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /home/vogel612/.../hs_err_pid16937.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#

Process finished with exit code 134

运行ulimit -c unlimited并重启IntelliJ后问题依旧

根据要求,可在this gist. 获得此类执行的错误日志

如何解决此问题?

【问题讨论】:

  • 以下没有多大意义。 I was able to get someone to run it (Oracle JDK) for me under Windows。您遇到了OpenJDK under Ubuntu 的问题。要确认错误,您要求某人运行Oracle JDK under Windows。它证实了什么? It does not happen under Windows 还是 it does not happen with Oracle JDK?在Ubuntu 下先尝试Oracle JDK
  • 虽然这显然不能证明 JVM 崩溃是合理的,但 Swing 代码不应该在 AWT 事件分派线程之外运行。我有兴趣了解当 Swing 代码被放置在 EventQueue.invokeLater 或 EventQueue.invokeAndWait 调用中时是否会发生崩溃,就像它应该的那样。
  • @SubOptimal 花了一些时间,但是当我将执行 jdk 设置为 oracle 1.8.0_u77(当前可从 webupd8team 的 ppa 获得)时,我无法重现
  • @VGR 将swingFrame.setVisible 的呼叫转移到SwingUtilites.invokeLater 后问题仍然存在
  • 如果 Oracle JDK 没有出现这种情况,则可能是 OpenJDK 中的错误。您能否发布来自hs_err_pid16937.log 的信息,此时它在JVM 中崩溃。

标签: java swing intellij-idea javafx openjdk


【解决方案1】:

错误可以在 IntelliJ 之外重现,如下所示。

public class Main {
    public static void main(String[] args) throws Exception {
        new Repro().main(new String[0]);
    }
}

在 Ubuntu 15.10 上运行 java -cp . Main

openjdk 版本“1.8.0_66-internal”
OpenJDK 运行时环境(内部版本 1.8.0_66-internal-b17)
OpenJDK 64 位服务器 VM(内部版本 25.66-b17,混合模式)

产生相同的致命错误。而运行java -cp . Repo 不会失败。

在 CentOS 7 上运行 java -cp . Main

openjdk 版本“1.8.0_77”
OpenJDK 运行时环境(内部版本 1.8.0_77-b03)
OpenJDK 64 位服务器 VM(内部版本 25.77-b03,混合模式)

打开 Swing JFrame 和 JavaFX 窗格。

似乎这个问题与特定的 OpenJDK 版本以及类 Repo 的调用方式有关。

edit 如果您无法切换到另一个 Java 版本,则可能存在“解决方法”。 (基于此post

如下修改你的Repro.java,它不会在OpenJDK Runtime Environment (build 1.8.0_66-internal-b17)上失败

public static void main(String[] args) throws Exception {
    new JFXPanel(); // the "workaround" to initialize the toolkit
    JFrame swingFrame = new JFrame();
    ...

【讨论】:

  • 哇..我从没想过:/不幸的是,“违规”代码在单元测试中。因此,我不可能更改代码的调用方式或需要初始化工具包(如在您的解决方法中)......现在我必须切换 jdk 然后......唉。
  • @Vogel612 在这种情况下更新 JDK 是更好的解决方案。除非有其他约束来保持它。
  • 我遇到了同样的错误,这适用于 ubuntu19 - oracle jdk build 1.8.0_251-b08。有人能解释一下它是如何工作的吗
最近更新 更多