https://dev.eiffel.com/index.php?title=User_Interface_Memory_Managment&feed=atom&action=historyUser Interface Memory Managment - Revision history2024-03-28T10:45:20ZRevision history for this page on the wikiMediaWiki 1.24.1https://dev.eiffel.com/index.php?title=User_Interface_Memory_Managment&diff=9934&oldid=prevPaulb at 18:16, 31 October 20072007-10-31T18:16:41Z<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Older revision</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Revision as of 18:16, 31 October 2007</td>
</tr><tr><td colspan="2" class="diff-lineno">Line 29:</td>
<td colspan="2" class="diff-lineno">Line 29:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Agents are probably the number one cause of memory leaks inside EiffelStudio as they could be contained in a live object but references a recycled one. As the agent references a recycled object the GC retains the recycled object because there is still an active reference to it.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Agents are probably the number one cause of memory leaks inside EiffelStudio as they could be contained in a live object but references a recycled one. As the agent references a recycled object the GC retains the recycled object because there is still an active reference to it.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>[https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e EB_RECYCLABLE] provides operations to facilitate here also. There are two routines to use when extending a sequence of actions and have the action automatically removed when the functioning object is recycled; <code>register_action</code> and <code>register_kamikaze_action</code>. <code>register_action</code> simply takes an [<del class="diffchange diffchange-inline">http</del>://<del class="diffchange diffchange-inline">freeelks.</del>svn.<del class="diffchange diffchange-inline">sourceforge</del>.<del class="diffchange diffchange-inline">net</del>/<del class="diffchange diffchange-inline">viewvc/freeelks</del>/trunk/library/<del class="diffchange diffchange-inline">kernel</del>/action_sequence.e<del class="diffchange diffchange-inline">?view=markup </del>ACTION_SEQUENCE] and an action. It does the necessary extension to the action sequence and will prune the action when the object in which <code>register_action</code> was class is recycled. <code>register_kamikaze_action</code> performs in the same way as <code>register_action</code> does except that it extends the action sequence with the action to be called only once. Generally kamikaze actions are removed from the action sequence when the actions are called. However it is possible that the action sequence is never executed, after the kamikaze action has been added, so the action never pruned from the list of callees. This too can cause a memory leaks.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>[https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e EB_RECYCLABLE] provides operations to facilitate here also. There are two routines to use when extending a sequence of actions and have the action automatically removed when the functioning object is recycled; <code>register_action</code> and <code>register_kamikaze_action</code>. <code>register_action</code> simply takes an [<ins class="diffchange diffchange-inline">https</ins>://svn.<ins class="diffchange diffchange-inline">eiffel</ins>.<ins class="diffchange diffchange-inline">com</ins>/<ins class="diffchange diffchange-inline">eiffelstudio</ins>/trunk<ins class="diffchange diffchange-inline">/Src</ins>/library/<ins class="diffchange diffchange-inline">base/ise/event</ins>/action_sequence.e ACTION_SEQUENCE] and an action. It does the necessary extension to the action sequence and will prune the action when the object in which <code>register_action</code> was class is recycled. <code>register_kamikaze_action</code> performs in the same way as <code>register_action</code> does except that it extends the action sequence with the action to be called only once. Generally kamikaze actions are removed from the action sequence when the actions are called. However it is possible that the action sequence is never executed, after the kamikaze action has been added, so the action never pruned from the list of callees. This too can cause a memory leaks.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>{{Warning|<code>register_action</code> and <code>register_kamikaze_action</code> come in a basic, generic use form so they can be used with any action sequence. This does removed the static compile time analysis so be careful when using an agent with an action sequence that the open arguments match. Failure to do so will result in a segmentation violation at runtime.}}</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>{{Warning|<code>register_action</code> and <code>register_kamikaze_action</code> come in a basic, generic use form so they can be used with any action sequence. This does removed the static compile time analysis so be careful when using an agent with an action sequence that the open arguments match. Failure to do so will result in a segmentation violation at runtime.}}</div></td></tr>
</table>Paulbhttps://dev.eiffel.com/index.php?title=User_Interface_Memory_Managment&diff=9933&oldid=prevPaulb at 18:15, 31 October 20072007-10-31T18:15:11Z<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Older revision</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Revision as of 18:15, 31 October 2007</td>
</tr><tr><td colspan="2" class="diff-lineno">Line 36:</td>
<td colspan="2" class="diff-lineno">Line 36:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>[https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e EB_RECYCLABLE] is not a special class or is anyway known by the Eiffel compiler. That means unless <code>recycle</code> is called on an object implementing [https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e EB_RECYCLABLE], it wont be recycled. For the time being [https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e EB_RECYCLABLE] does not implement [http://freeelks.svn.sourceforge.net/viewvc/freeelks/trunk/library/kernel/disposable.e?view=markup DISPOSABLE] so the GC will be of no help.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>[https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e EB_RECYCLABLE] is not a special class or is anyway known by the Eiffel compiler. That means unless <code>recycle</code> is called on an object implementing [https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e EB_RECYCLABLE], it wont be recycled. For the time being [https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e EB_RECYCLABLE] does not implement [http://freeelks.svn.sourceforge.net/viewvc/freeelks/trunk/library/kernel/disposable.e?view=markup DISPOSABLE] so the GC will be of no help.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>The tool foundation implementation is [[EiffelStudio Foundations]] ([https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/graphical/foundations/tools/es_tool.e ES_TOOL] and [https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/graphical/foundations/tools/<del class="diffchange diffchange-inline">es_tool_panel</del>.e <del class="diffchange diffchange-inline">ES_TOOL_PANEL</del>]) implement [https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e EB_RECYCLABLE] and are automatically recycled when and as needed. However, this is one of the few cases. For example, the dialog foundation implementation in [[EiffelStudio Foundations]] ([<del class="diffchange diffchange-inline">[</del>ES_DIALOG<del class="diffchange diffchange-inline">]</del>]) '''does not''' call <code>recycle</code> automatically when close as a dialog may be reused. In that respect a dialog object should explicitly call <code>recycle</code> when no longer needed or to be automatically recycled by calling <code>auto_recycle</code>.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>The tool foundation implementation is [[EiffelStudio Foundations]] ([https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/graphical/foundations/tools/es_tool.e ES_TOOL] and [https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/graphical/foundations/tools/<ins class="diffchange diffchange-inline">es_dockable_tool_panel</ins>.e <ins class="diffchange diffchange-inline">ES_DOCKABLE_TOOL_PANEL</ins>]) implement [https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e EB_RECYCLABLE] and are automatically recycled when and as needed. However, this is one of the few cases. For example, the dialog foundation implementation in [[EiffelStudio Foundations]] ([<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/graphical/foundations/dialogs/es_dialog.e </ins>ES_DIALOG]) '''does not''' call <code>recycle</code> automatically when close as a dialog may be reused. In that respect a dialog object should explicitly call <code>recycle</code> when no longer needed or to be automatically recycled by calling <code>auto_recycle</code>.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>== Detecting Memory Leaks ==</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>== Detecting Memory Leaks ==</div></td></tr>
</table>Paulbhttps://dev.eiffel.com/index.php?title=User_Interface_Memory_Managment&diff=9932&oldid=prevPaulb at 18:13, 31 October 20072007-10-31T18:13:39Z<p></p>
<a href="https://dev.eiffel.com/index.php?title=User_Interface_Memory_Managment&diff=9932&oldid=9931">Show changes</a>Paulbhttps://dev.eiffel.com/index.php?title=User_Interface_Memory_Managment&diff=9931&oldid=prevPaulb at 18:04, 31 October 20072007-10-31T18:04:32Z<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Older revision</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Revision as of 18:04, 31 October 2007</td>
</tr><tr><td colspan="2" class="diff-lineno">Line 5:</td>
<td colspan="2" class="diff-lineno">Line 5:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>== Recycling ==</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>== Recycling ==</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Many UI classes inside [[EiffelStudio]] inherit a class [[EB_RECYCLABLE]]. It's purpose is to clean up resources and code links to other objects that may causes a memory leaks. As the old adage goes: "Prevention is always better than cure"</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Many UI classes inside [[EiffelStudio]] inherit a class [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]]. It's purpose is to clean up resources and code links to other objects that may causes a memory leaks. As the old adage goes: "Prevention is always better than cure"</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>== Using EB_RECYCLABLE ==</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>== Using EB_RECYCLABLE ==</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>To use [[EB_RECYCLABLE]] one has to simply inherit it and implement the deferred routine <code>internal_recycle</code> where you should explicitly recycle and object on the Current class instance that are no longer required, prune agents added to action sequences and generally unset entities of auxiliary objects to prevent memory leaks.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>To use [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]] one has to simply inherit it and implement the deferred routine <code>internal_recycle</code> where you should explicitly recycle and object on the Current class instance that are no longer required, prune agents added to action sequences and generally unset entities of auxiliary objects to prevent memory leaks.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>It's not recommended to detach class attributes in <code>internal_recycle</code> unless necessary because of the auto-recycling capabilities of [[EB_RECYCLABLE]]. Instead redefine <code>internal_detach_entities</code> to perform explicit detachment.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>It's not recommended to detach class attributes in <code>internal_recycle</code> unless necessary because of the auto-recycling capabilities of [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]]. Instead redefine <code>internal_detach_entities</code> to perform explicit detachment.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>{{Note|Much of the EiffelStudio code base includes detachment of entities in internal_recycle because the auto-recycle functionality was performed by [[<del class="diffchange diffchange-inline">ES_RECYCLER</del>]] in the [[6.0]] release. [[<del class="diffchange diffchange-inline">ES_RECYCLER</del>]] is deprecated and should not be use.}}</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>{{Note|Much of the EiffelStudio code base includes detachment of entities in internal_recycle because the auto-recycle functionality was performed by [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recycler.e|EB_RECYCLER</ins>]] in the [[<ins class="diffchange diffchange-inline">http://eiffelsoftware.origo.ethz.ch/index.php/EiffelStudio_Releases|</ins>6.0]] release. [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recycler.e|EB_RECYCLER</ins>]] is deprecated and should not be use.}}</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Automatic Recycling ===</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Automatic Recycling ===</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>The whole process of explict recycling in <code>internal_recycle</code> is fraught with potential bug scenarios. Forgetting or being unaware that a created object is in fact a recyclable object can cause a leak. This is where automatic recycling comes in.  </div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>The whole process of explict recycling in <code>internal_recycle</code> is fraught with potential bug scenarios. Forgetting or being unaware that a created object is in fact a recyclable object can cause a leak. This is where automatic recycling comes in.  </div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>The automatic recycling capabilities of [[EB_RECYCLABLE]] does not care if an object is actually "recyclable" as it may not be statically but could be dynamically. In addition an object may have started out non-recyclable but was changed somewhere down the line to implement [[EB_RECYCLABLE]]. In that respect objects created in a class implementing [[EB_RECYCLABLE]] and should be cleaned up when the container object is recycled should use the automatic recycling facilities.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>The automatic recycling capabilities of [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]] does not care if an object is actually "recyclable" as it may not be statically but could be dynamically. In addition an object may have started out non-recyclable but was changed somewhere down the line to implement [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]]. In that respect objects created in a class implementing [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]] and should be cleaned up when the container object is recycled should use the automatic recycling facilities.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Automatic Recycle and Destroy ===</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Automatic Recycle and Destroy ===</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>[[EB_RECYCLABLE]] provides two routines for descending classes to use; <code>auto_recycle</code> and <code>delayed_auto_recycle</code>. <code>auto_recycle</code> simply accepts an object of type [[ANY]] and if that object implements [[EB_RECYCLABLE]], it will be recycled when the container object is. <code>delayed_auto_recycle</code> works a little different in that it takes an agent. The agent is used to "fetch" the recyclable object at recycle-time. This is useful when objects are dynamically or lazily created, there is uncertainly about the attached state of an entity of an object or if a object's attribute is constantly changing.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>[[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]] provides two routines for descending classes to use; <code>auto_recycle</code> and <code>delayed_auto_recycle</code>. <code>auto_recycle</code> simply accepts an object of type [[ANY]] and if that object implements [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]], it will be recycled when the container object is. <code>delayed_auto_recycle</code> works a little different in that it takes an agent. The agent is used to "fetch" the recyclable object at recycle-time. This is useful when objects are dynamically or lazily created, there is uncertainly about the attached state of an entity of an object or if a object's attribute is constantly changing.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>{{Note|Automatic recycling does not detach the object which was automatically recycled. If an object must detached to prevent memory leaks then a container object should define <code>internal_detach_entities</code>.}}</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>{{Note|Automatic recycling does not detach the object which was automatically recycled. If an object must detached to prevent memory leaks then a container object should define <code>internal_detach_entities</code>.}}</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>[[EB_RECYCLABLE]] recycling has another assisting function, it will automatically destroy [[EiffelVision2]] objects implementing [[EB_RECYCLABLE]]. <code>destroy</code> will only be called for the implementing [[EB_RECYCLABLE]] [[EiffelVision2]] object and not any of it's attributes, unless they are automatically recycled and implement [[EB_RECYCLABLE]] also.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>[[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]] recycling has another assisting function, it will automatically destroy [[EiffelVision2]] objects implementing [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]]. <code>destroy</code> will only be called for the implementing [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]] [[EiffelVision2]] object and not any of it's attributes, unless they are automatically recycled and implement [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]] also.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Automatic Agent Removal ===</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Automatic Agent Removal ===</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Agents are probably the number one cause of memory leaks inside EiffelStudio as they could be contained in a live object but references a recycled one. As the agent references a recycled object the GC retains the recycled object because there is still an active reference to it.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>Agents are probably the number one cause of memory leaks inside EiffelStudio as they could be contained in a live object but references a recycled one. As the agent references a recycled object the GC retains the recycled object because there is still an active reference to it.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>[[EB_RECYCLABLE]] provides operations to facilitate here also. There are two routines to use when extending a sequence of actions and have the action automatically removed when the functioning object is recycled; <code>register_action</code> and <code>register_kamikaze_action</code>. <code>register_action</code> simply takes an [[ACTION_SEQUENCE]] and an action. It does the necessary extension to the action sequence and will prune the action when the object in which <code>register_action</code> was class is recycled. <code>register_kamikaze_action</code> performs in the same way as <code>register_action</code> does except that it extends the action sequence with the action to be called only once. Generally kamikaze actions are removed from the action sequence when the actions are called. However it is possible that the action sequence is never executed, after the kamikaze action has been added, so the action never pruned from the list of callees. This too can cause a memory leaks.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>[[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]] provides operations to facilitate here also. There are two routines to use when extending a sequence of actions and have the action automatically removed when the functioning object is recycled; <code>register_action</code> and <code>register_kamikaze_action</code>. <code>register_action</code> simply takes an [[ACTION_SEQUENCE]] and an action. It does the necessary extension to the action sequence and will prune the action when the object in which <code>register_action</code> was class is recycled. <code>register_kamikaze_action</code> performs in the same way as <code>register_action</code> does except that it extends the action sequence with the action to be called only once. Generally kamikaze actions are removed from the action sequence when the actions are called. However it is possible that the action sequence is never executed, after the kamikaze action has been added, so the action never pruned from the list of callees. This too can cause a memory leaks.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>{{Warning|<code>register_action</code> and <code>register_kamikaze_action</code> come in a basic, generic use form so they can be used with any action sequence. This does removed the static compile time analysis so be careful when using an agent with an action sequence that the open arguments match. Failure to do so will result in a segmentation violation at runtime.}}</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>{{Warning|<code>register_action</code> and <code>register_kamikaze_action</code> come in a basic, generic use form so they can be used with any action sequence. This does removed the static compile time analysis so be careful when using an agent with an action sequence that the open arguments match. Failure to do so will result in a segmentation violation at runtime.}}</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== No Magic Here ===</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== No Magic Here ===</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>[[EB_RECYCLABLE]] is not a special class or is anyway known by the Eiffel compiler. That means unless <code>recycle</code> is called on an object implementing [[EB_RECYCLABLE]], it wont be recycled. For the time being [[EB_RECYCLABLE]] does not implement [[DISPOSABLE]] so the GC will be of no help.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>[[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]] is not a special class or is anyway known by the Eiffel compiler. That means unless <code>recycle</code> is called on an object implementing [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]], it wont be recycled. For the time being [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]] does not implement [[<ins class="diffchange diffchange-inline">http://freeelks.svn.sourceforge.net/viewvc/freeelks/trunk/library/kernel/disposable.e?view=markup|</ins>DISPOSABLE]] so the GC will be of no help.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>The tool foundation implementation is [[EiffelStudio Foundations]] ([[ES_TOOL and ES_TOOL_PANEL]]) implement [[EB_RECYCLABLE]] and are automatically recycled when and as needed. However, this is one of the few cases. For example, the dialog foundation implementation in [[EiffelStudio Foundations]] ([[ES_DIALOG]]) '''does not''' call <code>recycle</code> automatically when close as a dialog may be reused. In that respect a dialog object should explicitly call <code>recycle</code> when no longer needed or to be automatically recycled by calling <code>auto_recycle</code>.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>The tool foundation implementation is [[EiffelStudio Foundations]] ([[ES_TOOL and ES_TOOL_PANEL]]) implement [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]] and are automatically recycled when and as needed. However, this is one of the few cases. For example, the dialog foundation implementation in [[EiffelStudio Foundations]] ([[ES_DIALOG]]) '''does not''' call <code>recycle</code> automatically when close as a dialog may be reused. In that respect a dialog object should explicitly call <code>recycle</code> when no longer needed or to be automatically recycled by calling <code>auto_recycle</code>.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>== Detecting Memory Leaks ==</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>== Detecting Memory Leaks ==</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Line 75:</td>
<td colspan="2" class="diff-lineno">Line 75:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Locating Memory Leaks ===</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Locating Memory Leaks ===</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>After you have found a memory leak, it is time to drill down and find out where the leak is occurring. The Memory Tool has implicit knowledge of [[EB_RECYCLABLE]] and displays an object's recycled state. In the example image shown in the previous section <code>EB_DEVELOPMENT_WINDOW_AGENT</code> has two live instances in the object map. The first has not been recycled as it is in use by the first opened window. The second instance however has been recycled, and even so still leaves two references preventing the [[Garbage Collector|garbage collector]] from reclaiming the object.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>After you have found a memory leak, it is time to drill down and find out where the leak is occurring. The Memory Tool has implicit knowledge of [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]] and displays an object's recycled state. In the example image shown in the previous section <code>EB_DEVELOPMENT_WINDOW_AGENT</code> has two live instances in the object map. The first has not been recycled as it is in use by the first opened window. The second instance however has been recycled, and even so still leaves two references preventing the [[Garbage Collector|garbage collector]] from reclaiming the object.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>The problem lies in either or both of the <code>TUPLE [EB_DEVELOPMENT_WINDOW_AGENTS]</code> referrer instances. Expanding the referrer objects reveals their referrer objects and so on.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>The problem lies in either or both of the <code>TUPLE [EB_DEVELOPMENT_WINDOW_AGENTS]</code> referrer instances. Expanding the referrer objects reveals their referrer objects and so on.</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Line 90:</td>
<td colspan="2" class="diff-lineno">Line 90:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* In the debugger add a breakpoint on the first line of <code>ES_MEMORY_TOOL_PANEL.on_row_expanded</code>.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* In the debugger add a breakpoint on the first line of <code>ES_MEMORY_TOOL_PANEL.on_row_expanded</code>.</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>* Now in the debugged version of [[EiffelStudio]] collapse the row (if it's not already) displaying the object of a [[PROCEDURE]], [[FUNCTION]] or [[PREDICATE]] type and then expanded it again.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* Now in the debugged version of [[EiffelStudio]] collapse the row (if it's not already) displaying the object of a [[<ins class="diffchange diffchange-inline">http://freeelks.svn.sourceforge.net/viewvc/freeelks/trunk/library/kernel/procedure.e?view=markup|</ins>PROCEDURE]], [[<ins class="diffchange diffchange-inline">http://freeelks.svn.sourceforge.net/viewvc/freeelks/trunk/library/kernel/function.e?view=markup|</ins>FUNCTION]] or [[<ins class="diffchange diffchange-inline">http://freeelks.svn.sourceforge.net/viewvc/freeelks/trunk/library/kernel/predicate.e?view=markup|</ins>PREDICATE]] type and then expanded it again.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>The debugger will now be broken into at the place breakpoint.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>The debugger will now be broken into at the place breakpoint.</div></td></tr>
<tr><td colspan="2" class="diff-lineno">Line 96:</td>
<td colspan="2" class="diff-lineno">Line 96:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* In a debugger '''Watch Tool''' add the expression <code>a_row.data</code>.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* In a debugger '''Watch Tool''' add the expression <code>a_row.data</code>.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Expand the expression result and the debugger shows the name of the agent, which you can navigate to using pick and drop or the context menu.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Expand the expression result and the debugger shows the name of the agent, which you can navigate to using pick and drop or the context menu.</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>* Examine the callers of the agent and locate the area where it's added to an action sequence, or set on an object, and be sure to prune it from the action sequence or unset it in the object's <code>EB_RECYCLABLE.internal_recycle</code>. Alternatively you can use the [[User_Interface_Memory_Managment#Automatic Recycling|automatic recycling]] facilities of [[EB_RECYCLABLE]] to register the agent.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* Examine the callers of the agent and locate the area where it's added to an action sequence, or set on an object, and be sure to prune it from the action sequence or unset it in the object's <code>EB_RECYCLABLE.internal_recycle</code>. Alternatively you can use the [[User_Interface_Memory_Managment#Automatic Recycling|automatic recycling]] facilities of [[<ins class="diffchange diffchange-inline">https://svn.eiffel.com/eiffelstudio/trunk/Src/Eiffel/interface/new_graphical/managers/eb_recyclable.e|</ins>EB_RECYCLABLE]] to register the agent.</div></td></tr>
</table>Paulbhttps://dev.eiffel.com/index.php?title=User_Interface_Memory_Managment&diff=9930&oldid=prevPaulb at 17:53, 31 October 20072007-10-31T17:53:10Z<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Older revision</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Revision as of 17:53, 31 October 2007</td>
</tr><tr><td colspan="2" class="diff-lineno">Line 33:</td>
<td colspan="2" class="diff-lineno">Line 33:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>{{Warning|<code>register_action</code> and <code>register_kamikaze_action</code> come in a basic, generic use form so they can be used with any action sequence. This does removed the static compile time analysis so be careful when using an agent with an action sequence that the open arguments match. Failure to do so will result in a segmentation violation at runtime.}}</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>{{Warning|<code>register_action</code> and <code>register_kamikaze_action</code> come in a basic, generic use form so they can be used with any action sequence. This does removed the static compile time analysis so be careful when using an agent with an action sequence that the open arguments match. Failure to do so will result in a segmentation violation at runtime.}}</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>== No Magic Here ==</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">=</ins>== No Magic Here <ins class="diffchange diffchange-inline">=</ins>==</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>[[EB_RECYCLABLE]] is not a special class or is anyway known by the Eiffel compiler. That means unless <code>recycle</code> is called on an object implementing [[EB_RECYCLABLE]], it wont be recycled. For the time being [[EB_RECYCLABLE]] does not implement [[DISPOSABLE]] so the GC will be of no help.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>[[EB_RECYCLABLE]] is not a special class or is anyway known by the Eiffel compiler. That means unless <code>recycle</code> is called on an object implementing [[EB_RECYCLABLE]], it wont be recycled. For the time being [[EB_RECYCLABLE]] does not implement [[DISPOSABLE]] so the GC will be of no help.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
</table>Paulbhttps://dev.eiffel.com/index.php?title=User_Interface_Memory_Managment&diff=9929&oldid=prevPaulb at 17:52, 31 October 20072007-10-31T17:52:44Z<p></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Older revision</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Revision as of 17:52, 31 October 2007</td>
</tr><tr><td colspan="2" class="diff-lineno">Line 1:</td>
<td colspan="2" class="diff-lineno">Line 1:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>[[Category:EiffelStudio]]</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>[[Category:EiffelStudio]]</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>[[Category:Extending_EiffelStudio]]</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>[[Category:Extending_EiffelStudio]]</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div><del class="diffchange diffchange-inline">{{UnderConstruction}}</del></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div> </div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>To be a good tool citizen inside EiffelStudio tools must properly handle resource manager above that provided by the Eiffel [[Garbage Collector|garbage collector]] (GC). When working with any UI aspects in [[EiffelStudio]] objects should be "recyclable".</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>To be a good tool citizen inside EiffelStudio tools must properly handle resource manager above that provided by the Eiffel [[Garbage Collector|garbage collector]] (GC). When working with any UI aspects in [[EiffelStudio]] objects should be "recyclable".</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
</table>Paulbhttps://dev.eiffel.com/index.php?title=User_Interface_Memory_Managment&diff=9928&oldid=prevPaulb: /* Locating Memory Leaks */2007-10-31T17:52:26Z<p><span dir="auto"><span class="autocomment">Locating Memory Leaks</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Older revision</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Revision as of 17:52, 31 October 2007</td>
</tr><tr><td colspan="2" class="diff-lineno">Line 74:</td>
<td colspan="2" class="diff-lineno">Line 74:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Enter a regular expression in the '''Type filter'''. For example, to show all EiffelStudio UI classes you would use: <code>^ES_|^EB_</code></div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Enter a regular expression in the '''Type filter'''. For example, to show all EiffelStudio UI classes you would use: <code>^ES_|^EB_</code></div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>== Locating Memory Leaks ==</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">=</ins>== Locating Memory Leaks <ins class="diffchange diffchange-inline">=</ins>==</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>After you have found a memory leak, it is time to drill down and find out where the leak is occurring. The Memory Tool has implicit knowledge of [[EB_RECYCLABLE]] and displays an object's recycled state. In the example image shown in the previous section <code>EB_DEVELOPMENT_WINDOW_AGENT</code> has two live instances in the object map. The first has not been recycled as it is in use by the first opened window. The second instance however has been recycled, and even so still leaves two references preventing the [[Garbage Collector|garbage collector]] from reclaiming the object.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>After you have found a memory leak, it is time to drill down and find out where the leak is occurring. The Memory Tool has implicit knowledge of [[EB_RECYCLABLE]] and displays an object's recycled state. In the example image shown in the previous section <code>EB_DEVELOPMENT_WINDOW_AGENT</code> has two live instances in the object map. The first has not been recycled as it is in use by the first opened window. The second instance however has been recycled, and even so still leaves two references preventing the [[Garbage Collector|garbage collector]] from reclaiming the object.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td colspan="2" class="diff-lineno">Line 85:</td>
<td colspan="2" class="diff-lineno">Line 85:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>This could be a nightmare to find but with the help of the debugger and a well placed breakpoint the agent routine can be located.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>This could be a nightmare to find but with the help of the debugger and a well placed breakpoint the agent routine can be located.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>=== Locating an Agent ===</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div><ins class="diffchange diffchange-inline">=</ins>=== Locating an Agent <ins class="diffchange diffchange-inline">=</ins>===</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>{{Note|In order to locate an agent leak you must be debugging EiffelStudio from a finalized version of EiffelStudio, performing the leak analysis on the debugged version of EiffelStudio.}}</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>{{Note|In order to locate an agent leak you must be debugging EiffelStudio from a finalized version of EiffelStudio, performing the leak analysis on the debugged version of EiffelStudio.}}</div></td></tr>
</table>Paulbhttps://dev.eiffel.com/index.php?title=User_Interface_Memory_Managment&diff=9927&oldid=prevPaulb: /* Locating an Agent */2007-10-31T17:52:02Z<p><span dir="auto"><span class="autocomment">Locating an Agent</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Older revision</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Revision as of 17:52, 31 October 2007</td>
</tr><tr><td colspan="2" class="diff-lineno">Line 96:</td>
<td colspan="2" class="diff-lineno">Line 96:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* In a debugger '''Watch Tool''' add the expression <code>a_row.data</code>.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* In a debugger '''Watch Tool''' add the expression <code>a_row.data</code>.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Expand the expression result and the debugger shows the name of the agent, which you can navigate to using pick and drop or the context menu.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Expand the expression result and the debugger shows the name of the agent, which you can navigate to using pick and drop or the context menu.</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>* Examine the callers of the agent and locate the area where it's added to an action sequence, or set on an object, and be sure to prune it from the<del class="diffchange diffchange-inline">. </del>sequence or unset it in the object's <code>EB_RECYCLABLE.internal_recycle</code></div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* Examine the callers of the agent and locate the area where it's added to an action sequence, or set on an object, and be sure to prune it from the <ins class="diffchange diffchange-inline">action </ins>sequence or unset it in the object's <code>EB_RECYCLABLE.internal_recycle</code><ins class="diffchange diffchange-inline">. Alternatively you can use the [[User_Interface_Memory_Managment#Automatic Recycling|automatic recycling]] facilities of [[EB_RECYCLABLE]] to register the agent.</ins></div></td></tr>
</table>Paulbhttps://dev.eiffel.com/index.php?title=User_Interface_Memory_Managment&diff=9926&oldid=prevPaulb: /* Locating an Agent */2007-10-31T17:49:19Z<p><span dir="auto"><span class="autocomment">Locating an Agent</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Older revision</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Revision as of 17:49, 31 October 2007</td>
</tr><tr><td colspan="2" class="diff-lineno">Line 92:</td>
<td colspan="2" class="diff-lineno">Line 92:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Now in the debugged version of [[EiffelStudio]] collapse the row (if it's not already) displaying the object of a [[PROCEDURE]], [[FUNCTION]] or [[PREDICATE]] type and then expanded it again.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Now in the debugged version of [[EiffelStudio]] collapse the row (if it's not already) displaying the object of a [[PROCEDURE]], [[FUNCTION]] or [[PREDICATE]] type and then expanded it again.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>The debugger will <del class="diffchange diffchange-inline">not </del>be broken into at the place breakpoint.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>The debugger will <ins class="diffchange diffchange-inline">now </ins>be broken into at the place breakpoint.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* In a debugger '''Watch Tool''' add the expression <code>a_row.data</code>.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* In a debugger '''Watch Tool''' add the expression <code>a_row.data</code>.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Expand the expression result and the debugger shows the name of the agent, which you can navigate to using pick and drop or the context menu.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Expand the expression result and the debugger shows the name of the agent, which you can navigate to using pick and drop or the context menu.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Examine the callers of the agent and locate the area where it's added to an action sequence, or set on an object, and be sure to prune it from the. sequence or unset it in the object's <code>EB_RECYCLABLE.internal_recycle</code></div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Examine the callers of the agent and locate the area where it's added to an action sequence, or set on an object, and be sure to prune it from the. sequence or unset it in the object's <code>EB_RECYCLABLE.internal_recycle</code></div></td></tr>
</table>Paulbhttps://dev.eiffel.com/index.php?title=User_Interface_Memory_Managment&diff=9925&oldid=prevPaulb: /* Detecting Memory Leaks */2007-10-31T17:47:05Z<p><span dir="auto"><span class="autocomment">Detecting Memory Leaks</span></span></p>
<table class='diff diff-contentalign-left'>
<col class='diff-marker' />
<col class='diff-content' />
<col class='diff-marker' />
<col class='diff-content' />
<tr style='vertical-align: top;'>
<td colspan='2' style="background-color: white; color:black; text-align: center;">← Older revision</td>
<td colspan='2' style="background-color: white; color:black; text-align: center;">Revision as of 17:47, 31 October 2007</td>
</tr><tr><td colspan="2" class="diff-lineno">Line 41:</td>
<td colspan="2" class="diff-lineno">Line 41:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>[[EiffelStudio]] has an in-built debug tool call the '''Memory Tool'''. It can be used to provide statistics on the current number of objects alive in [[EiffelStudio]] as well and show the difference between two queried sessions.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>[[EiffelStudio]] has an in-built debug tool call the '''Memory Tool'''. It can be used to provide statistics on the current number of objects alive in [[EiffelStudio]] as well and show the difference between two queried sessions.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>The tool is to be used on the debugged version of EiffelStudio as it is a debug tool and not a debugging tool. To be a little cleared the tool shows the live view on the running process and not associated with the debugger.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>The tool is to be used on the debugged version of EiffelStudio as it is a debug tool and not a debugging tool. To be a little cleared the tool shows the live view on the running process and <ins class="diffchange diffchange-inline">is </ins>not associated with the debugger.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Showing the Memory Tool ===</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Showing the Memory Tool ===</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>There are two ways to access the Memory Tool:</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>There are two ways to access the Memory Tool:</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Press {{key|CTRL}}+{{key|ALT}}+{{key|D}} to show the "debug" menu, which is shown as the [[EiffelStudio]] build number at the end of the main menu strip. From there you can select '''Show Memory Tool'''</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Press {{key|CTRL}}+{{key|ALT}}+{{key|D}} to show the "debug" menu, which is shown as the [[EiffelStudio]] build number at the end of the main menu strip. From there you can select '''Show Memory Tool'''</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>* If you have a project loaded hold {{key|CTRL}} and <del class="diffchange diffchange-inline">left mouse </del>click the ''Project Settings'' tool bar button.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* If you have a project loaded<ins class="diffchange diffchange-inline">, </ins>hold {{key|CTRL}} and click the ''Project Settings'' tool bar button.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Catching Leaks ===</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>=== Catching Leaks ===</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>In order to catch memory leaks you need to play spot the difference. Thankfully the tool does this for you between two snapshots of the live object map.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>In order to catch memory leaks you need to play <ins class="diffchange diffchange-inline">the game of </ins>spot the difference. Thankfully the tool does this for you between two <ins class="diffchange diffchange-inline">selected </ins>snapshots of the <ins class="diffchange diffchange-inline">process' </ins>live object map.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Here is the process of beginning to detect a memory leak. It will display <del class="diffchange diffchange-inline">the </del>delta of objects added and not removed between two snapshots:</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Here is the process of beginning to detect a memory leak. It will display <ins class="diffchange diffchange-inline">a </ins>delta <ins class="diffchange diffchange-inline">representing the number </ins>of objects added and not removed between two <ins class="diffchange diffchange-inline">taken </ins>snapshots:</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>* Once [[EiffelStudio]] is shown, <del class="diffchange diffchange-inline">display </del>the Memory Tool.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* Once <ins class="diffchange diffchange-inline">the debugged </ins>[[EiffelStudio]] is shown, <ins class="diffchange diffchange-inline">open </ins>the Memory Tool.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Click the '''Refresh''' button to display an initial view of the live object map running in that version of [[EiffelStudio]].</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Click the '''Refresh''' button to display an initial view of the live object map running in that version of [[EiffelStudio]].</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td colspan="2" class="diff-lineno">Line 62:</td>
<td colspan="2" class="diff-lineno">Line 62:</td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Now open a new window either using the '''File''' | '''New Window''' menu item or pressing {{key|CTRL}}+{{key|N}}.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Now open a new window either using the '''File''' | '''New Window''' menu item or pressing {{key|CTRL}}+{{key|N}}.</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>* Once opened show your tool or perform any interaction that instantiates classes you have integrated into [[EiffelStudio]].</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* Once opened<ins class="diffchange diffchange-inline">, </ins>show your tool or perform any interaction that instantiates classes you have integrated into [[EiffelStudio]].</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Now close the new window and return back to the initial window with the Memory Tool.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Now close the new window and return back to the initial window with the Memory Tool.</div></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>* Click '''Refresh''' on the <del class="diffchange diffchange-inline">tool </del>again. This will recalculate the live object map and display a delta result showing the number of new objects in memory.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>* Click '''Refresh''' on the <ins class="diffchange diffchange-inline">Memory Tool </ins>again. This will recalculate the live object map and display a delta result showing the number of new objects in memory.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>Here there is a leak<del class="diffchange diffchange-inline">. </del>The delta is ''1'', where as it should be 0. This means that opening and closing a new window has leaked <del class="diffchange diffchange-inline">an </del>instance of <code>EB_DEVELOPMENT_WINDOW_AGENTS</code>.</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>Here there is a leak<ins class="diffchange diffchange-inline">! </ins>The delta is ''1'', where as it should be 0. This means that opening and closing a new window has leaked <ins class="diffchange diffchange-inline">a single </ins>instance of <code>EB_DEVELOPMENT_WINDOW_AGENTS</code>.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>[[Image:Memory_tool_leak.png]]</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>[[Image:Memory_tool_leak.png]]</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"></td></tr>
<tr><td class='diff-marker'>−</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;"><div>A memory leak occurs when your tool or any of it's associated objects retains a reference to an internal part of EiffelStudio, indicated by a delta of 1 or more. When this happens there can actually be a lot of noise in the view. To reduce noise and home in on the problem area do the following:</div></td><td class='diff-marker'>+</td><td style="color:black; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;"><div>A memory leak occurs when your tool or any of it's associated objects retains a reference to an internal part of EiffelStudio, indicated by a delta of 1 or more. When this happens there can actually be a lot of noise in the view <ins class="diffchange diffchange-inline">as it in turn may reference many other objects</ins>. To reduce noise and home in on the problem area do the following:</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Toggle the '''Delta Only''' button to on so only those results with positive deltas are shown.</div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Toggle the '''Delta Only''' button to on so only those results with positive deltas are shown.</div></td></tr>
<tr><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Enter a regular expression in the '''Type filter'''. For example, to show all EiffelStudio UI classes you would use: <code>^ES_|^EB_</code></div></td><td class='diff-marker'> </td><td style="background-color: #f9f9f9; color: #333333; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #e6e6e6; vertical-align: top; white-space: pre-wrap;"><div>* Enter a regular expression in the '''Type filter'''. For example, to show all EiffelStudio UI classes you would use: <code>^ES_|^EB_</code></div></td></tr>
</table>Paulb