Why is javac 1.5 running so slowly compared with the Eclipse compiler?

后端 未结 8 2007
别跟我提以往
别跟我提以往 2021-02-04 16:27

I have a Java Maven project with about 800 source files (some generated by javacc/JTB) which is taking a good 25 minutes to compile with javac.

When I changed my pom.xml

8条回答
  •  鱼传尺愫
    2021-02-04 16:52

    You get the same behaviour with JDK 1.6, including update 14, build 04, using G1 doesn't change the behaviour, (though G1 appears to work really well).

    Monitoring javac with jvisualvm, repeated thread dumps show the main thread spending lots of time in

    at com.sun.tools.javac.code.Types.isSubSignature(Types.java:1846)
    at com.sun.tools.javac.code.Symbol$MethodSymbol.overrides(Symbol.java:1108)
    at com.sun.tools.javac.code.Symbol$MethodSymbol.implementation(Symbol.java:1159)
    at com.sun.tools.javac.comp.Check.checkCompatibleConcretes(Check.java:1239)
    at com.sun.tools.javac.comp.Check.checkCompatibleSupertypes(Check.java:1567)
    at com.sun.tools.javac.comp.Attr.attribClassBody(Attr.java:2674)
    at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:2628)
    at com.sun.tools.javac.comp.Attr.attribClass(Attr.java:2564)
    at com.sun.tools.javac.main.JavaCompiler.attribute(JavaCompiler.java:1036)
    at com.sun.tools.javac.main.JavaCompiler.compile2(JavaCompiler.java:765)
    at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:730)
    at com.sun.tools.javac.main.Main.compile(Main.java:353)
    at com.sun.tools.javac.main.Main.compile(Main.java:279)
    at com.sun.tools.javac.main.Main.compile(Main.java:270)
    at com.sun.tools.javac.Main.compile(Main.java:69)
    at com.sun.tools.javac.Main.main(Main.java:54)
    

    and churning through a large number of short lived instances of these classes:

    com.sun.tools.javac.code.Types$Subst
    com.sun.tools.javac.util.List
    com.sun.tools.javac.code.Types$MethodType
    

    I suspect the code is churning through com.sun.tools.javac.comp.Check.checkCompatibleConcretes comparing each method with every other method

    That method's javadoc:

    /** Check that a class does not inherit two concrete methods
     *  with the same signature.
     */
    

    It may be that eclipse's compiler either doesn't perform that check, or doesn't perform it in the same way.

提交回复
热议问题