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

azpvetkf  于 2022-11-07  发布在  Java
关注(0)|答案(4)|浏览(927)

我经历了

  1. Setting java.awt.headless=true programmatically
  2. http://www.oracle.com/technetwork/articles/javase/headless-136834.html
    1.还有其他一些链接。
    没有任何地方解释使用此标志的好处。
    这是性能优势吗?如果是,是否有一个粗略的量化,即性能优势有多大?(我知道性能问题的答案完全取决于具体情况,但如果有人报告说这样做有很好的优势,那就太好了)。
ulydmbyx

ulydmbyx1#

如果不使用AWT功能,则设置java.awt.headless=true对性能没有任何好处。AWT功能是按需加载的。
linked article中所述,无头模式对于访问某些通常委托给图形主机的Java图形功能非常有用:
在设置了headless模式并创建了headless toolkit的示例之后,您的应用程序可以执行以下操作:

  • 创建轻量级组件,如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**运行时,将产生一个映像文件:

当使用**-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

pkmbmrz7

pkmbmrz72#

无头模式和非无头模式是不同的,它们有不同的功能。如果你只需要做一些简单的事情,如字体渲染,那么是的,你将能够在无头模式下做。
您可以随时检查JDK源代码的内部,并亲自查看哪些方法依赖于非headless模式。但在我看来,即使性能增益可以忽略不计,最好还是传递java.awt.headless(如果您不需要“完整”GUI模式)。
任何供应商都可以使用此属性。如果您有完整的GUI,您永远不知道他们是否会执行某些操作。因此,我的经验法则是:对于控制台应用程序和服务器,我总是使用java.awt.headless。这不会有什么坏处。

8yoxcaq7

8yoxcaq73#

一个可能的好处是,如果您在调用应用程序的同时尝试在窗口中执行其他操作(可能多次调用应用程序),则在应用程序以无头模式运行时,不会中断键盘/鼠标焦点。
至少在Mac上,我在运行脚本时遇到了巨大的问题,脚本每隔几秒钟就重复运行一个java应用程序,同时试图在另一个窗口中编辑。

2ledvvac

2ledvvac4#

Headless模式主要适用于没有图形显示的系统,通常是服务器。
许多应用程序使用图形显示来做不一定需要看到的事情,例如绘制图像,然后将其保存到磁盘。
如果你在服务器上运行这样的程序(只使用ssh连接,没有图形端点),在缺省模式下你会得到一个异常,而当你启用headless模式时你会让程序运行。
无头模式本质上意味着虚拟显示,图形组件在通用/透明显示界面上进行其操作,例如,它们在网格上绘制圆,然后当在有头模式中时,结果被实际显示,或者在无头模式中被不同地对待,例如,网格是存储器对象,其被改变以使得其将在真实的显示器上表示绘制的圆,相同的网格可用于诸如将所有内容保存为图像文件之类的任务。
正如其中一条评论所建议的那样,Oracle有很多关于它的details

相关问题