我已经完成了
无处解释使用此标志的好处。
这是性能优势吗?如果是的话,是否会有一个粗略的定义,将会有多少性能优势? (我知道性能问题的答案完全取决于具体情况,但如果有人报告这样做会带来很好的好处,那就太好了。)
答案 0 :(得分:11)
无头和非无头模式不同,它们具有不同的功能集。如果你只需要做一些简单的事情,比如字体渲染,那么你可以在无头模式下进行。
您可以随时查看JDK源的内容,并亲自查看哪些方法依赖于非无头模式。但在我看来,即使性能提升可以忽略不计,最好还是传递java.awt.headless(如果你不需要"完全" GUI模式)。
任何供应商都可以使用此属性。如果你有完整的GUI,你永远不知道他们是否会做某事。因此,我的经验法则是:始终对控制台应用程序和服务器使用java.awt.headless。它不会造成伤害。
答案 1 :(得分:6)
如果您不使用AWT功能,则设置java.awt.headless=true
不会带来性能优势。 AWT功能按需加载。
如linked article中所述,无头模式对于访问通常委托给图形主机的某些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"));
与 -Djava.awt.headless=true
一起运行时,将生成一个图像文件:
使用 -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连接,没有图形端点),则在正常模式下会出现异常,而程序会以无头模式运行。