设置java.awt.headless=true的好处是什么?

49

8
为什么会有负票? - user2250246
如果您的应用程序在“无头”模式下运行正常,则无论是哪种模式,它都不会有任何性能差异。某些图形操作需要“有头”模式,这时您别无选择。无头模式将防止您的应用程序执行诸如在控制台上弹出窗口之类的操作(如果有的话)。 - Christopher Schultz
可能是JAVA_OPTS中headless和-D选项的含义的重复。 - Vadzim
https://dev59.com/inE85IYBdhLWcg3w6n90 - Yousha Aleayoub
4个回答

26
如果您没有使用AWT功能,则设置java.awt.headless=true没有性能优势。 AWT功能是按需加载的。
链接文章所述,无头模式可用于访问通常委派给图形主机的某些Java图形功能:
在设置无头模式并创建无头工具包实例后,您的应用程序可以执行以下操作:
- 创建轻量级组件,例如CanvasPanel和Swing组件,但不包括顶层组件 - 获取有关可用字体、字体度量和字体设置的信息 - 为呈现文本和图形设置颜色 - 创建和获取图像并准备图像以进行呈现 - 使用java.awt.PrintJobjava.awt.print.*javax.print.*类打印 - 发出音频蜂鸣声
例如,在无头模式下,您可以创建和编写图像文件:
    BufferedImage img = new BufferedImage(200, 100, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = img.createGraphics();
    g.drawLine(80, 30, 120, 70);
    g.drawLine(80, 70, 120, 30);
    ImageIO.write(img, "png", new File("image.png"));

当使用-Djava.awt.headless=true运行时,会生成一个图像文件:

x

当使用-Djava.awt.headless=false(且没有X窗口服务器)运行时,会抛出异常:

java.awt.AWTError: Can't connect to X11 window server using ':0.0' as the value of the DISPLAY variable.

请注意,JVM包含启发式算法来确定java.awt.headless的值,如果它没有被明确设置。例如,在Linux上,如果未设置DISPLAY环境变量,则java.awt.headless自动变为true


9
无头模式和非无头模式是不同的,它们具有不同的功能集。如果您只需要执行像字体渲染这样的简单任务,则可以在无头模式下执行。
您总是可以查看JDK源代码并自行确定哪些方法依赖于非无头模式。但在我看来,即使性能增益微不足道,也最好传递java.awt.headless(如果您不需要“完整”GUI模式)。
任何供应商都可以使用此属性。您永远不知道如果您有完整的GUI,他们是否会做某些事情。因此,我的经验法则是:始终将java.awt.headless用于控制台应用程序和服务器。这不会造成伤害。

14
这个回答并没有解释设置headless属性的好处,因此原回答是没有回答的。我也在寻找答案,但目前还没有找到。 - nanosoft
1
有许多不同的Java虚拟机,每个虚拟机都可以以不同的方式解释标志。您可以检查OpenJDK源代码以找到每个引用。最常见的用法只是使用:if (GraphicsEnvironment.isHeadless()) { throw new HeadlessException(); }字体呈现和图像处理代码略有不同。此外,任何应用程序都可能依赖于此标志。例如,以前,当未使用标志并从系统脚本运行tomcat时,tomcat会崩溃。 - BaRoN

4
无头模式主要适用于那些没有图形显示的系统,通常是服务器。

许多应用程序使用图形显示来执行不一定需要被看到的任务,例如绘制图像然后将其保存到磁盘上。

如果在服务器上运行这样的程序(仅通过ssh连接,没有图形终端),则在默认模式下会出现异常,而启用无头模式时则可以运行该程序。

无头模式本质上意味着虚拟显示器,图形组件在通用/透明的显示接口上进行操作,例如,在网格上绘制一个圆,在有头模式下实际上会显示结果,而在无头模式下则会以不同的方式处理,例如,网格是一个内存对象,它被更改以便在真实显示器上表示所绘制的圆形,同一网格可用于诸如将所有内容保存为图像文件等任务。

正如评论中建议的那样,Oracle有关于此的详细信息

1
这个答案需要补充的是问题中提到的文章中的引用:_无头模式是一种系统配置,其中缺少显示设备、键盘或鼠标_。 - Ilya Serbis

3

一种可能的好处是,如果您在尝试在窗口中做其他事情时调用应用程序,可能会多次调用应用程序,如果应用程序在无头模式下运行,则不会破坏您的键盘/鼠标焦点。

至少在Mac上,我在尝试在另一个窗口中编辑时每隔几秒钟重复运行Java应用程序的脚本时遇到了巨大问题。无头模式解决了这个问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接