首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >有没有加速Javadoc的方法(需要7分钟)

有没有加速Javadoc的方法(需要7分钟)
EN

Stack Overflow用户
提问于 2016-12-17 01:12:41
回答 6查看 1.8K关注 0票数 44

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

我试过了

代码语言:javascript
复制
mvn -T 1C install

然而,javadoc仅使用1cpu。有没有方法可以使用更多和/或加快速度?

我使用的是Oracle JDK8更新112。我的dev机器有16核和128 GB内存。

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

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

代码语言:javascript
复制
<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>

注意:一种解决方法是:

代码语言:javascript
复制
-Dmaven.javadoc.skip=true
EN

回答 6

Stack Overflow用户

发布于 2017-02-02 17:14:07

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

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

然而,由于您有许多类(可能还有许多@link doclet或类似的?),也许javadoc进程可以从扩展堆中受益。你调查过GC活动吗?尝试将此代码添加到您的配置中,看看是否有帮助:

代码语言:javascript
复制
<additionalJOption>-J-Xms2g</additionalJOption>
<additionalJOption>-J-Xmx2g</additionalJOption>
票数 6
EN

Stack Overflow用户

发布于 2018-10-06 23:59:08

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

开始点在父类AbstractDoclet.startGeneration()

  • This中,它依次调用new ClassTree()调用ClassTree.buildTree(),后者使用for循环迭代类列表,生成类的模型

  • 上再次执行for循环,然后向下钻取到C15,它再次在<代码>D17循环中迭代<代码>D16。<代码>H218F219

(这些链接指向JDK 8源代码。在JDK11中,类发生了变化,但HtmlDocletAbstractDoclet中的基本for循环仍然存在。)

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

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

generateClassFiles()等将很好地适应一些多线程,尽管这可能需要在JDK中进行更改。正如下面提到的,AbstractDoclet.isValidDoclet()甚至积极地阻止HtmlDoclet的子类化。尝试将其中一些循环重新实现为第三方将需要引入大量其他代码。

扫描一下其他Doclet实现(例如javadown),只发现包和类钻取有类似的实现风格。这个帖子上的其他人可能会知道更多。

从更广泛的角度来看,围绕DocFileFactory可能还有调优的空间。它被明确地标记为一个内部类(甚至不是包中的公共类),但它确实抽象了(HTML)文件的编写。似乎可以使用替代版本将HTML缓冲到内存中,或者直接流到zip文件中,以提高IO性能。但很明显,这也需要了解JDK工具中更改的风险。

票数 5
EN

Stack Overflow用户

发布于 2018-10-09 02:47:01

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

这是“雷达”来改善这一点,主要是通过并行生成页面,但这意味着将MT-safeness改进为各种共享数据结构。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41189284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档