Swing应用程序的Graal本机映像:在映像堆中检测到启动的线程

时间:2019-06-24 18:00:51

标签: java swing graalvm

JPanel

当我尝试使用NODE_OPTIONS="--max-old-space-size=128" 创建本机映像时,我得到了:

  

错误:在图像堆中检测到启动的线程。正在运行的线程   图像生成器不再在图像运行时运行。的   对象可能是由类初始化程序创建的,并且可以访问   从静态字段。默认情况下,所有类初始化都已完成   在本机图像构建期间。您可以手动延迟课程   使用选项初始化到图像运行时   -H:ClassInitialization =。或者,您可以编写自己的初始化方法,然后从主条目中显式调用它们   点。

     

详细消息:跟踪:对象sun.java2d.opengl.OGLRenderQueue     字段sun.java2d.opengl.OGLRenderQueue.theInstance

1 个答案:

答案 0 :(得分:1)

这都与何时初始化一个类有关– GraalVM团队对此主题进行了更新: https://medium.com/graalvm/updates-on-class-initialization-in-graalvm-native-image-generation-c61faca461f7

短版:使用跟踪(比您的Graal包更新的版本中添加了)来查找所谓的有问题的类,然后将其设置为在运行时初始化。容易说,很难做。 就其价值而言,我在19.2(企业版)版本和一些包含AWT的随机代码中遇到了相同的问题。消息已更改(为清晰起见,对其进行了略作编辑):

  

错误:在图像堆中检测到启动的线程。线程正在运行   图像生成器中的不再在图像运行时运行。至   了解如何使用-H:+TraceClassInitialization实例化该对象。   该对象可能是由类初始化程序创建的,并且是   从静态字段可到达。您可以请求类初始化   通过使用选项在图像运行时   --initialize-at-build-time=<class-name>。或者,您可以编写自己的初始化方法,然后从主条目中显式调用它们   点。        Trace: object sun.awt.AWTAutoShutdown method sun.awt.AWTAutoShutdown.getInstance()

我将通过(可能从与AWT等效的“ Hello World”开始,如果成功的话)来更新我的答案,并提供具体细节。Google到处都是无法使用Swing / AWT / JavaFX的本地图像的示例,所以我不确定我是否会成功。

免责声明:我为Oracle工作,但不在与Graal开发人员紧密联系的组织(可能没有共同的经理)工作。我说的是我的意见。