On Wed, Apr 12, 2017 at 11:35 AM, Denis Kudriashov <dionisi...@gmail.com> wrote:
> > 2017-04-12 10:55 GMT+02:00 Guillermo Polito <guillermopol...@gmail.com>: > >> PharoClassInstaller>>migrateClasses: old to: new using: >>> anInstanceModification >>> instanceModification := anInstanceModification. >>> old ifEmpty: [ ^ self ]. >>> [ >>> 1 to: old size do: [ :index | >>> self updateClass: (old at: index) to: (new at: index)]. >>> old elementsForwardIdentityTo: new. >>> " Garbage collect away the zombie instances left behind in garbage >>> memory in #updateInstancesFrom: " >>> " If we don't clean up this garbage, a second update would revive them >>> with a wrong layout! " >>> " (newClass rather than oldClass, since they are now both newClass) " >>> Smalltalk garbageCollect. >>> ] valueUnpreemptively >>> >>> Commenting garbage collection here increases performance 10 times. >>> Then commenting class update loop increases performance 3 times more. >>> But this loop is required. It adopts all instances of old class to new one. >>> And time here spent in #allInstances method. >>> >>> Can we remove manual garbage collection here? Why it is needed? >>> >> >> Well, there is the comment that explains it and makes pretty good sense. >> > > But is does not explain why these bad zombies exist. We investigates > possible reasons and could not reproduce them. We will try remove garbage > collection here in Pharo 7 > No, this will break stuff! I'll try to explain what does it mean by zombie instances to make some sense: - Imagine that you have class A + 10 instances of A. - We add an instance variable to A. - this means the class builder will generate class A' that is the new version of A. - then, it migrates all instances of A to class A'. This migration is not magic: - 10 new instances of A' are created - the state is migrated from the instances of A to A' - each instance of A is becomed into its corresponding instance of A' - finally we become class A into A' This step will make that old instances of A now have: - the old format - but point to the new class A If we do not garbage collect, this means that doing A allInstances will return not only the new 10 instances of A, but the old instances of A'. And that will break LOOOTS of stuff.