Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/401.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
设置java.awt.headless=true有什么好处?_Java_Performance_Jvm_Jvm Arguments - Fatal编程技术网

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

设置java.awt.headless=true有什么好处?,java,performance,jvm,jvm-arguments,Java,Performance,Jvm,Jvm Arguments,我经历过 及 还有一些其他的链接 没有任何地方解释使用此标志的好处 这是一种性能优势吗?如果是的话,是否有一个粗略的量化,会有多少性能优势?(我知道性能问题的答案完全取决于具体情况,但最好知道是否有人报告了这样做的好处)。无头和无头模式不同,它们有不同的功能集。如果您只需要做一些简单的事情,比如字体渲染,那么是的,您将能够在无头模式下完成 您可以随时检查JDK源代码的细节,并亲自查看哪些方法依赖于非headless模式。但在我看来,即使性能增益可以忽略不计,最好还是通过java.awt.he

我经历过

  • 还有一些其他的链接
  • 没有任何地方解释使用此标志的好处


    这是一种性能优势吗?如果是的话,是否有一个粗略的量化,会有多少性能优势?(我知道性能问题的答案完全取决于具体情况,但最好知道是否有人报告了这样做的好处)。

    无头和无头模式不同,它们有不同的功能集。如果您只需要做一些简单的事情,比如字体渲染,那么是的,您将能够在无头模式下完成

    您可以随时检查JDK源代码的细节,并亲自查看哪些方法依赖于非headless模式。但在我看来,即使性能增益可以忽略不计,最好还是通过
    java.awt.headless
    (如果不需要“完整”GUI模式)


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

    一个可能的好处是,如果您在窗口中尝试执行其他操作时调用应用程序,可能会多次调用应用程序,那么如果应用程序在无头模式下运行,则不会中断键盘/鼠标焦点


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

    如果不使用awt功能,设置
    java.awt.Headless=true对性能没有好处。AWT功能是按需加载的

    如中所述,无头模式对于访问通常委托给图形主机的某些Java图形功能非常有用:

    设置headless模式并创建headless toolkit实例后,应用程序可以执行以下操作:

    • 创建轻量级组件,如
      画布
      面板
      和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 window服务器),将引发异常:

    java.awt.awt错误:无法使用“:0.0”作为显示变量的值连接到X11窗口服务器。


    请注意,JVM包含试探法,用于确定
    java.awt.headless
    的值(如果未显式设置)。例如,在Linux上,如果未设置
    DISPLAY
    环境变量,
    java.awt.headless
    自动变为
    true

    headless模式主要用于没有图形显示的系统,通常是服务器

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


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

    为什么会出现负票?如果您的应用程序将在“无头”模式下正常运行,则无论采用何种模式,都不会出现任何性能差异。有些图形操作需要“headed”模式,因此您别无选择。Headless模式将阻止您的应用程序执行诸如在控制台上弹出窗口(如果有)之类的操作。此答案的可能重复并不能说明设置Headless属性的好处-因此原始答案无法回答。我也在寻找答案,但还没有找到答案。有许多不同的Java虚拟机,每个虚拟机都可以用不同的方式解释标志。您可以检查OpenJDK源代码以查找每个引用。最常用的用法是使用:
    if(GraphicsEnvironment.ishadless()){throw new HeadlessException();}
    字体渲染和图像处理代码略有不同。此外,任何应用程序都可以依赖此标志。例如,以前,tomcat在未使用标志并且tomcat是从系统脚本运行时发生崩溃。