Java编译速度

标签 java maven compilation javac xjc

我有一个包含约 2400 个类的 Java 项目。它们主要是使用 XJC 从带有一些扩展的 XML 模式生成的。

编译需要很长时间,大约 20 分钟,我想知道我是否可以做些什么来改进它?

一个类似的项目有大约一半数量的生成类,而是几个手写类,总共约 3000 个类。这会在 2-5 分钟内完成编译。

我正在使用 Java 8(Windows 上为 1.8.0_92)进行编译,但使用的是源版本和目标版本 6(因此问题不在于 Java 8 上的慢速类型系统)。使用 Maven-compiler-plugin 3.5.1 使用 Maven 3.3.3 完成编译。我正在从 Maven 中 fork 编译器并使用 maxmem 2048m。

生成的类通常很小,但我有一个庞大的访问者接触了所有生成的类(因此存在一对一依赖关系和所有对一依赖关系)。我对此无能为力。

从“mvn clean install”切换到“mvn install”(或只是“mvn compile”)会有所帮助,但这并不总是一个选项(基本上,Eclipse 会处理已编译的文件,因此要确保测试运行正常,我需要像提交之前一样在从命令运行测试时进行清理。

我没有任何后台进程监视编译单元文件(如 Eclipse/SourceTree),但我有一个病毒扫描程序(我无法关闭)。看来大部分时间都花在javac上了。

javac 中是否有某些东西在相互依赖的类的数量上是超线性的?或者有什么方法可以绕过这些编译时间吗?

E:我得到了运行 Maven 多线程的建议;不幸的是,我已经尝试过了,但它在这里并没有真正的帮助,因为它是一个包含许多相互依赖的类的单模块项目。

E2:我将项目拆分为一个仅包含 JAXB 代码的模块和另一个包含主要代码的模块。事实证明,JAXB 代码不是罪魁祸首。我运行了 Tesla Maven Profiler它只是确认了编译是问题所在;相关部分:

org.apache.maven.plugins:maven-compiler-plugin:3.5.1 (default-compile) 18m 48s
org.apache.maven.plugins:maven-compiler-plugin:3.5.1 (default-testCompile) 14s 770ms
org.apache.maven.plugins:maven-surefire-plugin:2.12.4 (default-test) 1m 51s
org.apache.maven.plugins:maven-war-plugin:2.0.1 (default-war) 14s 635ms

我对最后三个的持续时间非常满意。

这只是 1000 个 Java 类,全部继承自使用 JAXB 生成的普通访问者。我的编译配置:

              <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.5.1</version>
                    <configuration>         
                          <fork>true</compiler>
                          <source>${compileSource}</source>
                          <target>${compileSource}</target>
                          <meminitial>512m</meminitial>
                          <maxmem>2048m</mexmem>
                          <encoding>UTF-8<eencoding>
                    </configuration>
              </plugin>

(编译源是1.6)

最佳答案

事实证明,问题确实出在 javac 中。 Javac 无法很好地处理具有大量重载方法的类 (http://mail.openjdk.java.net/pipermail/compiler-dev/2013-May/006339.html)。

我正在生成一个访问者,它为每个类(1100+)生成一个 visit(...) 方法,导致每个派生的编译需要几秒钟。由于我有数百种这样的方法,所有这些都加起来了。

我的访问者是使用 jaxb-visitor ( https://github.com/massfords/jaxb-visitor ) 生成的,并通过使用我自己的代码分支 ( https://github.com/klafbang/jaxb-visitor ) 在生成的方法中包含类型名称来解决问题。

编译时间从 40 分钟缩短到 2 分钟。

关于Java编译速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38482241/

相关文章:

java - 如果...则加载 .sav 文件后比较器失败

java - 替换文本匹配正则表达式的子字符串

java - 如何从maven pom访问linux环境变量?

c++ - 安装了 Ftdilib 但 ftdi_enable_bitbang "was not declared in this scope"

java - 无法在 CentOS 7 上启动 kafka 代理

java - 处理 P5 - millis() 的计时器问题

maven - Artifact 范围不可传递是什么意思?

Maven 从错误的位置读取用户配置

c# - 如何使用 C# 6.0 为 .NET 2.0 编译?

linux - 无效使用未定义类型 ‘struct nf_hook_ops’ - 内核模块编译错误