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

Pet*_*rey 44 java javadoc maven-javadoc-plugin

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

我试过了

mvn -T 1C install
Run Code Online (Sandbox Code Playgroud)

但是javadoc只使用1个CPU.有没有办法使用更多和/或加快?

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

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

在此输入图像描述

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

<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>
Run Code Online (Sandbox Code Playgroud)

注意:一种解决方法是:

-Dmaven.javadoc.skip=true
Run Code Online (Sandbox Code Playgroud)

lbn*_*dev 6

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

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

但是,既然你有很多类(可能还有很多@link doclet或者类似的?),那么javadoc进程可能会从扩展堆中受益.你有没有看过GC活动?尝试在您的配置中添加它,看看它是否有帮助:

<additionalJOption>-J-Xms2g</additionalJOption>
<additionalJOption>-J-Xmx2g</additionalJOption>
Run Code Online (Sandbox Code Playgroud)


df7*_*899 5

@lbndev 是对的,至少com.sun.tools.doclets.formats.html.HtmlDoclet对于 Javadoc 提供的默认 Doclet ( )。查看源代码确认了单线程实现:

(这些链接是JDK 8源。随着JDK 11类已经转移,但基本for的循环HtmlDocletAbstractDoclet仍然存在。)

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

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

generateClassFiles()等会很适合一些多线程,尽管这可能需要在 JDK 中进行更改。正如下面提到的AbstractDoclet.isValidDoclet()甚至主动阻止HtmlDoclet. 尝试以第三方身份重新实现其中一些循环需要引入许多其他代码。

对其他 Doclet 实现(例如javadown)的扫描仅发现围绕包和类钻取的类似实现风格。这个线程上的其他人可能会知道更多。

更广泛地思考,可能有调整DocFileFactory 的空间。它清楚地标记为内部类(甚至在包中不是公共类),但它确实抽象了(HTML)文件的编写。似乎有一个替代版本可以在内存中缓冲 HTML,或直接流式传输到 zip 文件,以提高 IO 性能。但显然这也需要了解 JDK 工具更改的风险。


gyu*_*rix -3

使用 doxygen 而不是您现在使用的常规 mvn。