我有一个Java Maven项目,其中包含大约800个源文件(有些是由javacc / JTB生成的),用Javac编译需要25分钟。
当我将pom.xml更改为使用Eclipse编译器时,编译大约需要30秒。
关于javac(1.5)为什么运行如此缓慢的任何建议?(我不想永久切换到Eclipse编译器,因为Maven的插件似乎不止是个小问题。)
我有一个容易重现问题的测试用例。以下代码在默认程序包中生成许多源文件。如果尝试使用javac编译ImplementingClass.java,它似乎会暂停很长时间。
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintStream;
public class CodeGenerator
{
private final static String PATH = System.getProperty("java.io.tmpdir");
private final static int NUM_TYPES = 1000;
public static void main(String[] args) throws FileNotFoundException
{
PrintStream interfacePs = new PrintStream(PATH + File.separator + "Interface.java");
PrintStream abstractClassPs = new PrintStream(PATH + File.separator + "AbstractClass.java");
PrintStream implementingClassPs = new PrintStream(PATH + File.separator + "ImplementingClass.java");
interfacePs.println("public interface Interface<T> {");
abstractClassPs.println("public abstract class AbstractClass<T> implements Interface<T> {");
implementingClassPs.println("public class ImplementingClass extends AbstractClass<Object> {");
for (int i=0; i<NUM_TYPES; i++)
{
String nodeName = "Node" + i;
PrintStream nodePs = new PrintStream(PATH + File.separator + nodeName + ".java");
nodePs.printf("public class %s { }\n", nodeName);
nodePs.close();
interfacePs.printf("void visit(%s node, T obj);%n", nodeName);
abstractClassPs.printf("public void visit(%s node, T obj) { System.out.println(obj.toString()); }%n", nodeName);
}
interfacePs.println("}");
abstractClassPs.println("}");
implementingClassPs.println("}");
interfacePs.close();
abstractClassPs.close();
implementingClassPs.close();
}
}
您使用JDK 1.6会得到相同的行为,包括更新14,内部版本04,使用G1不会改变其行为(尽管G1看起来确实工作得很好)。
使用jvisualvm监视javac,重复的线程转储显示了主线程花费大量时间在
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的编译器未执行该检查,或者未以相同的方式执行该检查。
问题内容: 我听说Java必须使用JIT来提高速度。与解释相比,这很合情合理,但是为什么有人不能制作可以生成快速Java代码的提前编译器呢?我知道,但是我认为它的输出通常不会比Hotspot快。 语言方面是否存在使这变得困难的事情?我认为可以归结为以下几点: 反射 类加载 我想念什么?如果我避免使用这些功能,是否可以将Java代码一次编译为本机代码并完成? 问题答案: 任何AOT编译器的真正杀手是
(这个问题与此密切相关,但它是一个更具体的问题,我希望能就此得到答案)
问题内容: 我有一些针对angularjs应用运行的简单的业力/茉莉单元测试。我使用最新版本的Chrome,并在WebStorm IDE中运行测试。 有时测试套件运行非常快(0.24秒) 有时,针对完全相同的代码的完全相同的测试套件运行非常缓慢(120秒) 我尝试了所有常识性修复。我在网上搜寻了一下,以发现我在做什么错。 为什么我的测试运行如此缓慢? 问题答案: 答案很简单。 我正在使用Chrom
1. YodaOS Universal 如何配置系统和应用 1.1. 目录 1.1.1. 一.YODAOS完整体验 1.1.2. 定制系统和应用 1.1. 目录 YODAOS 完整体验 如何定制化系统和应用 1.1.1. 一.YODAOS完整体验 下载代码 Yodaos使用git作为源代码管理工具,用Repo 命令行工具管理多个git代码仓库,下载代码时需要用户注册成为Rokid 平台开发者。 注
问题内容: 在方法或类范围内,下面的行进行编译(带有警告): 在类范围中, 变量获取其默认值 ,以下给出“未定义引用”错误: 它不是第一个应该以相同的“未定义参考”错误结束吗?还是第二行应该编译?还是我缺少什么? 问题答案: tl; dr 对于 字段 ,是非法的,因为它是对的非法前向引用。您实际上可以通过编写来解决此问题,该文件可以毫无抱怨地进行编译。 对于 局部变量 ,是非法的,因为未在使用前进
问题内容: 从2010年的计算机语言基准游戏中可以看出: Go平均比C慢10倍 Go比Java慢3倍! 考虑到Go编译器会生成要执行的本机代码,这怎么可能? Go的编译器不成熟?还是Go语言存在一些内在问题? 编辑: 大多数答案否认Go语言的内在缓慢,声称问题出在不成熟的编译器中。 因此,我进行了一些自己的测试来计算斐波那契数:迭代算法在Go(freebsd,6g)中以与C(带有O3选项)一样的速