Eclipse 在 Ubuntu 冻结 UI
Eclipse freezes UI on Ubuntu
我最近安装了ubuntu16.04(自动更新到这个版本),我平时在Java开发,我知道eclipse,所以我安装了,没问题。
我配置了所需的一切(Java 路径,JDK...没什么特别的),工作正常,除了 Eclipse UI。
每次我创建项目时 UI 都会冻结(虽然项目创建正确),每次我 运行 任何程序(虽然程序 运行 应该(并不总是正确 xD,但那是我的错)),以及许多其他任务。
知道为什么会发生这种情况吗?更好的是,如何解决?
我还仔细检查了我使用的 JRE(因为我发现人们在使用开源软件时遇到问题),我使用的是 oracle 的版本(现在不确定名称,抱歉,版本 8)。
上面的所有内容都是 64 位版本。
编辑:忘了说我用的是火星版。另外,我刚刚安装了 NetBeans (8.1),完全相同的问题,然后我认为是图形驱动程序的问题,重新安装,仍然有同样的问题。不知道现在该尝试什么。
更新: 检查日志文件。我没有看到任何奇怪的东西,但可能遗漏了一些东西:
!SESSION 2015-12-04 13:24:38.930 -----------------------------------------------
eclipse.buildId=4.5.1.M20150904-0015
java.version=1.8.0_66
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=es_ES
Command-line arguments: -os linux -ws gtk -arch x86_64
!ENTRY org.eclipse.core.resources 2 10035 2015-12-04 13:24:40.542
!MESSAGE The workspace exited with unsaved changes in the previous session; refreshing workspace to recover changes.
更新 2: 我只是 运行 @dan 建议的命令。这是结果
"main" #1 prio=6 os_prio=0 tid=0x00007f0ec000a000 nid=0x26e0 runnable [0x00007f0ec9a18000]
java.lang.Thread.State: RUNNABLE
at org.eclipse.swt.internal.gtk.OS._gtk_widget_get_allocation(Native Method)
at org.eclipse.swt.internal.gtk.OS.gtk_widget_get_allocation(OS.java:14234)
at org.eclipse.swt.widgets.Control.getBounds(Control.java:832)
at org.eclipse.jface.fieldassist.ControlDecoration.getDecorationRectangle(ControlDecoration.java:1185)
at org.eclipse.jface.fieldassist.ControlDecoration.paintControl(ControlDecoration.java:635)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:230)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4481)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1329)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1353)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1338)
at org.eclipse.swt.widgets.Control.gtk_draw(Control.java:3219)
at org.eclipse.swt.widgets.Canvas.gtk_draw(Canvas.java:171)
at org.eclipse.swt.widgets.Shell.gtk_draw(Shell.java:1306)
at org.eclipse.swt.widgets.Widget.windowProc(Widget.java:1942)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:5590)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4717)
at org.eclipse.swt.internal.gtk.OS._gtk_main_do_event(Native Method)
at org.eclipse.swt.internal.gtk.OS.gtk_main_do_event(OS.java:9279)
at org.eclipse.swt.widgets.Display.eventProc(Display.java:1225)
at org.eclipse.swt.internal.gtk.OS._g_main_context_iteration(Native Method)
at org.eclipse.swt.internal.gtk.OS.g_main_context_iteration(OS.java:2425)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3428)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.block(ModalContext.java:172)
at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:387)
at org.eclipse.jface.wizard.WizardDialog.run(WizardDialog.java:1002)
at org.eclipse.jdt.internal.ui.wizards.NewElementWizard.performFinish(NewElementWizard.java:134)
at org.eclipse.jdt.internal.ui.wizards.NewClassCreationWizard.performFinish(NewClassCreationWizard.java:80)
at org.eclipse.jface.wizard.WizardDialog.finishPressed(WizardDialog.java:799)
at org.eclipse.jface.wizard.WizardDialog.buttonPressed(WizardDialog.java:429)
at org.eclipse.jface.dialogs.Dialog.widgetSelected(Dialog.java:619)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4481)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1329)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3819)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3430)
at org.eclipse.jface.window.Window.runEventLoop(Window.java:827)
at org.eclipse.jface.window.Window.open(Window.java:803)
at org.eclipse.ui.internal.navigator.wizards.WizardShortcutAction.run(WizardShortcutAction.java:99)
at org.eclipse.jface.action.Action.runWithEvent(Action.java:473)
at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:595)
at org.eclipse.jface.action.ActionContributionItem.access(ActionContributionItem.java:511)
at org.eclipse.jface.action.ActionContributionItem.handleEvent(ActionContributionItem.java:420)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4481)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1329)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3819)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3430)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1127)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1018)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:156)
at org.eclipse.ui.internal.Workbench.run(Workbench.java:654)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:598)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:139)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:669)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:608)
at org.eclipse.equinox.launcher.Main.run(Main.java:1515)
at org.eclipse.equinox.launcher.Main.main(Main.java:1488)
Locked ownable synchronizers:
- None
您应该生成一个 java eclipse 进程的线程转储,例如:
建立进程id:
jps -lv
确定代表 eclipse 实例的行并记住该行的第一个数字,即进程 ID。
触发线程转储,使用进程id:
jstack -l process_id > jstack.out
这样,您将获得当时 JVM
中处于活动状态的每个线程的堆栈跟踪。从这里您应该能够确定为什么您的程序不是 运行。
Linux 上的 Eclipse UI 默认使用 GTK 3 来显示内容,但我发现经常会出现问题。我不确定这是否是问题的根源,但您可以通过使用环境变量设置禁用 GTK 3 支持来检查它:export SWT_GTK3=0
。但是,在您发现这就是问题的根源之前,我不会永久打开它。
我已经找到问题了。正如 Zoltán 和 Dan 所指出的,问题出在 GTK 上。
解决方法:(仅在Eclipse上测试):
- 转到 Window>首选项>常规>外观。
- 将"GTK" 主题更改为您喜欢的任何其他主题。
这解决了我的问题。
打开 https://bugs.eclipse.org/bugs/show_bug.cgi?id=492829 以跟踪这可能是 SWT/GTK3 交互中的错误。
我认为早期版本的 Eclipse 会出现此问题。我尝试将 Eclipse Mars 用于 Java 和 J2ee。
我签入了 Neon 版本;这个问题没有发生。 Eclipse 没有冻结。
我最近安装了ubuntu16.04(自动更新到这个版本),我平时在Java开发,我知道eclipse,所以我安装了,没问题。
我配置了所需的一切(Java 路径,JDK...没什么特别的),工作正常,除了 Eclipse UI。
每次我创建项目时 UI 都会冻结(虽然项目创建正确),每次我 运行 任何程序(虽然程序 运行 应该(并不总是正确 xD,但那是我的错)),以及许多其他任务。
知道为什么会发生这种情况吗?更好的是,如何解决?
我还仔细检查了我使用的 JRE(因为我发现人们在使用开源软件时遇到问题),我使用的是 oracle 的版本(现在不确定名称,抱歉,版本 8)。 上面的所有内容都是 64 位版本。
编辑:忘了说我用的是火星版。另外,我刚刚安装了 NetBeans (8.1),完全相同的问题,然后我认为是图形驱动程序的问题,重新安装,仍然有同样的问题。不知道现在该尝试什么。
更新: 检查日志文件。我没有看到任何奇怪的东西,但可能遗漏了一些东西:
!SESSION 2015-12-04 13:24:38.930 -----------------------------------------------
eclipse.buildId=4.5.1.M20150904-0015
java.version=1.8.0_66
java.vendor=Oracle Corporation
BootLoader constants: OS=linux, ARCH=x86_64, WS=gtk, NL=es_ES
Command-line arguments: -os linux -ws gtk -arch x86_64
!ENTRY org.eclipse.core.resources 2 10035 2015-12-04 13:24:40.542
!MESSAGE The workspace exited with unsaved changes in the previous session; refreshing workspace to recover changes.
更新 2: 我只是 运行 @dan 建议的命令。这是结果
"main" #1 prio=6 os_prio=0 tid=0x00007f0ec000a000 nid=0x26e0 runnable [0x00007f0ec9a18000]
java.lang.Thread.State: RUNNABLE
at org.eclipse.swt.internal.gtk.OS._gtk_widget_get_allocation(Native Method)
at org.eclipse.swt.internal.gtk.OS.gtk_widget_get_allocation(OS.java:14234)
at org.eclipse.swt.widgets.Control.getBounds(Control.java:832)
at org.eclipse.jface.fieldassist.ControlDecoration.getDecorationRectangle(ControlDecoration.java:1185)
at org.eclipse.jface.fieldassist.ControlDecoration.paintControl(ControlDecoration.java:635)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:230)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4481)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1329)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1353)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1338)
at org.eclipse.swt.widgets.Control.gtk_draw(Control.java:3219)
at org.eclipse.swt.widgets.Canvas.gtk_draw(Canvas.java:171)
at org.eclipse.swt.widgets.Shell.gtk_draw(Shell.java:1306)
at org.eclipse.swt.widgets.Widget.windowProc(Widget.java:1942)
at org.eclipse.swt.widgets.Control.windowProc(Control.java:5590)
at org.eclipse.swt.widgets.Display.windowProc(Display.java:4717)
at org.eclipse.swt.internal.gtk.OS._gtk_main_do_event(Native Method)
at org.eclipse.swt.internal.gtk.OS.gtk_main_do_event(OS.java:9279)
at org.eclipse.swt.widgets.Display.eventProc(Display.java:1225)
at org.eclipse.swt.internal.gtk.OS._g_main_context_iteration(Native Method)
at org.eclipse.swt.internal.gtk.OS.g_main_context_iteration(OS.java:2425)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3428)
at org.eclipse.jface.operation.ModalContext$ModalContextThread.block(ModalContext.java:172)
at org.eclipse.jface.operation.ModalContext.run(ModalContext.java:387)
at org.eclipse.jface.wizard.WizardDialog.run(WizardDialog.java:1002)
at org.eclipse.jdt.internal.ui.wizards.NewElementWizard.performFinish(NewElementWizard.java:134)
at org.eclipse.jdt.internal.ui.wizards.NewClassCreationWizard.performFinish(NewClassCreationWizard.java:80)
at org.eclipse.jface.wizard.WizardDialog.finishPressed(WizardDialog.java:799)
at org.eclipse.jface.wizard.WizardDialog.buttonPressed(WizardDialog.java:429)
at org.eclipse.jface.dialogs.Dialog.widgetSelected(Dialog.java:619)
at org.eclipse.swt.widgets.TypedListener.handleEvent(TypedListener.java:248)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4481)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1329)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3819)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3430)
at org.eclipse.jface.window.Window.runEventLoop(Window.java:827)
at org.eclipse.jface.window.Window.open(Window.java:803)
at org.eclipse.ui.internal.navigator.wizards.WizardShortcutAction.run(WizardShortcutAction.java:99)
at org.eclipse.jface.action.Action.runWithEvent(Action.java:473)
at org.eclipse.jface.action.ActionContributionItem.handleWidgetSelection(ActionContributionItem.java:595)
at org.eclipse.jface.action.ActionContributionItem.access(ActionContributionItem.java:511)
at org.eclipse.jface.action.ActionContributionItem.handleEvent(ActionContributionItem.java:420)
at org.eclipse.swt.widgets.EventTable.sendEvent(EventTable.java:84)
at org.eclipse.swt.widgets.Display.sendEvent(Display.java:4481)
at org.eclipse.swt.widgets.Widget.sendEvent(Widget.java:1329)
at org.eclipse.swt.widgets.Display.runDeferredEvents(Display.java:3819)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3430)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1127)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337)
at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1018)
at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:156)
at org.eclipse.ui.internal.Workbench.run(Workbench.java:654)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:337)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:598)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:150)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:139)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:196)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:134)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:380)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:235)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:669)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:608)
at org.eclipse.equinox.launcher.Main.run(Main.java:1515)
at org.eclipse.equinox.launcher.Main.main(Main.java:1488)
Locked ownable synchronizers:
- None
您应该生成一个 java eclipse 进程的线程转储,例如:
建立进程id:
jps -lv
确定代表 eclipse 实例的行并记住该行的第一个数字,即进程 ID。
触发线程转储,使用进程id:
jstack -l process_id > jstack.out
这样,您将获得当时 JVM
中处于活动状态的每个线程的堆栈跟踪。从这里您应该能够确定为什么您的程序不是 运行。
Linux 上的 Eclipse UI 默认使用 GTK 3 来显示内容,但我发现经常会出现问题。我不确定这是否是问题的根源,但您可以通过使用环境变量设置禁用 GTK 3 支持来检查它:export SWT_GTK3=0
。但是,在您发现这就是问题的根源之前,我不会永久打开它。
我已经找到问题了。正如 Zoltán 和 Dan 所指出的,问题出在 GTK 上。
解决方法:(仅在Eclipse上测试):
- 转到 Window>首选项>常规>外观。
- 将"GTK" 主题更改为您喜欢的任何其他主题。
这解决了我的问题。
打开 https://bugs.eclipse.org/bugs/show_bug.cgi?id=492829 以跟踪这可能是 SWT/GTK3 交互中的错误。
我认为早期版本的 Eclipse 会出现此问题。我尝试将 Eclipse Mars 用于 Java 和 J2ee。 我签入了 Neon 版本;这个问题没有发生。 Eclipse 没有冻结。