Вы получаете то же поведение с JDK 1.6, включая обновление 14, сборка 04, использование G1 не меняет поведение (хотя G1, кажется, работает очень хорошо).
Мониторинг javac с помощью jvisualvm, повторные дампы потоков показывают, что основной поток тратит много времени на
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)
и в большом количестве недолговечных экземпляров этих классов:
com.sun.tools.javac.code.Types$Subst
com.sun.tools.javac.util.List
com.sun.tools.javac.code.Types$MethodType
Я подозреваю, что код обрабатывает com.sun.tools.javac.comp.Check.checkCompatibleConcretes
, сравнивая каждый метод с любым другим методом
Javadoc этого метода:
/** Check that a class does not inherit two concrete methods
* with the same signature.
*/
Возможно, компилятор eclipse либо не выполняет эту проверку, либо не выполняет ее аналогичным образом.