This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.
Every class loaded by JVM brings some cost - time for its loading, space occupied in permanent generation area and some other minor costs. We already have so many classes that we had to increase size of PermGen to be able to accomodate them into JVM. Debugger module contains some classes that seems to abuse inheritance. The inner classes in org/netbeans/modules/debugger/ui/models/ColumnModels.java are an example of 21 quite similar inner classes.
Thanks for report, this will be discussed.
Where / when / with whom? Can I help?
This will be discussed on some debugger iTeam. Thanks we do not need any help.
Have you alread discussed it? The same applies to actions in org.netbeans.modules.debugger.ui.actions package.
Not yet - we have more important issues which affect stability...
The same for org.netbeans.modules.debugger.ui.views. No surprise that we ran out of PermGen space.
4 CompoundAnnotation classes.
Look at org.netbeans.modules.debugger.jpda.models also. For example ThisVariable vs. ObjectVariable.
This is just the design of the tree table view model. The various actions in org.netbeans.modules.debugger.ui.actions package - we could make just one class for them and add public static creation methods, that would be called from the module layer. Similar things would have to be done for the rest of the packages - but there is a problem with the registry of tree table view model components. The MetaInf lookup recognizes only public constructors. The loading mechanism would have to be enhanced somehow...
I've made some tests of ColumnModels.java to see what the improvement is. I've take ColumnModels as it is and created ColumnModelsNew with just two inner classes + 19 static methods which create the various instances. I've measured the memory consumption and load time: ColumnModels takes 236304 bytes and loading takes 17 ms. ColumnModelsNew takes 45048 bytes and loading takes 2 ms. Therefore with this change we save 15 ms and ~190 kB of memory. Similar results can be expected in org.netbeans.modules.debugger.ui.actions package. Making all requested changes I guess we can save about 0.5 MB of memory.
This would be really nice if we could yeild such benefit. Thanks. Can you mention your hardware? The classloading time seems to a bit long. BTW: I do not have hard numbers but can try later to check how the size of class files maps to occupied perm gen memory. I expect roughly 1:1 mapping.
Hardware: Intel(R) Pentium(R) M processor 1600MHz, 1GB RAM, Linux Fedora Core 1.
The inner classes in org/netbeans/modules/debugger/ui/models/ColumnModels.java replaced with an abstract impl, concrete objects are created via static methods: /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/models/ColumnModels.java,v <-- ColumnModels.java new revision: 1.8; previous revision: 1.7 /cvs/debuggercore/src/META-INF/debugger/BreakpointsView/org.netbeans.spi.viewmodel.ColumnModel,v <-- org.netbeans.spi.viewmodel.ColumnModel new revision: 1.4; previous revision: 1.3 /cvs/debuggercore/src/META-INF/debugger/CallStackView/org.netbeans.spi.viewmodel.ColumnModel,v <-- org.netbeans.spi.viewmodel.ColumnModel new revision: 1.4; previous revision: 1.3 /cvs/debuggercore/src/META-INF/debugger/LocalsView/org.netbeans.spi.viewmodel.ColumnModel,v <-- org.netbeans.spi.viewmodel.ColumnModel new revision: 1.4; previous revision: 1.3 /cvs/debuggercore/src/META-INF/debugger/SessionsView/org.netbeans.spi.viewmodel.ColumnModel,v <-- org.netbeans.spi.viewmodel.ColumnModel new revision: 1.4; previous revision: 1.3 /cvs/debuggercore/src/META-INF/debugger/ThreadsView/org.netbeans.spi.viewmodel.ColumnModel,v <-- org.netbeans.spi.viewmodel.ColumnModel new revision: 1.5; previous revision: 1.4 /cvs/debuggercore/src/META-INF/debugger/WatchesView/org.netbeans.spi.viewmodel.ColumnModel,v <-- org.netbeans.spi.viewmodel.ColumnModel new revision: 1.4; previous revision: 1.3
DebuggerAction has 13 trivial sub-classes. It's better to turn it into a factory methods: /cvs/debuggerjpda/ui/src/org/netbeans/modules/debugger/jpda/resources/mf-layer.xml,v <-- mf-layer.xml new revision: 1.29; previous revision: 1.28 Removing debuggercore/src/org/netbeans/modules/debugger/ui/actions/ContinueAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/ContinueAction.java,v <-- ContinueAction.java new revision: delete; previous revision: 1.6 Checking in debuggercore/src/org/netbeans/modules/debugger/ui/actions/DebuggerAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/DebuggerAction.java,v <-- DebuggerAction.java new revision: 1.10; previous revision: 1.9 Removing debuggercore/src/org/netbeans/modules/debugger/ui/actions/FixAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/FixAction.java,v <-- FixAction.java new revision: delete; previous revision: 1.7 done Removing debuggercore/src/org/netbeans/modules/debugger/ui/actions/KillAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/KillAction.java,v <-- KillAction.java new revision: delete; previous revision: 1.7 done Removing debuggercore/src/org/netbeans/modules/debugger/ui/actions/MakeCalleeCurrentAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/MakeCalleeCurrentAction.java,v <-- MakeCalleeCurrentAction.java new revision: delete; previous revision: 1.6 done Removing debuggercore/src/org/netbeans/modules/debugger/ui/actions/MakeCallerCurrentAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/MakeCallerCurrentAction.java,v <-- MakeCallerCurrentAction.java new revision: delete; previous revision: 1.6 done Removing debuggercore/src/org/netbeans/modules/debugger/ui/actions/PauseAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/PauseAction.java,v <-- PauseAction.java new revision: delete; previous revision: 1.6 done Removing debuggercore/src/org/netbeans/modules/debugger/ui/actions/PopTopmostCallAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/PopTopmostCallAction.java,v <-- PopTopmostCallAction.java new revision: delete; previous revision: 1.6 done Removing debuggercore/src/org/netbeans/modules/debugger/ui/actions/RunIntoMethodAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/RunIntoMethodAction.java,v <-- RunIntoMethodAction.java new revision: delete; previous revision: 1.5 done Removing debuggercore/src/org/netbeans/modules/debugger/ui/actions/RunToCursorAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/RunToCursorAction.java,v <-- RunToCursorAction.java new revision: delete; previous revision: 1.6 done Removing debuggercore/src/org/netbeans/modules/debugger/ui/actions/StepIntoAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/StepIntoAction.java,v <-- StepIntoAction.java new revision: delete; previous revision: 1.6 done Removing debuggercore/src/org/netbeans/modules/debugger/ui/actions/StepOutAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/StepOutAction.java,v <-- StepOutAction.java new revision: delete; previous revision: 1.6 done Removing debuggercore/src/org/netbeans/modules/debugger/ui/actions/StepOverAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/StepOverAction.java,v <-- StepOverAction.java new revision: delete; previous revision: 1.6 done Removing debuggercore/src/org/netbeans/modules/debugger/ui/actions/ToggleBreakpointAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/ToggleBreakpointAction.java,v <-- ToggleBreakpointAction.java new revision: delete; previous revision: 1.5
Remaining 6 view actions from the same package replaced with generic ViewActions, also the 6 view TopComponents replaced with one generic View TopComponent: Checking in src/org/netbeans/modules/debugger/resources/mf-layer.xml; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/mf-layer.xml,v <-- mf-layer.xml new revision: 1.71; previous revision: 1.70 done Checking in src/org/netbeans/modules/debugger/resources/components/breakpoints.settings; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/components/breakpoints.settings,v <-- breakpoints.settings new revision: 1.6; previous revision: 1.5 done Checking in src/org/netbeans/modules/debugger/resources/components/callstack.settings; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/components/callstack.settings,v <-- callstack.settings new revision: 1.6; previous revision: 1.5 done Checking in src/org/netbeans/modules/debugger/resources/components/locals.settings; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/components/locals.settings,v <-- locals.settings new revision: 1.5; previous revision: 1.4 done Checking in src/org/netbeans/modules/debugger/resources/components/sessions.settings; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/components/sessions.settings,v <-- sessions.settings new revision: 1.6; previous revision: 1.5 done Checking in src/org/netbeans/modules/debugger/resources/components/threads.settings; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/components/threads.settings,v <-- threads.settings new revision: 1.6; previous revision: 1.5 done Checking in src/org/netbeans/modules/debugger/resources/components/watches.settings; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/components/watches.settings,v <-- watches.settings new revision: 1.6; previous revision: 1.5 done Checking in src/org/netbeans/modules/debugger/resources/groups/debugger/breakpoints.wstcgrp; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/groups/debugger/breakpoints.wstcgrp,v <-- breakpoints.wstcgrp new revision: 1.6; previous revision: 1.5 done Checking in src/org/netbeans/modules/debugger/resources/groups/debugger/callstack.wstcgrp; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/groups/debugger/callstack.wstcgrp,v <-- callstack.wstcgrp new revision: 1.5; previous revision: 1.4 done Checking in src/org/netbeans/modules/debugger/resources/groups/debugger/locals.wstcgrp; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/groups/debugger/locals.wstcgrp,v <-- locals.wstcgrp new revision: 1.4; previous revision: 1.3 done Checking in src/org/netbeans/modules/debugger/resources/groups/debugger/sessions.wstcgrp; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/groups/debugger/sessions.wstcgrp,v <-- sessions.wstcgrp new revision: 1.6; previous revision: 1.5 done Checking in src/org/netbeans/modules/debugger/resources/groups/debugger/threads.wstcgrp; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/groups/debugger/threads.wstcgrp,v <-- threads.wstcgrp new revision: 1.6; previous revision: 1.5 done Checking in src/org/netbeans/modules/debugger/resources/groups/debugger/watches.wstcgrp; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/groups/debugger/watches.wstcgrp,v <-- watches.wstcgrp new revision: 1.5; previous revision: 1.4 done Checking in src/org/netbeans/modules/debugger/resources/modes/debugger.wsmode; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/modes/debugger.wsmode,v <-- debugger.wsmode new revision: 1.5; previous revision: 1.4 done Checking in src/org/netbeans/modules/debugger/resources/modes/debugger/breakpoints.wstcref; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/modes/debugger/breakpoints.wstcref,v <-- breakpoints.wstcref new revision: 1.3; previous revision: 1.2 done Checking in src/org/netbeans/modules/debugger/resources/modes/debugger/callstack.wstcref; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/modes/debugger/callstack.wstcref,v <-- callstack.wstcref new revision: 1.3; previous revision: 1.2 done Checking in src/org/netbeans/modules/debugger/resources/modes/debugger/locals.wstcref; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/modes/debugger/locals.wstcref,v <-- locals.wstcref new revision: 1.3; previous revision: 1.2 done Checking in src/org/netbeans/modules/debugger/resources/modes/debugger/sessions.wstcref; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/modes/debugger/sessions.wstcref,v <-- sessions.wstcref new revision: 1.3; previous revision: 1.2 done Checking in src/org/netbeans/modules/debugger/resources/modes/debugger/threads.wstcref; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/modes/debugger/threads.wstcref,v <-- threads.wstcref new revision: 1.3; previous revision: 1.2 done Checking in src/org/netbeans/modules/debugger/resources/modes/debugger/watches.wstcref; /cvs/debuggercore/src/org/netbeans/modules/debugger/resources/modes/debugger/watches.wstcref,v <-- watches.wstcref new revision: 1.3; previous revision: 1.2 done Checking in src/org/netbeans/modules/debugger/ui/actions/AddWatchAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/AddWatchAction.java,v <-- AddWatchAction.java new revision: 1.12; previous revision: 1.11 done Removing src/org/netbeans/modules/debugger/ui/actions/BreakpointsViewAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/BreakpointsViewAction.java,v <-- BreakpointsViewAction.java new revision: delete; previous revision: 1.4 done Removing src/org/netbeans/modules/debugger/ui/actions/CallStackViewAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/CallStackViewAction.java,v <-- CallStackViewAction.java new revision: delete; previous revision: 1.4 done Removing src/org/netbeans/modules/debugger/ui/actions/LocalsViewAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/LocalsViewAction.java,v <-- LocalsViewAction.java new revision: delete; previous revision: 1.4 done Removing src/org/netbeans/modules/debugger/ui/actions/SessionsViewAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/SessionsViewAction.java,v <-- SessionsViewAction.java new revision: delete; previous revision: 1.4 done Removing src/org/netbeans/modules/debugger/ui/actions/ThreadsViewAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/ThreadsViewAction.java,v <-- ThreadsViewAction.java new revision: delete; previous revision: 1.4 done RCS file: /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/ViewActions.java,v done Checking in src/org/netbeans/modules/debugger/ui/actions/ViewActions.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/ViewActions.java,v <-- ViewActions.java initial revision: 1.1 done Removing src/org/netbeans/modules/debugger/ui/actions/WatchesViewAction.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/actions/WatchesViewAction.java,v <-- WatchesViewAction.java new revision: delete; previous revision: 1.4 done Removing src/org/netbeans/modules/debugger/ui/views/BreakpointsView.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/views/BreakpointsView.java,v <-- BreakpointsView.java new revision: delete; previous revision: 1.10 done Removing src/org/netbeans/modules/debugger/ui/views/CallStackView.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/views/CallStackView.java,v <-- CallStackView.java new revision: delete; previous revision: 1.9 done Removing src/org/netbeans/modules/debugger/ui/views/LocalsView.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/views/LocalsView.java,v <-- LocalsView.java new revision: delete; previous revision: 1.9 done Removing src/org/netbeans/modules/debugger/ui/views/SessionsView.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/views/SessionsView.java,v <-- SessionsView.java new revision: delete; previous revision: 1.9 done Removing src/org/netbeans/modules/debugger/ui/views/ThreadsView.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/views/ThreadsView.java,v <-- ThreadsView.java new revision: delete; previous revision: 1.9 done RCS file: /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/views/View.java,v done Checking in src/org/netbeans/modules/debugger/ui/views/View.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/views/View.java,v <-- View.java initial revision: 1.1 done Removing src/org/netbeans/modules/debugger/ui/views/WatchesView.java; /cvs/debuggercore/src/org/netbeans/modules/debugger/ui/views/WatchesView.java,v <-- WatchesView.java new revision: delete; previous revision: 1.9 done
I've removed cca 43 classes. What do you mention in org.netbeans.modules.debugger.jpda.models is problematic, because it's important that ThisVariable implements This, etc. We can just remove only ObjectVariable, that does not add any value: /cvs/debuggerjpda/src/org/netbeans/modules/debugger/jpda/models/AbstractVariable.java,v <-- AbstractVariable.java new revision: 1.36; previous revision: 1.35 /cvs/debuggerjpda/src/org/netbeans/modules/debugger/jpda/models/LocalsTreeModel.java,v <-- LocalsTreeModel.java new revision: 1.34; previous revision: 1.33 Removing models/ObjectVariable.java; /cvs/debuggerjpda/src/org/netbeans/modules/debugger/jpda/models/ObjectVariable.java,v <-- ObjectVariable.java new revision: delete; previous revision: 1.3 done The rest of variable classes are package-private: Checking in models/FieldVariable.java; /cvs/debuggerjpda/src/org/netbeans/modules/debugger/jpda/models/FieldVariable.java,v <-- FieldVariable.java new revision: 1.7; previous revision: 1.6 done Checking in models/JPDAObjectWatchImpl.java; /cvs/debuggerjpda/src/org/netbeans/modules/debugger/jpda/models/JPDAObjectWatchImpl.java,v <-- JPDAObjectWatchImpl.java new revision: 1.8; previous revision: 1.7 done Checking in models/JPDAWatchImpl.java; /cvs/debuggerjpda/src/org/netbeans/modules/debugger/jpda/models/JPDAWatchImpl.java,v <-- JPDAWatchImpl.java new revision: 1.9; previous revision: 1.8 done Checking in models/Local.java; /cvs/debuggerjpda/src/org/netbeans/modules/debugger/jpda/models/Local.java,v <-- Local.java new revision: 1.8; previous revision: 1.7 done Checking in models/ObjectFieldVariable.java; /cvs/debuggerjpda/src/org/netbeans/modules/debugger/jpda/models/ObjectFieldVariable.java,v <-- ObjectFieldVariable.java new revision: 1.6; previous revision: 1.5 done Checking in models/ObjectLocalVariable.java; /cvs/debuggerjpda/src/org/netbeans/modules/debugger/jpda/models/ObjectLocalVariable.java,v <-- ObjectLocalVariable.java new revision: 1.7; previous revision: 1.6 done Checking in models/SuperVariable.java; /cvs/debuggerjpda/src/org/netbeans/modules/debugger/jpda/models/SuperVariable.java,v <-- SuperVariable.java new revision: 1.7; previous revision: 1.6 done Checking in models/ThisVariable.java; /cvs/debuggerjpda/src/org/netbeans/modules/debugger/jpda/models/ThisVariable.java,v <-- ThisVariable.java new revision: 1.4; previous revision: 1.3 done
Verified ... and Closing all issues resolved into NetBeans 6.7 and earlier.