Eclipse在Ubuntu上冻结UI

12

最近我安装了Ubuntu 16.04(自动更新到这个版本),我通常使用Java进行开发,并且我知道eclipse,所以我安装了它,一切正常。

我配置了需要的所有内容(Java路径、JDK等等,没有特别的),工作正常,除了Eclipse UI。

每次创建项目时,UI都会冻结(尽管项目已正确创建),每次运行任何程序时(虽然程序按照应有的方式运行(并不总是正确的,但那是我的问题)),以及许多其他任务。

有什么想法可以解决这个问题吗?更好的是,如何解决?

我还双重检查了我正在使用的JRE(因为我发现有人遇到开源软件的问题),我使用Oracle的版本(现在不确定名称,抱歉,版本8)。所有东西都是64位版本。

编辑:我忘记提到我使用的是Mars版本。我还安装了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$3.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$2.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$2(ActionContributionItem.java:511)
    at org.eclipse.jface.action.ActionContributionItem$5.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$4.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$5.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

关于UI冻结的问题... 在运行项目后,它是在项目启动时立即冻结还是在您执行某些操作后才冻结? - Jeet Parekh
只有当我做某些事情时,就像我已经说过的那样,而且我认为这是“有趣”的部分,它可以很好地完成每个任务,但它会冻结用户界面,我必须重新启动它。 - Mayuso
我可能错了,但也许有一个无限循环的地方,你不知道它会导致UI冻结...尝试在Eclipse中进行调试,做与导致冻结相同的事情。我使用Notepad++编程,所以我使用了穷人的调试器...在代码中添加System.out.println()语句。 - Jeet Parekh
你可以查看一下你工作区下面的 .metadata/.log 目录中的 Eclipse 日志 - 也许你能在那里找到一些有用的信息。 - piet.t
请注意,名称以“.”开头,因此它是一个隐藏文件夹。在终端中键入“ls -la”应该可以显示它。 - piet.t
显示剩余6条评论
6个回答

14

在Linux上,Eclipse UI默认使用GTK 3来显示内容,但我发现经常会出现问题。我不确定这是否是问题的根源,但您可以通过禁用GTK 3支持来检查它,方法是设置环境变量:export SWT_GTK3 = 0。然而,在您找到问题的根源之前,我不建议永久启用它。


这个问题出现在 Eclipse 4.5.2 上,当调用 org.eclipse.swt.internal.gtk.os.Call[native] 时,它似乎只在一个核心上旋转。特定版本是 libgtk 3.18.9-1ubuntu3。谢谢!我曾经认真考虑过启动 Windows 10。 - KarlP

10
我已经找到问题所在。正如Zoltán和Dan所指出的,GTK是问题所在。
解决方案:(仅在Eclipse上测试过):
  1. 转到“Window>Preferences>General>Appearance”。
  2. 更改“GTK”主题为您喜欢的任何其他主题。
这为我解决了问题。

我尝试过了,但问题仍然存在。下载Eclipse Neon版本后,问题得到解决。 - MouTio
这对我解决了问题。我也在运行Ubuntu 16.04 :) - Bram

7
你应该生成Eclipse进程的Java线程转储,如下所示:

  1. Establish the process id:

    jps -lv
    

    Identify the line that is representing the eclipse instance and remember the first number on the line, the process id.

  2. Trigger the thread dump, using the process id:

    jstack -l process_id > jstack.out
    

这样,您将获得该JVM中每个活动线程的堆栈跟踪。从这里,您应该能够确定为什么程序无法运行。


我尝试了这个。只打印出一堆线程正在等待,几个可运行的线程和一些其他的定时等待。 (我猜最后一个是错误?我找不到任何关于这个的信息) - Mayuso
@Mayuso 你应该检查一下你的Main线程是否处于等待/锁定状态。线程转储中堆栈跟踪的顺序并不重要。但是,如果你在列表中找不到你的Main线程,并且你说这是在NetBeans中发生的,那么这意味着你有一个JVM问题,你尝试过另一个JVM吗?也许尝试使用1.7OpenJVM - dan
主函数处于“可运行”状态。 - Mayuso
更新了。就是这样 :) - Mayuso
@Mayuso,你尝试过禁用GTK吗?这似乎与Zoltan所建议的一样与GTK有关。然后将GTK2主题更改为除氧之外的其他主题,似乎有报告称氧主题也会影响eclipse。 - dan

3

0

我认为这个问题出现在早期版本的Eclipse中。我尝试了Java和J2ee的Eclipse Mars版本。 我在Neon版本中进行了检查,这个问题没有发生。Eclipse没有冻结。


0
在eclipse.ini中将堆大小增加到1GB似乎对我解决了这个问题。您可以在启用堆使用情况时查看使用了多少堆,方法是前往“窗口”>“首选项”>“常规”。

enter image description here

信息显示在UI底部 输入图像描述

eclipse.ini更改

enter image description here

希望这可以帮到你。(我的是256m,增加到1024m - 有时我可以看到它超过600m)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接