<html><head><meta http-equiv="Content-Type" content="text/html charset=windows-1252"><meta http-equiv="Content-Type" content="text/html charset=windows-1252"><meta http-equiv="Content-Type" content="text/html charset=windows-1252"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" dir="auto">Many moons ago, John McIntosh was doing some shrinking for his initial work on getting Squeak to run on iOS.<div>This email refers to the work. There may have been more details to follow.&nbsp;</div><div>Perhaps some of this might be helpful for your current shrinking work.</div><div><br></div><div>Ken G. Brown</div><div><br></div><div><div style="margin: 0px;"></div></div><blockquote type="cite"><div style="margin: 0px;">Date: Wed, 11 Feb 2009 21:13:50 -0800</div><div style="margin: 0px;">From: John M McIntosh &lt;<a href="mailto:johnmci@smalltalkconsulting.com">johnmci@smalltalkconsulting.com</a>&gt;</div><div style="margin: 0px;">Subject: Re: [squeak-dev] ditching Monticello objects.</div><div style="margin: 0px;">To: Keith Hodges &lt;<a href="mailto:keith_hodges@yahoo.co.uk">keith_hodges@yahoo.co.uk</a>&gt;</div><div style="margin: 0px;">Cc: The general-purpose Squeak developers list</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>&lt;<a href="mailto:squeak-dev@lists.squeakfoundation.org">squeak-dev@lists.squeakfoundation.org</a>&gt;</div><div style="margin: 0px;">Message-ID:</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>&lt;<a href="mailto:B07FF75B-07C4-4C3F-ABB9-E6397B70AC73@smalltalkconsulting.com">B07FF75B-07C4-4C3F-ABB9-E6397B70AC73@smalltalkconsulting.com</a>&gt;</div><div style="margin: 0px;">Content-Type: text/plain; charset=US-ASCII; format=flowed; delsp=yes</div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px;">Ok, well I did</div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px;">I've been collecting lists of pruning methods so..</div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>ScrollBar initializeImagesCache.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>GradientFillStyle initPixelRampCache.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>NaturalLanguageFormTranslator classPool at: #CachedTranslations put: &nbsp;</div><div style="margin: 0px;">nil.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>NaturalLanguageTranslator resetCaches.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>PartsBin clearThumbnailCache.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>PaintBoxMorph classPool<span class="Apple-tab-span" style="white-space:pre">        </span>at: #ColorChart put: nil.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>PaintBoxMorph classPool at: #Prototype put: nil.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>ImageMorph classPool at: #DefaultForm put: (Form extent: 1@1 depth: 1).</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>Utilities classPool at: #ScrapsBook put: nil.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>Project allInstancesDo: [ :each | each setThumbnail: nil ].</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>ScriptingSystem stripGraphicsForExternalRelease.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>ProjectHistory currentHistory initialize.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>Utilities zapUpdateDownloader.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>Smalltalk forgetDoIts.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>Behavior flushObsoleteSubclasses.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>CommandHistory allInstancesDo: #initialize.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>ChangeSorter removeChangeSetsNamedSuchThat: [ :each | true ].</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>ChangeSet resetCurrentToNewUnnamedChangeSet.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>MethodChangeRecord allInstancesDo: [ :x | x noteNewMethod: nil ].</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>RequiredSelectors initialize.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>ProvidedSelectors initialize.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>LocalSends initialize.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>SendCaches initializeAllInstances.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>Utilities cleanseOtherworldlySteppers.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>Smalltalk organization removeEmptyCategories.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>Browser initialize.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>SMSqueakMap default purge.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>SystemBrowser removeObsolete.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>TheWorldMenu removeObsolete.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>AppRegistry removeObsolete.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>FileServices removeObsolete.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>MCFileBasedRepository flushAllCaches.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>MCDefinition clearInstances.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>Undeclared removeUnreferencedKeys.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>Smalltalk flushClassNameCache.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>3 timesRepeat: [ Smalltalk garbageCollect. Symbol compactSymbolTable ].</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>Set rehashAllSets.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>Smalltalk garbageCollect.</div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px;">I added these ones.</div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>ChangeSorter initializeChangeSetCategories.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>MCWorkingCopy inspect.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>MCRepositoryGroup inspect.</div><div style="margin: 0px;"><span class="Apple-tab-span" style="white-space:pre">        </span>MCCacheRepository inspect.</div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px;">and cleaned up the class instance variables &amp; any class vars via the &nbsp;</div><div style="margin: 0px;">inspect.</div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px;">That removed all the MC packages and MC http repositories from the MC &nbsp;</div><div style="margin: 0px;">Browser</div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px;">gave me back 4 megabytes of image space.</div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px;">Well brute force, still 4 mb wonderful to get back this late in the &nbsp;</div><div style="margin: 0px;">project.</div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px;">On 11-Feb-09, at 6:18 PM, Keith Hodges wrote:</div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px;">&gt; John M McIntosh wrote:</div><div style="margin: 0px;">&gt;&gt; I'm building an image for a limited memory hardware platform.</div><div style="margin: 0px;">&gt;&gt;</div><div style="margin: 0px;">&gt;&gt; At the point here where I want to *deploy* things and I can see that</div><div style="margin: 0px;">&gt;&gt; various parts of Monticello</div><div style="margin: 0px;">&gt;&gt; are consuming well over a megabyte of memory to retain MCVersionInfo</div><div style="margin: 0px;">&gt;&gt; instances, MCMethodDefinition(s), time stamps, uuids, etc etc</div><div style="margin: 0px;">&gt;&gt;</div><div style="margin: 0px;">&gt;&gt; I'm wondering if anyone has some code to strip all that out thus</div><div style="margin: 0px;">&gt;&gt; returning I suspect a couple of MB back for more constructive usage?</div><div style="margin: 0px;">&gt; You may want to look into the cleanUp/freeSomeSpace conventions. MC1.5</div><div style="margin: 0px;">&gt; has a few implemented. There are many more available from</div><div style="margin: 0px;">&gt; <a href="http://bugs.squeak.org/view.php?id=7244">http://bugs.squeak.org/view.php?id=7244</a></div><div style="margin: 0px;">&gt;</div><div style="margin: 0px;">&gt; Keith</div><div style="margin: 0px; min-height: 14px;"><br></div><div style="margin: 0px;">--</div><div style="margin: 0px;">=&nbsp;</div><div style="margin: 0px;">=&nbsp;</div><div style="margin: 0px;">=&nbsp;</div><div style="margin: 0px;">========================================================================</div><div style="margin: 0px;">John M. McIntosh &lt;<a href="mailto:johnmci@smalltalkconsulting.com">johnmci@smalltalkconsulting.com</a>&gt;</div><div style="margin: 0px;">Corporate Smalltalk Consulting Ltd.&nbsp; <a href="http://www.smalltalkconsulting.com">http://www.smalltalkconsulting.com</a></div><div style="margin: 0px;">=&nbsp;</div><div style="margin: 0px;">=&nbsp;</div><div style="margin: 0px;">=&nbsp;</div><div style="margin: 0px;">========================================================================</div></blockquote><div><br></div><div><br></div><div><br><div><div>On Jan 7, 2014, at 12:38 PM, Colin Putney &lt;<a href="mailto:colin@wiresong.com">colin@wiresong.com</a>&gt; wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Tue, Jan 7, 2014 at 2:28 PM, Frank Shearar <span dir="ltr">&lt;<a href="mailto:frank.shearar@gmail.com" target="_blank">frank.shearar@gmail.com</a>&gt;</span> wrote:<br>
<div>&nbsp;</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="HOEnZb"><div class="h5">&nbsp;<span style="color:rgb(34,34,34)">I notice for starters that you #zapMVCProjects _after_ unloading ST80.</span></div>
</div>
Did you move that specifically, or was that just happenstance from<br>
folding #unloadReloadablePackages into the shrink script?<br></blockquote><div><br></div><div>No, I think the zapping happens while ST80 is still there. I moved the list of packages to unload to the top, but left the actual unloading in place.</div>
<div>&nbsp;</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Regarding this guy:<br>
<br>
&nbsp; names do: [:pkgName | (PackageInfo named: pkgName) classes do: [:ea<br>
| ea unload]].<br>
&nbsp; names do: [:pkgName | Installer mc unload: pkgName].<br>
<br>
That's pretty much what I was thinking of doing inside MC's<br>
#basicLoad. I hesitated because it involves sending #unload twice to<br>
every class, and doubted whether general implementations of #unload<br>
were idempotent.<br>
<br>
But I guess it must have worked out OK for you during the script?<br></blockquote><div><br></div><div>It seems to. But I thought the problem was that #unload has no effect, because the method has been removed by the time message is sent, and we fall back to the superclass noop. I originally had one loop the first sent #unload to all classes, than unloaded the package, but I found that was more sensitive to the order of the package names. The unload method would fail because it depended on something that's already gone. Two loops seems more robust.&nbsp;</div>
<div><br></div><div>I'm still working on it—down to about 10MB now. Will post again when I declare victory.</div><div><br></div><div>Colin</div></div><br></div></div>
<br></blockquote></div><br></div></body></html>