有没有办法加速Javadoc(需要7分钟)

时间:2016-12-16 17:12:41

标签: java javadoc maven-javadoc-plugin

我正在为一个包含2,509个类的模块构建一个Javadoc。目前每秒需要7分钟或6个文件。

我试过了

mvn -T 1C install

javadoc仅使用1个CPU。有没有办法使用更多和/或加速?

我正在使用 Oracle JDK 8更新112 。我的开发机器有16个内核和128 GB内存。

运行飞行记录器我可以看到只有一个线程main

enter image description here

对于有兴趣的人,我使用了以下选项:

<plugin>
    <artifactId>maven-javadoc-plugin</artifactId>
    <configuration>
        <additionalJOptions>
            <additionalJOption>-J-XX:+UnlockCommercialFeatures</additionalJOption>
            <additionalJOption>-J-XX:+FlightRecorder</additionalJOption>
            <additionalJOption>-J-XX:StartFlightRecording=name=test,filename=/tmp/myrecording-50.jfr,dumponexit=true</additionalJOption>
            <additionalJOption>-J-XX:FlightRecorderOptions=loglevel=debug</additionalJOption>
        </additionalJOptions>
    </configuration>
</plugin>

注意:一种解决方法是:

-Dmaven.javadoc.skip=true

6 个答案:

答案 0 :(得分:6)

使用-T1C运行maven将导致maven尝试并行构建模块,因此如果您有一个多模块项目,最多它将并行构建每个模块的javadoc(如果模块之间的依赖关系图允许它)。

javadoc进程本身是单线程的,因此您将无法使用多个内核来生成单个模块的javadoc。

但是,由于你有很多类(可能还有很多@link doclet或类似的?),也许javadoc进程可以从扩展堆中受益。你有没有看过GC活动? 尝试在您的配置中添加此功能,看看是否有帮助:

<additionalJOption>-J-Xms2g</additionalJOption>
<additionalJOption>-J-Xmx2g</additionalJOption>

答案 1 :(得分:4)

@lbndev是正确的,至少使用Javadoc随附的默认Doclet(com.sun.tools.doclets.formats.html.HtmlDoclet)。浏览源代码可以确认单线程实现:

(这些链接均指向JDK 8源。使用JDK 11时,类已移动,但是forHtmlDoclet中的基本AbstractDoclet循环仍然存在。)

一些基于样本的分析证实了这些方法是瓶颈: Javadoc-profiling

这不是您希望听到的,但是在当前标准Javadoc中,至少在单个Maven模块中,这似乎没有多线程选择。

generateClassFiles()等很适合进行多线程处理,尽管这可能需要对JDK进行更改。如下所述,AbstractDoclet.isValidDoclet()甚至主动阻止HtmlDoclet的子类化。试图作为第三方重新实现其中一些循环,将需要引入许多其他代码。

对其他Doclet实现(例如javadown)进行的扫描仅在包和类的向下钻取中发现了类似的实现样式。该线程上的其他人可能会知道更多。

更广泛地考虑,可能有调整DocFileFactory的空间。显然已将其标记为内部类(在程序包中甚至不是公共类),但它确实抽象了(HTML)文件的编写。可能的替代版本可能会将HTML缓冲在内存中,或直接流到zip文件中,以提高IO性能。但是显然,这还需要了解JDK工具发生变更的风险。

答案 2 :(得分:0)

javadoc和标准doclet当前基本上是单线程的。

主要通过并行生成页面来改善此问题是“迫在眉睫”,但这意味着将MT安全性改造为各种共享数据结构。

答案 3 :(得分:0)

您可以让Maven在所有内核中每个内核使用多个线程。

例如。

mvn -T 4C install # will use 4 threads per available CPU core

您可以将上方的4更改为所需的任何数字。您有一台拥有大量资源的机器。尝试使用816

您还尝试过使用javadoc-no-fork吗?这样可以确保不会再次触发javadoc-https://maven.apache.org/plugins/maven-javadoc-plugin/examples/javadoc-nofork.html

答案 4 :(得分:0)

Maven定制是一种加快Javadoc生成速度的方法。

另一种方法是更改​​用于生成javadoc的doclet。 Maven Javadoc插件允许您更改用于生成Javadoc的doclet

https://maven.apache.org/plugins/maven-javadoc-plugin/examples/alternate-doclet.html

我确实发现了以下商业doclet(我没有任何形式的隶属关系),但声称比传统的Javadoc更快。它提供了免费/试用/商业许可证。如果您真的很想加快Javadoc的构建速度,也许值得看看它是否物有所值

http://www.filigris.com/docflex-javadoc

也许互联网上存在开源替代方案...

答案 5 :(得分:-3)

使用doxygen而不是常规的mvn,你现在正在使用它。