Community
Participate
Working Groups
R2.1 + patch 0.273 When patching IDE with latest JDT/Core, and restarting, it took minutes to restart my workbench, where it took seconds in the past. Activity stack dump: ct.java:109) at org.eclipse.jdt.core.JavaCore.newLibraryEntry(JavaCore.java:1875) at org.eclipse.jdt.core.JavaCore.getResolvedClasspathEntry(JavaCore.java :1399) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1368) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1321) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1293) at org.eclipse.jdt.internal.core.JavaProject.updateCycleParticipants(Jav aProject.java:2144) at org.eclipse.jdt.internal.core.JavaProject.updateCycleParticipants(Jav aProject.java:2158) at org.eclipse.jdt.internal.core.JavaProject.updateCycleParticipants(Jav aProject.java:2158) at org.eclipse.jdt.internal.core.JavaProject.updateCycleParticipants(Jav aProject.java:2158) at org.eclipse.jdt.internal.core.JavaProject.updateCycleParticipants(Jav aProject.java:2158) at org.eclipse.jdt.internal.core.JavaProject.updateAllCycleMarkers(JavaP roject.java:2102) at org.eclipse.jdt.internal.core.SetClasspathOperation.updateCycleMarker s(SetClasspathOperation.java:528) at org.eclipse.jdt.internal.core.SetClasspathOperation.updateClasspath(S etClasspathOperation.java:468) at org.eclipse.jdt.internal.core.SetClasspathOperation.executeOperation( SetClasspathOperation.java:212) at org.eclipse.jdt.internal.core.JavaModelOperation.execute(JavaModelOpe ration.java:305) at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperati on.java:513) at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1361 ) at org.eclipse.jdt.internal.core.JavaModelManager.runOperation(JavaModel Manager.java:1207) at org.eclipse.jdt.internal.core.JavaElement.runOperation(JavaElement.ja va:574) at org.eclipse.jdt.internal.core.JavaProject.setRawClasspath(JavaProject .java:2008) at org.eclipse.jdt.core.JavaCore.setClasspathContainer(JavaCore.java:225 5) at org.eclipse.jdt.internal.launching.JREContainerInitializer.initialize (JREContainerInitializer.java:59) at org.eclipse.jdt.core.JavaCore$1.run(JavaCore.java:753) at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatfo rm.java:839) at org.eclipse.core.runtime.Platform.run(Platform.java:413) at org.eclipse.jdt.core.JavaCore.getClasspathContainer(JavaCore.java:748 ) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1383) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1321) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1293) at org.eclipse.jdt.internal.core.JavaProject.updateCycleParticipants(Jav aProject.java:2144) at org.eclipse.jdt.internal.core.JavaProject.updateCycleParticipants(Jav aProject.java:2158) at org.eclipse.jdt.internal.core.JavaProject.updateAllCycleMarkers(JavaP roject.java:2102) at org.eclipse.jdt.internal.core.SetClasspathOperation.updateCycleMarker s(SetClasspathOperation.java:528) at org.eclipse.jdt.internal.core.SetClasspathOperation.updateClasspath(S etClasspathOperation.java:468) at org.eclipse.jdt.internal.core.SetClasspathOperation.executeOperation( SetClasspathOperation.java:212) at org.eclipse.jdt.internal.core.JavaModelOperation.execute(JavaModelOpe ration.java:305) at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperati on.java:513) at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1361 ) at org.eclipse.jdt.internal.core.JavaModelManager.runOperation(JavaModel Manager.java:1207) at org.eclipse.jdt.internal.core.JavaElement.runOperation(JavaElement.ja va:574) at org.eclipse.jdt.internal.core.JavaProject.setRawClasspath(JavaProject .java:2008) at org.eclipse.jdt.core.JavaCore.setClasspathContainer(JavaCore.java:225 5) at org.eclipse.jdt.internal.launching.JREContainerInitializer.initialize (JREContainerInitializer.java:59) at org.eclipse.jdt.core.JavaCore$1.run(JavaCore.java:753) at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatfo rm.java:839) at org.eclipse.core.runtime.Platform.run(Platform.java:413) at org.eclipse.jdt.core.JavaCore.getClasspathContainer(JavaCore.java:748 ) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1383) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1321) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1293) at org.eclipse.jdt.internal.core.JavaProject.updateCycleParticipants(Jav aProject.java:2144) at org.eclipse.jdt.internal.core.JavaProject.updateCycleParticipants(Jav aProject.java:2158) at org.eclipse.jdt.internal.core.JavaProject.updateCycleParticipants(Jav aProject.java:2158) at org.eclipse.jdt.internal.core.JavaProject.updateAllCycleMarkers(JavaP roject.java:2102) at org.eclipse.jdt.internal.core.SetClasspathOperation.updateCycleMarker s(SetClasspathOperation.java:528) at org.eclipse.jdt.internal.core.SetClasspathOperation.updateClasspath(S etClasspathOperation.java:468) at org.eclipse.jdt.internal.core.SetClasspathOperation.executeOperation( SetClasspathOperation.java:212) at org.eclipse.jdt.internal.core.JavaModelOperation.execute(JavaModelOpe ration.java:305) at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperati on.java:513) at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1361 ) at org.eclipse.jdt.internal.core.JavaModelManager.runOperation(JavaModel Manager.java:1207) at org.eclipse.jdt.internal.core.JavaElement.runOperation(JavaElement.ja va:574) at org.eclipse.jdt.internal.core.JavaProject.setRawClasspath(JavaProject .java:2008) at org.eclipse.jdt.core.JavaCore.setClasspathContainer(JavaCore.java:225 5) at org.eclipse.jdt.internal.launching.JREContainerInitializer.initialize (JREContainerInitializer.java:59) at org.eclipse.jdt.core.JavaCore$1.run(JavaCore.java:753) at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatfo rm.java:839) at org.eclipse.core.runtime.Platform.run(Platform.java:413) at org.eclipse.jdt.core.JavaCore.getClasspathContainer(JavaCore.java:748 ) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1383) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1321) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1293) at org.eclipse.jdt.internal.core.JavaProject.updateCycleParticipants(Jav aProject.java:2144) at org.eclipse.jdt.internal.core.JavaProject.updateCycleParticipants(Jav aProject.java:2158) at org.eclipse.jdt.internal.core.JavaProject.updateAllCycleMarkers(JavaP roject.java:2102) at org.eclipse.jdt.internal.core.SetClasspathOperation.updateCycleMarker s(SetClasspathOperation.java:528) at org.eclipse.jdt.internal.core.SetClasspathOperation.updateClasspath(S etClasspathOperation.java:468) at org.eclipse.jdt.internal.core.SetClasspathOperation.executeOperation( SetClasspathOperation.java:212) at org.eclipse.jdt.internal.core.JavaModelOperation.execute(JavaModelOpe ration.java:305) at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperati on.java:513) at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1361 ) at org.eclipse.jdt.internal.core.JavaModelManager.runOperation(JavaModel Manager.java:1207) at org.eclipse.jdt.internal.core.JavaElement.runOperation(JavaElement.ja va:574) at org.eclipse.jdt.internal.core.JavaProject.setRawClasspath(JavaProject .java:2008) at org.eclipse.jdt.core.JavaCore.setClasspathContainer(JavaCore.java:225 5) at org.eclipse.jdt.internal.launching.JREContainerInitializer.initialize (JREContainerInitializer.java:59) at org.eclipse.jdt.core.JavaCore$1.run(JavaCore.java:753) at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatfo rm.java:839) at org.eclipse.core.runtime.Platform.run(Platform.java:413) at org.eclipse.jdt.core.JavaCore.getClasspathContainer(JavaCore.java:748 ) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1383) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1321) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1293) at org.eclipse.jdt.internal.core.JavaProject.updateCycleParticipants(Jav aProject.java:2144) at org.eclipse.jdt.internal.core.JavaProject.updateAllCycleMarkers(JavaP roject.java:2102) at org.eclipse.jdt.internal.core.SetClasspathOperation.updateCycleMarker s(SetClasspathOperation.java:528) at org.eclipse.jdt.internal.core.SetClasspathOperation.updateClasspath(S etClasspathOperation.java:468) at org.eclipse.jdt.internal.core.SetClasspathOperation.executeOperation( SetClasspathOperation.java:212) at org.eclipse.jdt.internal.core.JavaModelOperation.execute(JavaModelOpe ration.java:305) at org.eclipse.jdt.internal.core.JavaModelOperation.run(JavaModelOperati on.java:513) at org.eclipse.core.internal.resources.Workspace.run(Workspace.java:1361 ) at org.eclipse.jdt.internal.core.JavaModelManager.runOperation(JavaModel Manager.java:1207) at org.eclipse.jdt.internal.core.JavaElement.runOperation(JavaElement.ja va:574) at org.eclipse.jdt.internal.core.JavaProject.setRawClasspath(JavaProject .java:2008) at org.eclipse.jdt.core.JavaCore.setClasspathContainer(JavaCore.java:225 5) at org.eclipse.jdt.internal.launching.JREContainerInitializer.initialize (JREContainerInitializer.java:59) at org.eclipse.jdt.core.JavaCore$1.run(JavaCore.java:753) at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatfo rm.java:839) at org.eclipse.core.runtime.Platform.run(Platform.java:413) at org.eclipse.jdt.core.JavaCore.getClasspathContainer(JavaCore.java:748 ) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1383) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1321) at org.eclipse.jdt.internal.core.JavaProject.getResolvedClasspath(JavaPr oject.java:1293) at org.eclipse.jdt.internal.core.PackageFragmentRoot.isOnClasspath(Packa geFragmentRoot.java:337) at org.eclipse.jdt.internal.core.PackageFragmentRoot.openWhenClosed(Pack ageFragmentRoot.java:352) at org.eclipse.jdt.internal.core.Openable.openParent(Openable.java:379) at org.eclipse.jdt.internal.core.Openable.openWhenClosed(Openable.java:3 95) at org.eclipse.jdt.internal.core.Openable.openParent(Openable.java:379) at org.eclipse.jdt.internal.core.CompilationUnit.openParent(CompilationU nit.java:780) at org.eclipse.jdt.internal.core.Openable.openWhenClosed(Openable.java:3 95) at org.eclipse.jdt.internal.core.Openable.open(Openable.java:356) at org.eclipse.jdt.internal.core.WorkingCopy.open(WorkingCopy.java:344) at org.eclipse.jdt.internal.core.CompilationUnit.getWorkingCopy(Compilat ionUnit.java:637) at org.eclipse.jdt.internal.core.CompilationUnit.getSharedWorkingCopy(Co mpilationUnit.java:609) at org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitDocumentProvide r.createElementInfo(CompilationUnitDocumentProvider.java:832) at org.eclipse.ui.texteditor.AbstractDocumentProvider.connect(AbstractDo cumentProvider.java:297) at org.eclipse.ui.texteditor.AbstractTextEditor.doSetInput(AbstractTextE ditor.java:1825) at org.eclipse.ui.texteditor.StatusTextEditor.doSetInput(StatusTextEdito r.java:172) at org.eclipse.jdt.internal.ui.javaeditor.JavaEditor.doSetInput(JavaEdit or.java:551) at org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor.doSetInp ut(CompilationUnitEditor.java:940) at org.eclipse.ui.texteditor.AbstractTextEditor.init(AbstractTextEditor. java:1426) at org.eclipse.ui.internal.EditorManager.createSite(EditorManager.java:5 56) at org.eclipse.ui.internal.EditorManager.openInternalEditor(EditorManage r.java:607) at org.eclipse.ui.internal.EditorManager.access$6(EditorManager.java:603 ) at org.eclipse.ui.internal.EditorManager$7.run(EditorManager.java:833) at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatfo rm.java:839) at org.eclipse.core.runtime.Platform.run(Platform.java:413) at org.eclipse.ui.internal.EditorManager.busyRestoreEditor(EditorManager .java:787) at org.eclipse.ui.internal.EditorManager$6.run(EditorManager.java:780) at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:66) at org.eclipse.ui.internal.EditorManager.restoreEditor(EditorManager.jav a:776) at org.eclipse.ui.internal.EditorManager.restoreState(EditorManager.java :693) at org.eclipse.ui.internal.WorkbenchPage.restoreState(WorkbenchPage.java :1902) at org.eclipse.ui.internal.WorkbenchWindow.restoreState(WorkbenchWindow. java:1063) at org.eclipse.ui.internal.Workbench.restoreState(Workbench.java:1158) at org.eclipse.ui.internal.Workbench.access$7(Workbench.java:1133) at org.eclipse.ui.internal.Workbench$6.run(Workbench.java:811) at org.eclipse.core.internal.runtime.InternalPlatform.run(InternalPlatfo rm.java:839) at org.eclipse.core.runtime.Platform.run(Platform.java:413) at org.eclipse.ui.internal.Workbench.openPreviousWorkbenchState(Workbenc h.java:763) at org.eclipse.ui.internal.Workbench.init(Workbench.java:577) at org.eclipse.ui.internal.Workbench.run(Workbench.java:1232) at org.eclipse.core.internal.boot.InternalBootLoader.run(InternalBootLoa der.java:775) at org.eclipse.core.boot.BootLoader.run(BootLoader.java:462) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl. java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAcces sorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:324) at org.eclipse.core.launcher.Main.basicRun(Main.java:247) at org.eclipse.core.launcher.Main.run(Main.java:703) at org.eclipse.core.launcher.Main.main(Main.java:539) "VM Thread" prio=5 tid=0x008DD7C8 nid=0x3d0 runnable "VM Periodic Task Thread" prio=10 tid=0x008F8A50 nid=0x448 waiting on condition "Suspend Checker Thread" prio=10 tid=0x00903008 nid=0x51c runnable
Wasn't able to reproduce. Need more evidence.
Got the same problem today. I took several snapshots of the threads activity and it seems that all the time is spent in getRawClasspath(). Isn't the problem that we don't cache the classpath if the project is not open?
This could indeed lead to more work than expected. Now it seems that multiple classpath containers are running inside each other, which I find suspicious (though if querying other project classpath for cycle detection, it will try to find project custom container values). Caching elsewhere would be a good approach (using PerProjectInfo).
Fixed by caching raw classpath and lastResolvedClasspath on the PerProjectInfo. Removed caching on the JavaProjectElementInfo.
Another thing to consider is that the SetClasspathOperation seems to be naive when it comes to performing a cycle check. It doesn't optimize the case where no project prereq has changed (when computing the delta, it knows this).
Alternative is also working great, combined with the operation batching. Still backporting the per-project-info fix into 2.1M1, since it proved to be improving the behavior significantly.
Verified
Backported to 2.0.2