我正在为一个包含2,509个类的模块构建一个Javadoc。这当前需要7分钟或每秒6个文件。
我试过了
mvn -T 1C install
然而,javadoc
仅使用1cpu。有没有方法可以使用更多和/或加快速度?
我使用的是Oracle JDK8更新112。我的dev机器有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>
注意:一种解决方法是:
-Dmaven.javadoc.skip=true
发布于 2017-02-02 17:14:07
使用-T1C运行maven将导致maven尝试并行构建模块,因此如果您有一个多模块项目,它最多只能并行构建每个模块的javadoc (如果模块之间的依赖关系图允许的话)。
javadoc进程本身是单线程的,因此您不能使用多个内核来生成单个模块的javadoc。
然而,由于您有许多类(可能还有许多@link doclet或类似的?),也许javadoc进程可以从扩展堆中受益。你调查过GC活动吗?尝试将此代码添加到您的配置中,看看是否有帮助:
<additionalJOption>-J-Xms2g</additionalJOption>
<additionalJOption>-J-Xmx2g</additionalJOption>
发布于 2018-10-06 23:59:08
@lbndev是正确的,至少对于Javadoc提供的默认Doclet (com.sun.tools.doclets.formats.html.HtmlDoclet
)是正确的。通过查看源代码,可以确认单线程实现:
开始点在父类AbstractDoclet.startGeneration()
new ClassTree()
调用ClassTree.buildTree(),后者使用for
循环迭代类列表,生成类的模型
for
循环,然后向下钻取到C15,它再次在<代码>D17循环中迭代<代码>D16。<代码>H218F219(这些链接指向JDK 8源代码。在JDK11中,类发生了变化,但HtmlDoclet
和AbstractDoclet
中的基本for
循环仍然存在。)
一些基于样本的分析证实了这些方法是瓶颈:
这不是您希望听到的,但在当前的多线程标准Javadoc中看起来没有这个选项,至少在单个Maven模块中是这样的。
generateClassFiles()
等将很好地适应一些多线程,尽管这可能需要在JDK中进行更改。正如下面提到的,AbstractDoclet.isValidDoclet()甚至积极地阻止HtmlDoclet
的子类化。尝试将其中一些循环重新实现为第三方将需要引入大量其他代码。
扫描一下其他Doclet实现(例如javadown),只发现包和类钻取有类似的实现风格。这个帖子上的其他人可能会知道更多。
从更广泛的角度来看,围绕DocFileFactory可能还有调优的空间。它被明确地标记为一个内部类(甚至不是包中的公共类),但它确实抽象了(HTML)文件的编写。似乎可以使用替代版本将HTML缓冲到内存中,或者直接流到zip文件中,以提高IO性能。但很明显,这也需要了解JDK工具中更改的风险。
发布于 2018-10-09 02:47:01
javadoc和标准doclet目前基本上都是单线程的。
这是“雷达”来改善这一点,主要是通过并行生成页面,但这意味着将MT-safeness改进为各种共享数据结构。
https://stackoverflow.com/questions/41189284
复制相似问题