Skip to content

initialize boot dashboard model lazy to avoid slow startup #957

@martinlippert

Description

@martinlippert

I am observing a period of beach balling when starting up the STS IDE with my regular workspace. The thread dump that I took during this period reveals that the boot dashboard model is being initialized during startup, but directly triggers the full initialization of all the Java tooling (which usually happens async once the workbench is up and showing). We should allow the boot dashboard to initialize its model async as well, to improve startup performance.

Here is the thread dump (the main thread part that blocks the UI thread and causes the beachballing while showing the splash screen):

"main" #1 prio=6 os_prio=31 cpu=6974.14ms elapsed=20.53s tid=0x00007f885680a400 nid=0x103 runnable [0x00007ff7b22ec000] java.lang.Thread.State: RUNNABLE	at java.lang.String.<init>(java.base@17.0.5/String.java:590)	at java.lang.String.<init>(java.base@17.0.5/String.java:1385)	at jdk.internal.jimage.ImageStringsReader.stringFromByteBuffer(ImageStringsReader.java:272)	at jdk.internal.jimage.BasicImageReader.getString(BasicImageReader.java:344)	at jdk.internal.jimage.ImageStringsReader.get(ImageStringsReader.java:52)	at jdk.internal.jimage.ImageLocation.getAttributeString(ImageLocation.java:253)	at jdk.internal.jimage.ImageLocation.getExtension(ImageLocation.java:281)	at jdk.internal.jimage.ImageLocation.getFullName(ImageLocation.java:314)	at jdk.internal.jimage.ImageLocation.getFullName(ImageLocation.java:289)	at jdk.internal.jimage.ImageReader$SharedImageReader.lambda$handleModulesSubTree$1(ImageReader.java:456)	at jdk.internal.jimage.ImageReader$SharedImageReader$$Lambda$734/0x00000001008dd768.visit(Unknown Source)	at jdk.internal.jimage.ImageReader$SharedImageReader.visitLocation(ImageReader.java:361)	at jdk.internal.jimage.ImageReader$SharedImageReader.handleModulesSubTree(ImageReader.java:455)	at jdk.internal.jimage.ImageReader$SharedImageReader.buildNode(ImageReader.java:311)	- locked <0x000000008137cdd8> (a jdk.internal.jimage.ImageReader$SharedImageReader)	at jdk.internal.jimage.ImageReader$SharedImageReader.findNode(ImageReader.java:507)	- locked <0x000000008137cdd8> (a jdk.internal.jimage.ImageReader$SharedImageReader)	at jdk.internal.jimage.ImageReader.findNode(ImageReader.java:104)	at jdk.internal.jrtfs.SystemImage$1.findNode(SystemImage.java:65)	at jdk.internal.jrtfs.JrtFileSystem.lookup(JrtFileSystem.java:449)	at jdk.internal.jrtfs.JrtFileSystem.checkNode(JrtFileSystem.java:482)	at jdk.internal.jrtfs.JrtFileSystem.getFileAttributes(JrtFileSystem.java:208)	at jdk.internal.jrtfs.JrtPath.getAttributes(JrtPath.java:654)	at jdk.internal.jrtfs.JrtFileSystemProvider.readAttributes(JrtFileSystemProvider.java:340)	at java.nio.file.Files.readAttributes(java.base@17.0.5/Files.java:1851)	at java.nio.file.FileTreeWalker.getAttributes(java.base@17.0.5/FileTreeWalker.java:220)	at java.nio.file.FileTreeWalker.visit(java.base@17.0.5/FileTreeWalker.java:277)	at java.nio.file.FileTreeWalker.next(java.base@17.0.5/FileTreeWalker.java:374)	at java.nio.file.Files.walkFileTree(java.base@17.0.5/Files.java:2845)	at java.nio.file.Files.walkFileTree(java.base@17.0.5/Files.java:2882)	at org.eclipse.jdt.internal.compiler.util.JrtFileSystem.walkModuleImage(JRTUtil.java:706)	at org.eclipse.jdt.internal.compiler.util.JRTUtil.walkModuleImage(JRTUtil.java:242)	at org.eclipse.jdt.internal.core.builder.ClasspathJrt.lambda$0(ClasspathJrt.java:89)	at org.eclipse.jdt.internal.core.builder.ClasspathJrt$$Lambda$759/0x00000001008f46e8.apply(Unknown Source)	at java.util.concurrent.ConcurrentHashMap.computeIfAbsent(java.base@17.0.5/ConcurrentHashMap.java:1740)	- locked <0x000000008de8e828> (a java.util.concurrent.ConcurrentHashMap$Node)	at org.eclipse.jdt.internal.core.builder.ClasspathJrt.findPackagesInModules(ClasspathJrt.java:86)	at org.eclipse.jdt.internal.core.builder.ClasspathJrt.getModuleNames(ClasspathJrt.java:261)	at org.eclipse.pde.internal.core.TargetPlatformHelper.querySystemPackages(TargetPlatformHelper.java:418)	at org.eclipse.pde.internal.core.TargetPlatformHelper.getPlatformProperties(TargetPlatformHelper.java:385)	at org.eclipse.pde.internal.core.MinimalState.getProfilePlatformProperties(MinimalState.java:260)	at org.eclipse.pde.internal.core.MinimalState.initializePlatformProperties(MinimalState.java:254)	at org.eclipse.pde.internal.core.PDEState.<init>(PDEState.java:67)	at org.eclipse.pde.internal.core.PluginModelManager.initializeTable(PluginModelManager.java:616)	at org.eclipse.pde.internal.core.PluginModelManager.findModel(PluginModelManager.java:1070)	- locked <0x0000000083a40878> (a java.lang.Object)	at org.eclipse.pde.internal.core.RequiredPluginsInitializer.initialize(RequiredPluginsInitializer.java:50)	at org.eclipse.jdt.internal.core.JavaModelManager.initializeContainer(JavaModelManager.java:3145)	at org.eclipse.jdt.internal.core.JavaModelManager.getClasspathContainer(JavaModelManager.java:2093)	at org.eclipse.jdt.core.JavaCore.getClasspathContainer(JavaCore.java:3815)	at org.eclipse.jdt.internal.core.JavaProject.resolveClasspath(JavaProject.java:3271)	at org.eclipse.jdt.internal.core.JavaProject.resolveClasspath(JavaProject.java:3435)	at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaProject.java:2554)	at org.springframework.ide.eclipse.boot.core.BootPropertyTester.isBootProject(BootPropertyTester.java:130)	at org.springframework.ide.eclipse.boot.dash.model.BootProjectDashElementFactory.createOrGet(BootProjectDashElementFactory.java:53)	at org.springframework.ide.eclipse.boot.dash.model.LocalBootDashModel$$Lambda$689/0x000000010089a948.apply(Unknown Source)	at java.util.stream.ReferencePipeline$3$1.accept(java.base@17.0.5/ReferencePipeline.java:197)	at java.util.Spliterators$ArraySpliterator.forEachRemaining(java.base@17.0.5/Spliterators.java:992)	at java.util.stream.AbstractPipeline.copyInto(java.base@17.0.5/AbstractPipeline.java:509)	at java.util.stream.AbstractPipeline.wrapAndCopyInto(java.base@17.0.5/AbstractPipeline.java:499)	at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(java.base@17.0.5/ReduceOps.java:921)	at java.util.stream.AbstractPipeline.evaluate(java.base@17.0.5/AbstractPipeline.java:234)	at java.util.stream.ReferencePipeline.collect(java.base@17.0.5/ReferencePipeline.java:682)	at org.springframework.ide.eclipse.boot.dash.model.LocalBootDashModel.updateElementsFromWorkspace(LocalBootDashModel.java:295)	at org.springframework.ide.eclipse.boot.dash.model.LocalBootDashModel$3.gotValue(LocalBootDashModel.java:178)	at org.springframework.ide.eclipse.boot.dash.model.LocalBootDashModel$3.gotValue(LocalBootDashModel.java:1)	at org.springsource.ide.eclipse.commons.livexp.core.LiveExpression.addListener(LiveExpression.java:171)	at org.springframework.ide.eclipse.boot.dash.model.LocalBootDashModel.init(LocalBootDashModel.java:176)	at org.springframework.ide.eclipse.boot.dash.model.LocalBootDashModel.getElements(LocalBootDashModel.java:302)	- locked <0x00000000835b5088> (a org.springframework.ide.eclipse.boot.dash.model.LocalBootDashModel)	at org.springframework.ide.eclipse.boot.dash.views.sections.BootDashTreeContentProvider.getChildren(BootDashTreeContentProvider.java:49)	at org.springframework.ide.eclipse.boot.dash.views.sections.BootDashTreeContentProvider.hasChildren(BootDashTreeContentProvider.java:77)	at org.eclipse.jface.viewers.AbstractTreeViewer.isExpandable(AbstractTreeViewer.java:2184)	at org.eclipse.jface.viewers.TreeViewer.isExpandable(TreeViewer.java:553)	at org.eclipse.jface.viewers.AbstractTreeViewer.isExpandable(AbstractTreeViewer.java:2214)	at org.eclipse.jface.viewers.AbstractTreeViewer.updatePlus(AbstractTreeViewer.java:2897)	at org.eclipse.jface.viewers.TreeViewer.updatePlus(TreeViewer.java:801)	at org.eclipse.jface.viewers.AbstractTreeViewer.createTreeItem(AbstractTreeViewer.java:865)	at org.eclipse.jface.viewers.AbstractTreeViewer.createChildren(AbstractTreeViewer.java:842)	at org.eclipse.jface.viewers.TreeViewer.createChildren(TreeViewer.java:611)	at org.eclipse.jface.viewers.AbstractTreeViewer.createChildren(AbstractTreeViewer.java:790)	at org.eclipse.jface.viewers.AbstractTreeViewer.internalInitializeTree(AbstractTreeViewer.java:1610)	at org.eclipse.jface.viewers.TreeViewer.internalInitializeTree(TreeViewer.java:787)	at org.eclipse.jface.viewers.AbstractTreeViewer.lambda$1(AbstractTreeViewer.java:1595)	at org.eclipse.jface.viewers.AbstractTreeViewer$$Lambda$639/0x00000001007e06c0.run(Unknown Source)	at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1398)	at org.eclipse.jface.viewers.TreeViewer.preservingSelection(TreeViewer.java:365)	at org.eclipse.jface.viewers.StructuredViewer.preservingSelection(StructuredViewer.java:1359)	at org.eclipse.jface.viewers.AbstractTreeViewer.inputChanged(AbstractTreeViewer.java:1589)	at org.eclipse.jface.viewers.ContentViewer.setInput(ContentViewer.java:282)	at org.eclipse.jface.viewers.StructuredViewer.setInput(StructuredViewer.java:1632)	at org.springframework.ide.eclipse.boot.dash.views.sections.BootDashUnifiedTreeSection.createContents(BootDashUnifiedTreeSection.java:330)	at org.springsource.ide.eclipse.commons.livexp.ui.ViewPartWithSections.createPartControl(ViewPartWithSections.java:57)	at org.springframework.ide.eclipse.boot.dash.views.BootDashTreeView.createPartControl(BootDashTreeView.java:116)	at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.createPartControl(CompatibilityPart.java:158)	at org.eclipse.ui.internal.e4.compatibility.CompatibilityView.createPartControl(CompatibilityView.java:155)	at org.eclipse.ui.internal.e4.compatibility.CompatibilityPart.create(CompatibilityPart.java:365)	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.base@17.0.5/Native Method)	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.base@17.0.5/NativeMethodAccessorImpl.java:77)	at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@17.0.5/DelegatingMethodAccessorImpl.java:43)	at java.lang.reflect.Method.invoke(java.base@17.0.5/Method.java:568)	at org.eclipse.e4.core.internal.di.MethodRequestor.execute(MethodRequestor.java:58)	at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:995)	at org.eclipse.e4.core.internal.di.InjectorImpl.processAnnotated(InjectorImpl.java:960)	at org.eclipse.e4.core.internal.di.InjectorImpl.internalInject(InjectorImpl.java:140)	at org.eclipse.e4.core.internal.di.InjectorImpl.internalMake(InjectorImpl.java:403)	at org.eclipse.e4.core.internal.di.InjectorImpl.make(InjectorImpl.java:330)	at org.eclipse.e4.core.contexts.ContextInjectionFactory.make(ContextInjectionFactory.java:202)	at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.createFromBundle(ReflectionContributionFactory.java:91)	at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.doCreate(ReflectionContributionFactory.java:60)	at org.eclipse.e4.ui.internal.workbench.ReflectionContributionFactory.create(ReflectionContributionFactory.java:42)	at org.eclipse.e4.ui.workbench.renderers.swt.ContributedPartRenderer.createWidget(ContributedPartRenderer.java:132)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:995)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:659)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$1.run(PartRenderingEngine.java:544)	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:528)	at org.eclipse.e4.ui.workbench.renderers.swt.ElementReferenceRenderer.createWidget(ElementReferenceRenderer.java:73)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createWidget(PartRenderingEngine.java:995)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:659)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:763)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:728)	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:712)	at org.eclipse.e4.ui.workbench.renderers.swt.StackRenderer.showTab(StackRenderer.java:1208)	at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.postProcess(LazyStackRenderer.java:116)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:677)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:763)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:728)	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:712)	at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:72)	at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:150)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:673)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:763)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:728)	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:712)	at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:72)	at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:150)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:673)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:763)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:728)	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:712)	at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:72)	at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:150)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:673)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:763)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:728)	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:712)	at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:72)	at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveRenderer.processContents(PerspectiveRenderer.java:51)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:673)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:763)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:728)	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:712)	at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveStackRenderer.showTab(PerspectiveStackRenderer.java:82)	at org.eclipse.e4.ui.workbench.renderers.swt.LazyStackRenderer.postProcess(LazyStackRenderer.java:116)	at org.eclipse.e4.ui.workbench.renderers.swt.PerspectiveStackRenderer.postProcess(PerspectiveStackRenderer.java:64)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:677)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:763)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:728)	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:712)	at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:72)	at org.eclipse.e4.ui.workbench.renderers.swt.SashRenderer.processContents(SashRenderer.java:150)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:673)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:763)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:728)	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:712)	at org.eclipse.e4.ui.workbench.renderers.swt.SWTPartRenderer.processContents(SWTPartRenderer.java:72)	at org.eclipse.e4.ui.workbench.renderers.swt.WBWRenderer.processContents(WBWRenderer.java:658)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:673)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.safeCreateGui(PartRenderingEngine.java:763)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$2.run(PartRenderingEngine.java:728)	at org.eclipse.core.runtime.SafeRunner.run(SafeRunner.java:45)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.createGui(PartRenderingEngine.java:712)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine$5.run(PartRenderingEngine.java:1083)	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)	at org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine.run(PartRenderingEngine.java:1046)	at org.eclipse.e4.ui.internal.workbench.E4Workbench.createAndRunUI(E4Workbench.java:155)	at org.eclipse.ui.internal.Workbench.lambda$3(Workbench.java:643)	at org.eclipse.ui.internal.Workbench$$Lambda$271/0x00000001002b5360.run(Unknown Source)	at org.eclipse.core.databinding.observable.Realm.runWithDefault(Realm.java:338)	at org.eclipse.ui.internal.Workbench.createAndRunWorkbench(Workbench.java:550)	at org.eclipse.ui.PlatformUI.createAndRunWorkbench(PlatformUI.java:171)	at org.eclipse.ui.internal.ide.application.IDEApplication.start(IDEApplication.java:152)	at org.eclipse.equinox.internal.app.EclipseAppHandle.run(EclipseAppHandle.java:203)	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.runApplication(EclipseAppLauncher.java:136)	at org.eclipse.core.runtime.internal.adaptor.EclipseAppLauncher.start(EclipseAppLauncher.java:104)	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:402)	at org.eclipse.core.runtime.adaptor.EclipseStarter.run(EclipseStarter.java:255)	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(java.base@17.0.5/Native Method)	at jdk.internal.reflect.NativeMethodAccessorImpl.invoke(java.base@17.0.5/NativeMethodAccessorImpl.java:77)	at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(java.base@17.0.5/DelegatingMethodAccessorImpl.java:43)	at java.lang.reflect.Method.invoke(java.base@17.0.5/Method.java:568)	at org.eclipse.equinox.launcher.Main.invokeFramework(Main.java:659)	at org.eclipse.equinox.launcher.Main.basicRun(Main.java:596)	at org.eclipse.equinox.launcher.Main.run(Main.java:1467) 

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions