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

时间:2016-12-09 19:04:00

标签: java performance jvm jvm-arguments

我已经完成了

  1. Setting java.awt.headless=true programmatically
  2. http://www.oracle.com/technetwork/articles/javase/headless-136834.html
  3. 其他一些链接。
  4. 无处解释使用此标志的好处。

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

4 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:6)

如果您不使用AWT功能,则设置java.awt.headless=true不会带来性能优势。 AWT功能按需加载。

linked article中所述,无头模式对于访问通常委托给图形主机的某些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

答案 2 :(得分:1)

一个可能的好处是,如果您在尝试在一个窗口中进行其他操作(也许多次调用该应用程序)的同时调用该应用程序,则如果该应用程序以无头模式运行,则不会破坏键盘/鼠标的焦点。

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

答案 3 :(得分:0)

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

许多应用程序使用图形显示来执行不必要的操作,例如绘制图像然后将其保存到磁盘。

如果在服务器上运行这样的程序(仅ssh连接,没有图形端点),则在正常模式下会出现异常,而程序会以无头模式运行。