【问题标题】:Optimizing Java compiler during a Maven build?在 Maven 构建期间优化 Java 编译器?
【发布时间】:2011-05-12 05:58:05
【问题描述】:

我有一个 Java 项目的 Maven 配置文件,该配置文件在 Hudson CI 服务器上进行最终构建时被激活。

目前此配置文件的唯一自定义是 Maven 编译器插件,如下所示:

                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <debug>false</debug>
                        <optimize>true</optimize>
                    </configuration>
                </plugin>

最终构建应该对 Java 编译器进行任何其他调整或优化以最大限度地提高性能吗?

【问题讨论】:

    标签: java performance maven-2 compiler-construction build


    【解决方案1】:

    假设您在 Sun(Hotspot)JVM 上运行,所有优化都发生在 JVM 中。

    所以指定&lt;optimize&gt;true&lt;/optimize&gt; 什么都不做。

    指定&lt;debug&gt;false&lt;/debug&gt; 只会删除调试符号。这会稍微减少您的 JARfile 大小,但会使跟踪生产问题变得更加困难,因为您的堆栈跟踪中不会有行号。


    指定的一件事是 JVM 兼容性设置:

    <source>1.6</source>
    <target>1.6</target>
    

    【讨论】:

    • 您是说将调试符号保留在其中不会影响性能吗?将在 v1.6 设置上进行。
    • @HDave - 调试信息存储在 .class 文件的 LineNumberTable 和 LocalVariableTable 中(请参阅java.sun.com/docs/books/jvms/second_edition/html/…)。虽然这可能会消耗额外的内存,但它与字节码是分开的,因此不会直接影响执行性能。
    • 嗯,我仍然在堆栈跟踪中看到带有&lt;debug&gt;false&lt;/debug&gt;...的行号...
    【解决方案2】:

    您甚至不应该这样做 - IIRC,javac 中的优化已被禁用了一段时间。基本上 JIT 负责几乎所有的优化,而 javac 优化实际上在某些情况下伤害

    如果您希望调整性能,您应该寻找其他地方:

    • 您的实际代码
    • VM 选项(例如 GC 调整)

    【讨论】:

    • 除非性能有问题,否则我不建议进行优化,尤其是因为 JIT 确实非常好。
    • @extraneon:你错过了我的意思-优化主动伤害性能,所以基本上它被删除了。
    • 我实际上是指代码优化和 GC 优化。代码优化可能会导致代码可读性降低,而 GC 选项可能会让不知情的人感到惊讶。
    • @extraneon:对,是的。我认为值得尽早进行架构优化,而不是低级别的微优化。
    【解决方案3】:

    对于我们基于 maven 的构建,我不使用&lt;debug&gt;false&lt;/debug&gt;,而是使用&lt;debuglevel/&gt; 设置调试选项,这允许更精细的控制{参见 javac 选项-g}。

    【讨论】:

    猜你喜欢
    • 2018-09-20
    • 2011-08-24
    • 1970-01-01
    • 2019-01-19
    • 2016-01-14
    • 2015-09-11
    • 2012-04-11
    • 2021-02-07
    相关资源
    最近更新 更多