平台
我在 64 位 Windows 7 Professional 上使用 Eclipse Kepler 4.3.2 (.M20140221-1700),该电脑运行在一台配备 8GB RAM 的 Dell E6500 上。Java VM 是 1.7_u51。Java 自动更新和 Windows 更新均处于活动状态。
症状
据我所知,它们从 4 月 9 日开始。之前一切都运行良好。在编辑某些文件(不是全部,但有几种不同的类型:.html、.php、.js,甚至 .css)时,Eclipse 偶尔会停止响应几秒钟。
与内容辅助有某种联系,因为使用 Ctrl-Space 调用内容辅助会立即触发冻结在发生冻结的文件中。
该.metadata/.log
文件报告称内存不足错误,但我相信这是一个转移注意力的幌子——这是另一种症状,而不是真正的原因:
!ENTRY org.eclipse.e4.ui.workbench 4 0 2014-04-10 12:55:13.296
!MESSAGE
!STACK 0
org.eclipse.e4.core.di.InjectionException: java.lang.OutOfMemoryError: Java heap space
at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:63)
at org.eclipse.e4.core.internal.di.InjectorImpl.invokeUsingClass(InjectorImpl.java:243)
at org.eclipse.e4.core.internal.di.InjectorImpl.invoke(InjectorImpl.java:224)
at org.eclipse.e4.core.contexts.ContextInjectionFactory.invoke(ContextInjectionFactory.java:132)
at org.eclipse.e4.core.commands.internal.HandlerServiceHandler.execute(HandlerServiceHandler.java:167)
at org.eclipse.core.commands.Command.executeWithChecks(Command.java:499)
at org.eclipse.core.commands.ParameterizedCommand.executeWithChecks(ParameterizedCommand.java:508)
at org.eclipse.e4.core.commands.internal.HandlerServiceImpl.executeHandler(HandlerServiceImpl.java:213)
at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.executeCommand(KeyBindingDispatcher.java:285)
at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.press(KeyBindingDispatcher.java:504)
at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.processKeyEvent(KeyBindingDispatcher.java:555)
at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.filterKeySequenceBindings(KeyBindingDispatcher.java:376)
at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher.access$0(KeyBindingDispatcher.java:322)
at org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher$KeyDownFilter.handleEvent(KeyBindingDispatcher.java:84)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Display.filterEvent(Display.java:1262)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1056)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1081)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1066)
at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1108)
at org.eclipse.swt.widgets.Widget.sendKeyEvent(Widget.java:1104)
at org.eclipse.swt.widgets.Widget.wmChar(Widget.java:1525)
at org.eclipse.swt.widgets.Control.WM_CHAR(Control.java:4723)
at org.eclipse.swt.widgets.Canvas.WM_CHAR(Canvas.java:344)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:4611)
最初认为问题是内存不足,我增加了 Eclipse 的堆大小. 这实际上延长冻结时间。
迄今为止的假设
正在发生一些事情能由 Content Assist 触发,并导致无限循环,从而导致内存泄漏,直到子程序放弃。通过增加可用内存,我可以让 Eclipse 花费整整一分钟的时间,然后填满 4 GB RAM 并放弃;我可以通过将堆减少到 40 Mb 来稍微改善这个问题,这只需要四五秒钟就可以中止(但我需要一个较大的堆用于其他目的,所以这不是一个可行的解决方法,但这不是解决问题的方法)。
尝试和调查
2014 年 4 月 8 日,问题开始出现,那天是补丁星期二。大约在那个时候,发布了以下更新。这些更新似乎与可能影响 Eclipse 的任何内容都无关;我尝试回滚 2922229 和 2929437,但没有成功,然后重新安装了它们。
通过首先禁用自动激活,然后取消选中所有提案类型(Word、模板、其他 Javascript)来禁用 HTML 和 Javascript 编辑器中的内容辅助,可以减少问题,但不能解决问题。
以清理模式启动 Eclipse 的常规巫术技巧,曾经用于修复最令人困惑的问题(
eclipse -clean -clearPersistedState
)也收效甚微。清除 eclipse.ini 没有产生结果。
使用 FileMon/ProcMon/wireshark 监控文件和网络活动没有发现任何相关信息。
红鲱鱼
正如上面所详述的,堆大小不是一个解决方案。
我收到了另一个我不确定是否相关的错误,“错误解码问题标识符 1073741824”。十六进制为 0x40000000,在我看来是假的。无论如何,谷歌搜索没有找到任何相关内容,包括原始的拼写错误(它称该数字为问题识别符而不是标识符)进一步证实了我的观点伪代码。
下一步
到目前为止发现的线索太少,这让我觉得我错过了什么真的很明显,但在继续实施“焦土”策略(完全删除 Eclipse 并重新安装,然后重新导入所有项目)之前,我决定咨询比我更聪明的人。
同时,我会尝试从 Eclipse 中删除所有不必要的和不是至关重要的插件。
如果以上这些都失败了,我想我可以尝试一下 NetBeans 8。
答案1
结语
按照我的计划,我删除并重新安装了 Kepler......但没有任何效果。
因此,在设置“焦土行动”并因此清点我将要重新安装的所有软件时,我注意到/记得我有还有Java 更新或多或少都在同一时间段内。
所以我:
- 再次移除开普勒,
- 也删除了 Java,
- 运行了注册表优化(Pirisoft 的 CCleaner),发现我的注册表存在各种问题(对于几个可疑的“优化器”来说,这很常见,并且只发生在 CCleaner 中,当真的出了点问题;我可以推荐的另一个好的清洁器是 Auslogics')。
- 重新安装了最新的 Java 更新,
- 重新安装开普勒
- 确认
eclipse.ini
我正在使用新的虚拟机 - 重新导入项目
- 测试过了。到目前为止一切顺利...
- 重新安装了各种插件
- 重新导入所有其他项目
- 逐一测试
- 这次,它成功了!
是更新吗?是注册表清理吗?我能不是第一次就设置了正确的虚拟机(即我的确认实际上是配置更改)?说实话,我不知道。
现在我偶尔远程托管的一个项目仍然有问题(即通过 VPN 访问文件)。我很确定这只意味着 Eclipse 不能很好地应对网络延迟。但除此之外不会再出现冻结。
答案2
这个问题也发生在安装了 4GB RAM 的 Intel Core i5 CPU 上。它以大约 50% 的 RAM 使用率运行,并且没有 CPU 过载。但是每次我命令任何鼠标事件时,eclipse 都会冻结。我注意到 .metadata/.log 充满了 IDE 错误。
所以我卸载了所有插件,然后 eclipse 就不再冻结了。我只安装了 subversion 和 CDT 插件,eclipse 仍然正常工作。我还不知道到底是哪个插件导致了冻结。