【问题标题】:Use of Java generics could be hanging the compiler使用 Java 泛型可能会挂起编译器
【发布时间】:2013-01-02 00:28:24
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 源文件有多少?
  • 不管这是否挂了编译器,这听起来很可怕。
  • 很抱歉,我无法想象您在描述什么。您能否提供一个展示您的技术的精简清单(因为没有更好的词)?也许是单字母类名?
  • 尽量给编译器更多内存!
  • 您能否发布指向这些声明之一的 sn-p 的链接?老实说,我只是想傻眼。

标签: java generics compilation freeze


【解决方案1】:

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

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

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

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


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

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

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

【讨论】:

  • 我认为不可能有“无限类型扩展”。
  • 我要做的是完成一个循环引用的模式,从一个接口通过所有其他接口并返回到自身。我的项目是我多年来的一个想法的实现,这个想法是基于一个定义自我概念的系统。可能是 Java 无法对这些概念建模,也可能是我的概念本质上不是算法。我一直在散步,并考虑过其他可能性。我现在将关注其他一些线索。感谢您的宝贵时间。
  • @OwenThomas - 我认为您可能对 Java 期望过高。它是一种编程语言……不是用于建模类型的系统。
  • @OwenThomas 你的问题让我想起了这个simpler question 和我对它的回答。不知道有多少相关性。
  • @StephenC 我想我正在发现这一点。我选择 Java 是因为我只知道相对较少的语言环境,而其中 Java 似乎是最有能力的。也许如果我有更广泛的知识,我可能会做出更明智的选择。也许,Java 仍然是一个不错的选择,因为它是一种被广泛支持的语言,并且它具有我的实现可以利用的其他特性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多