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

use*_*246 18 java performance jvm jvm-arguments

我经历过

  1. 以编程方式设置java.awt.headless = true
  2. http://www.oracle.com/technetwork/articles/javase/headless-136834.html 和
  3. 还有其他一些链接.

无处解释使用此标志的好处.

这是性能优势吗?如果是的话,是否会有一个粗略的定义,将会有多少性能优势?(我知道性能问题的答案完全取决于具体情况,但是如果有人报告这样做会带来好处,那就太好了).

rus*_*tyx 13

java.awt.headless=true如果您不使用 AWT 功能,则设置没有性能优势。AWT 功能是按需加载的。

如链接文章中所述,无头模式对于访问一些通常委托给图形主机的 Java 图形功能很有用:

设置无头模式并创建无头工具包的实例后,您的应用程序可以执行以下操作:

  • 创建轻量级组件,例如Canvas,Panel和Swing组件,除了最高层
  • 获取有关可用字体、字体规格和字体设置的信息
  • 设置渲染文本和图形的颜色
  • 创建和获取图像并准备用于渲染的图像
  • 打印使用java.awt.PrintJob,java.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"));
Run Code Online (Sandbox Code Playgroud)

使用 运行时-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.


小智 11

无头和非无头模式是不同的,它们具有不同的功能集.如果你只需要做一些简单的事情,比如字体渲染,那么你可以在无头模式下进行.

您可以随时查看JDK源的内容,并亲自查看哪些方法依赖于非无头模式.但在我看来,即使性能提升可以忽略不计,最好还是传递java.awt.headless(如果你不需要"完整"的GUI模式).

任何供应商都可以使用此属性.如果你有完整的GUI,你永远不知道他们是否会做某事.因此,我的经验法则是:始终对控制台应用程序和服务器使用java.awt.headless.它不会伤害.

  • 这个答案绝不会告诉您设置无头财产的好处-因此,最初的答案是“无应答”。我也在寻找答案,但还没有得到答案。 (4认同)