2

我有大约 55 个 Java 接口和 5 个抽象类。每个声明都使用相同的泛型参数集:它列出了大约 60 个声明,因此每个实现都知道彼此实现的特定类型,并在方法参数中替换此类型并根据需要返回。似乎这种(可能过度)使用泛型导致编译器挂起。编译器抛出 OutOfMemoryError,但似乎没有终止。

考虑到我的情况,包含这些声明中的一个的代码清单有点困难,但清单的一部分可能是可能的。接口声明通常指定大约五个方法的集合,但是在声明中使用泛型会将源模块的大小增加到大约一千行。

我的情况可能是编译器实际上进入无限循环的情况,还是应该给它更多内存?抛出 OutOfMemoryError 异常大约需要 20 分钟,所以我担心如果我只是将分配给编译器的内存增加一个因子,编译器会花费更长的时间来抛出异常。

我正在使用 NetBeans 作为我的编辑器环境,但在我启动 NetBeans 后,我一直在求助于运行 clean/build 脚本。我这样做是因为 NetBeans 在启动后开始检查我的代码语法时很快变得无响应。我正在使用 Ubuntu 10.4(我想 - 我是从 Windows 写的)。我求助于在 Ubuntu 环境中打开命令行,将 NetBeans 作为后台进程运行,检查输出并使用 gedit 更正任何源代码错误,杀死并重新启动 NetBeans。这似乎就足够了,直到我发现不再产生语法错误。我不知道如何从命令行运行 clean/build 脚本。

对不起,如果这个问题看起来含糊不清,但如果其他人可以帮助我,那么也许我可以更具体一点。

感谢您提供任何深思熟虑的建议。

4

1 回答 1

3

在我看来,您对泛型的使用过于复杂,这导致 Java 编译器使用过多的内存来尝试表示泛型类型的扩展。失败之前的很长一段时间可能是由于“垃圾收集死亡螺旋”......其中GC花费越来越多的时间,每次回收的内存越来越少,直到它最终不得不放弃。

如果您无法向我们展示代码,唯一可能的建议是使用更大的堆运行编译器,看看是否能解决问题。

我不知道如何从命令行运行 clean/build 脚本。

嗯,我认为你需要弄清楚这一点。它可能会帮助您解决问题,无论如何了解这些事情很重要;例如,这样您就可以使用 CI 系统来构建您的代码并运行您的测试。(并且您可能需要从命令行运行脚本以使构建在单独的 JVM 中运行,该 JVM 具有您可以独立于 IDE 控制其大小的堆。)


您对泛型的复杂使用也可能包含一些 Java 编译器无法处理的病态(并且可能是荒谬的)。

我的泛型声明的一个可能问题来源是它们是自引用的。一个声明引用另一个引用第一个的声明。

是的......这就是我所说的那种事情。如果你不小心,你可能会得到一些无意义的东西(从 Java 的角度来看),它涉及到无限的类型扩展。

于 2013-01-02T01:01:46.450 回答