| Summary: | [ErrorHandling] multiple stacked "Internal error" dialogs after OutOfMemoryError | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Product: | [Eclipse Project] Platform | Reporter: | Markus Keller <markus.kell.r> | ||||||||||
| Component: | UI | Assignee: | Szymon Brandys <Szymon.Brandys> | ||||||||||
| Status: | VERIFIED FIXED | QA Contact: | |||||||||||
| Severity: | major | ||||||||||||
| Priority: | P1 | CC: | daniel_megert, Mike_Wilson, Tod_Creasey | ||||||||||
| Version: | 3.3 | ||||||||||||
| Target Milestone: | 3.3 RC1 | ||||||||||||
| Hardware: | PC | ||||||||||||
| OS: | Windows XP | ||||||||||||
| Whiteboard: | |||||||||||||
| Attachments: |
|
||||||||||||
|
Description
Markus Keller
Created attachment 58336 [details]
Screenshot
What's worst is that the two frontmost dialogs overlap everything on the screen.
I got this trace in I200760418-1012 before I got 5 nested "An internal error occurred while showing an internal error" dialogs (none of which was responsive). I had to kill the VM.
To avoid such situations, StatusNotificationManager and StatusHandler should preallocate all memory they need.
!ENTRY org.eclipse.ui 4 0 2007-04-23 15:22:39.156
!MESSAGE Unhandled event loop exception
!STACK 0
org.eclipse.swt.SWTException: Failed to execute runnable (java.lang.OutOfMemoryError: Java heap space)
at org.eclipse.swt.SWT.error(SWT.java:3534)
at org.eclipse.swt.SWT.error(SWT.java:3457)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:126)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3650)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3287)
at org.eclipse.jface.window.Window.runEventLoop(Window.java:820)
at org.eclipse.jface.window.Window.open(Window.java:796)
at org.eclipse.ui.internal.ide.dialogs.InternalErrorDialog.open(InternalErrorDialog.java:78)
at org.eclipse.ui.internal.ide.dialogs.InternalErrorDialog.openQuestion(InternalErrorDialog.java:185)
at org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler.openQuestionDialog(IDEWorkbenchErrorHandler.java:220)
at org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler.handleException(IDEWorkbenchErrorHandler.java:142)
at org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler$1.runInUIThread(IDEWorkbenchErrorHandler.java:90)
at org.eclipse.ui.progress.UIJob$1.run(UIJob.java:94)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:123)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3650)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3287)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2365)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2329)
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2204)
at org.eclipse.ui.internal.Workbench$4.run(Workbench.java:466)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:289)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:461)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:101)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:153)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:106)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:76)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:359)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:174)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:475)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:415)
at org.eclipse.equinox.launcher.Main.run(Main.java:1140)
at org.eclipse.equinox.launcher.Main.main(Main.java:1115)
Caused by: java.lang.OutOfMemoryError: Java heap space
at com.ibm.icu.impl.ICUResourceBundleReader.readData(ICUResourceBundleReader.java:247)
at com.ibm.icu.impl.ICUResourceBundleReader.<init>(ICUResourceBundleReader.java:178)
at com.ibm.icu.impl.ICUResourceBundleReader.getReader(ICUResourceBundleReader.java:195)
at com.ibm.icu.impl.ICUResourceBundleImpl.createBundle(ICUResourceBundleImpl.java:49)
at com.ibm.icu.impl.ICUResourceBundle.instantiateBundle(ICUResourceBundle.java:1195)
at com.ibm.icu.impl.ICUResourceBundle.instantiateBundle(ICUResourceBundle.java:1234)
at com.ibm.icu.impl.ICUResourceBundle.getBundleInstance(ICUResourceBundle.java:1163)
at com.ibm.icu.util.UResourceBundle.instantiateBundle(UResourceBundle.java:485)
at com.ibm.icu.util.UResourceBundle.getBundleInstance(UResourceBundle.java:123)
at com.ibm.icu.util.UResourceBundle.getBundleInstance(UResourceBundle.java:105)
at com.ibm.icu.util.UResourceBundle.getBundleInstance(UResourceBundle.java:186)
at com.ibm.icu.impl.ZoneMeta.displayFallback(ZoneMeta.java:295)
at com.ibm.icu.text.DateFormatSymbols.getDefaultZoneItemInfo(DateFormatSymbols.java:1276)
at com.ibm.icu.text.DateFormatSymbols.getZoneString(DateFormatSymbols.java:1123)
at com.ibm.icu.text.SimpleDateFormat.subFormat(SimpleDateFormat.java:852)
at com.ibm.icu.text.SimpleDateFormat.format(SimpleDateFormat.java:576)
at com.ibm.icu.text.DateFormat.format(DateFormat.java:466)
at com.ibm.icu.text.DateFormat.format(DateFormat.java:477)
at org.eclipse.ui.internal.statushandlers.StatusNotificationManager$StatusInfo.getDisplayString(StatusNotificationManager.java:216)
at org.eclipse.ui.internal.statushandlers.StatusDialog.<init>(StatusDialog.java:103)
at org.eclipse.ui.internal.statushandlers.StatusNotificationManager$2.runInUIThread(StatusNotificationManager.java:138)
at org.eclipse.ui.progress.UIJob$1.run(UIJob.java:94)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:123)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3650)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3287)
at org.eclipse.jface.window.Window.runEventLoop(Window.java:820)
at org.eclipse.jface.window.Window.open(Window.java:796)
at org.eclipse.ui.internal.ide.dialogs.InternalErrorDialog.open(InternalErrorDialog.java:78)
at org.eclipse.ui.internal.ide.dialogs.InternalErrorDialog.openQuestion(InternalErrorDialog.java:185)
at org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler.openQuestionDialog(IDEWorkbenchErrorHandler.java:220)
at org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler.handleException(IDEWorkbenchErrorHandler.java:142)
This must be fixed for 3.3. OOMEs are bad, but these stacked error dialogs (that first make me hope for relief, but in the end always require me to kill the VM manually) destroy the last bit of confidence in the stability of the platform. It is marked for 3.3. Major is better severity anyway. If you want Markus to fix it faster, use priority. >If you want Markus to fix it faster, use priority.
Priority should only be set by those who schedule the(ir) work.
> Priority should only be set by those who schedule the(ir) work.
Yep, you are right. Anyway I will try to fix it for RC1.
See also bug 176153 which might be related. Steps to reproduce the complete hang in 3.3M7:
- Start new workspace with:
> java -showversion -jar plugins\org.eclipse.equinox.launcher_*.jar -data newWorkspace -clean -consolelog -console -showlocation
- File > Import > Plug-ins and Fragments, Projects with source folders, choose org.eclipse.jdt.ui
- In the first OutOfMemory dialog, click "No", in subsequent dialogs, try to click "Yes"
=> After a while, nothing moves any more, and the open dialogs don't react to clicks. Stackdump:
Full thread dump Java HotSpot(TM) Client VM (1.5.0_11-b03 mixed mode):
"Java indexing" daemon prio=4 tid=0x0ad7c478 nid=0x336c in Object.wait() [0x0ea8f000..0x0ea8fae8]
at java.lang.Object.wait(Native Method)
- waiting on <0x036e8478> (a org.eclipse.jdt.internal.core.search.indexing.IndexManager)
at java.lang.Object.wait(Object.java:474)
at org.eclipse.jdt.internal.core.search.processing.JobManager.run(JobManager.java:369)
- locked <0x036e8478> (a org.eclipse.jdt.internal.core.search.indexing.IndexManager)
at java.lang.Thread.run(Thread.java:595)
"Worker-4" prio=6 tid=0x0aef9cd0 nid=0x3294 in Object.wait() [0x101af000..0x101afb68]
at java.lang.Object.wait(Native Method)
- waiting on <0x034d0490> (a org.eclipse.core.internal.jobs.WorkerPool)
at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:185)
- locked <0x034d0490> (a org.eclipse.core.internal.jobs.WorkerPool)
at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:217)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:51)
"Worker-1" prio=6 tid=0x0ac81c60 nid=0xc90 in Object.wait() [0x0ea0f000..0x0ea0f9e8]
at java.lang.Object.wait(Native Method)
- waiting on <0x034d0490> (a org.eclipse.core.internal.jobs.WorkerPool)
at org.eclipse.core.internal.jobs.WorkerPool.sleep(WorkerPool.java:185)
- locked <0x034d0490> (a org.eclipse.core.internal.jobs.WorkerPool)
at org.eclipse.core.internal.jobs.WorkerPool.startJob(WorkerPool.java:217)
at org.eclipse.core.internal.jobs.Worker.run(Worker.java:51)
"Start Level Event Dispatcher" daemon prio=6 tid=0x0af84bd8 nid=0x5ac4 in Object.wait() [0x0b38f000..0x0b38fc68]
at java.lang.Object.wait(Native Method)
- waiting on <0x02fb9a58> (a org.eclipse.osgi.framework.eventmgr.EventManager$EventThread)
at java.lang.Object.wait(Object.java:474)
at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.getNextEvent(EventManager.java:355)
- locked <0x02fb9a58> (a org.eclipse.osgi.framework.eventmgr.EventManager$EventThread)
at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:293)
"OSGi Console" prio=6 tid=0x0af85230 nid=0x20bc runnable [0x0b30f000..0x0b30fd68]
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:260)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
- locked <0x02f13ce0> (a java.io.BufferedOutputStream)
at java.io.PrintStream.write(PrintStream.java:383)
- locked <0x02f03008> (a java.io.PrintStream)
at java.io.FilterOutputStream.write(FilterOutputStream.java:60)
at java.io.FilterOutputStream.write(FilterOutputStream.java:108)
at sun.nio.cs.StreamEncoder$CharsetSE.writeBytes(StreamEncoder.java:336)
at sun.nio.cs.StreamEncoder$CharsetSE.implFlushBuffer(StreamEncoder.java:404)
at sun.nio.cs.StreamEncoder$CharsetSE.implFlush(StreamEncoder.java:408)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:152)
- locked <0x02f9b270> (a java.io.OutputStreamWriter)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:213)
at java.io.BufferedWriter.flush(BufferedWriter.java:236)
- locked <0x02f9b270> (a java.io.OutputStreamWriter)
at java.io.PrintWriter.flush(PrintWriter.java:270)
- locked <0x02f98fb8> (a java.io.BufferedWriter)
at org.eclipse.osgi.framework.internal.core.FrameworkConsole.console(FrameworkConsole.java:260)
at org.eclipse.osgi.framework.internal.core.FrameworkConsole.run(FrameworkConsole.java:218)
at java.lang.Thread.run(Thread.java:595)
"Framework Event Dispatcher" daemon prio=6 tid=0x0af2ce68 nid=0x3e4c in Object.wait() [0x0b2cf000..0x0b2cf9e8]
at java.lang.Object.wait(Native Method)
- waiting on <0x02f97e30> (a org.eclipse.osgi.framework.eventmgr.EventManager$EventThread)
at java.lang.Object.wait(Object.java:474)
at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.getNextEvent(EventManager.java:355)
- locked <0x02f97e30> (a org.eclipse.osgi.framework.eventmgr.EventManager$EventThread)
at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:293)
"Low Memory Detector" daemon prio=6 tid=0x003455d8 nid=0x49c4 runnable [0x00000000..0x00000000]
"CompilerThread0" daemon prio=10 tid=0x00344308 nid=0x3018 waiting on condition [0x00000000..0x0abcf848]
"Signal Dispatcher" daemon prio=10 tid=0x003436a8 nid=0x6d94 waiting on condition [0x00000000..0x00000000]
"Finalizer" daemon prio=8 tid=0x0033a4d8 nid=0x5a1c in Object.wait() [0x0ab4f000..0x0ab4fc68]
at java.lang.Object.wait(Native Method)
- waiting on <0x02ef6030> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:116)
- locked <0x02ef6030> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:132)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)
"Reference Handler" daemon prio=10 tid=0x00339068 nid=0x5984 in Object.wait() [0x0ab0f000..0x0ab0fce8]
at java.lang.Object.wait(Native Method)
- waiting on <0x02ef60b0> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:474)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <0x02ef60b0> (a java.lang.ref.Reference$Lock)
"main" prio=6 tid=0x000364b0 nid=0x4a30 runnable [0x0007d000..0x0007fc40]
at org.eclipse.swt.internal.win32.OS.MessageBoxW(Native Method)
at org.eclipse.swt.internal.win32.OS.MessageBox(OS.java:2695)
at org.eclipse.swt.widgets.MessageBox.open(MessageBox.java:191)
at org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler.handleException(IDEWorkbenchErrorHandler.java:137)
at org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler$1.runInUIThread(IDEWorkbenchErrorHandler.java:90)
at org.eclipse.ui.progress.UIJob$1.run(UIJob.java:94)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:123)
- locked <0x043c0be0> (a org.eclipse.swt.widgets.RunnableLock)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3650)
at org.eclipse.swt.widgets.Display.msgFilterProc(Display.java:3032)
at org.eclipse.swt.internal.win32.OS.MessageBoxW(Native Method)
at org.eclipse.swt.internal.win32.OS.MessageBox(OS.java:2695)
at org.eclipse.swt.widgets.MessageBox.open(MessageBox.java:191)
at org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler.handleException(IDEWorkbenchErrorHandler.java:137)
at org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler$1.runInUIThread(IDEWorkbenchErrorHandler.java:90)
at org.eclipse.ui.progress.UIJob$1.run(UIJob.java:94)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:123)
- locked <0x0438ed50> (a org.eclipse.swt.widgets.RunnableLock)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3650)
at org.eclipse.swt.widgets.Display.msgFilterProc(Display.java:3032)
at org.eclipse.swt.internal.win32.OS.MessageBoxW(Native Method)
at org.eclipse.swt.internal.win32.OS.MessageBox(OS.java:2695)
at org.eclipse.swt.widgets.MessageBox.open(MessageBox.java:191)
at org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler.handleException(IDEWorkbenchErrorHandler.java:137)
at org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler$1.runInUIThread(IDEWorkbenchErrorHandler.java:90)
at org.eclipse.ui.progress.UIJob$1.run(UIJob.java:94)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:123)
- locked <0x0438d030> (a org.eclipse.swt.widgets.RunnableLock)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3650)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3287)
at org.eclipse.jface.window.Window.runEventLoop(Window.java:820)
at org.eclipse.jface.window.Window.open(Window.java:796)
at org.eclipse.ui.internal.ide.dialogs.InternalErrorDialog.open(InternalErrorDialog.java:78)
at org.eclipse.ui.internal.ide.dialogs.InternalErrorDialog.openQuestion(InternalErrorDialog.java:185)
at org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler.openQuestionDialog(IDEWorkbenchErrorHandler.java:220)
at org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler.handleException(IDEWorkbenchErrorHandler.java:142)
at org.eclipse.ui.internal.ide.IDEWorkbenchErrorHandler$1.runInUIThread(IDEWorkbenchErrorHandler.java:90)
at org.eclipse.ui.progress.UIJob$1.run(UIJob.java:94)
at org.eclipse.swt.widgets.RunnableLock.run(RunnableLock.java:35)
at org.eclipse.swt.widgets.Synchronizer.runAsyncMessages(Synchronizer.java:123)
- locked <0x04374368> (a org.eclipse.swt.widgets.RunnableLock)
at org.eclipse.swt.widgets.Display.runAsyncMessages(Display.java:3650)
at org.eclipse.swt.widgets.Display.readAndDispatch(Display.java:3287)
at org.eclipse.ui.internal.Workbench.runEventLoop(Workbench.java:2365)
at org.eclipse.ui.internal.Workbench.runUI(Workbench.java:2329)
at org.eclipse.ui.internal.Workbench.access$4(Workbench.java:2204)
at org.eclipse.ui.internal.Workbench$4.run(Workbench.java:466)
at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:289)
at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:461)
at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:149)
at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:106)
at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:153)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:106)
at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:76)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:363)
at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:176)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:497)
at org.eclipse.equinox.launcher.Main.basicRun(Main.java:436)
at org.eclipse.equinox.launcher.Main.run(Main.java:1162)
at org.eclipse.equinox.launcher.Main.main(Main.java:1137)
"VM Thread" prio=10 tid=0x003365a0 nid=0x13b8 runnable
"VM Periodic Task Thread" prio=10 tid=0x00346960 nid=0x6f8c waiting on condition
Created attachment 67421 [details]
Fix proposal 01
Created attachment 67430 [details]
Fix proposal 02
1) try to recreate the exception from the comment 8 2) use the Test Bed - cause errors (NullPointer) in jobs (the error dialog will be opened) - pass statuses to the facility (with SHOW style) (we will see these statuses in the opened dialog) - cause at least one OOM exception (by running job with OOM or using Status Handling menu) 3) cause couple OOM exceptions 4) Try SHMenu and "Throw OutOfMemory Action". It will throw OOM which is passed to the status handling facility with LOG style. In all cases we should see two dialogs. First is a regular error dialog with a list of errors. The second is the fatal error dialog for closing the workbench. Created attachment 67462 [details]
Example with many dialogs
+1 for the fix for 3.3 as it is better than what we had.
However here is an example that generates 10 OutOfMemory exceptions and still opens several dialogs. Given how late in the game this is I think we should look at this case for 3.3.1 or 3.4.
STEPS
1) Load a plug-in into your workspace
2) Select your manifest file
3) Popup New Submeny - > Out of Memory Test
Yes. I can reproduce it, but it is not as harmful as before. As discussed it will be fixed in 3.3.1. With I20070517-1700, I had an OOME "by accident" and I provoked comment 8. In both cases, the error was handled gracefully. I'm happy with the currently released fix. Great :-) After discussion with Markus I decided to close this bug and open another one for the case Tod observed. The new one is Bug 188351. |