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

2022-09-01 01:11:05

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

我试过

mvn -T 1C install

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

我使用的是 Oracle JDK 8 update 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

答案 1

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

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

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

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

答案 2

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

(这些链接指向 JDK 8 源代码。在 JDK 11 中,类已经移动,但基本循环仍然存在。forHtmlDocletAbstractDoclet

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

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

generateClassFiles()等等会很好地适应一些多线程,尽管这可能需要在JDK中进行更改。如下所述 AbstractDoclet.isValidDoclet() 甚至主动阻止 的子类化。尝试以第三方身份重新实现其中一些循环将需要提取大量其他代码。HtmlDoclet

对其他 Doclet 实现(例如 javadown)的扫描只发现了围绕包和类深入分析的类似实现风格。此线程上的其他人可能会知道更多。

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


推荐