[Vm-dev] [Pharo-dev] Points, Free type fonts cache and memory leaks

Ben Coman btc at openinworld.com
Tue Feb 14 15:12:34 UTC 2017

On Tue, Feb 14, 2017 at 9:54 PM, Pavel Krivanek <pavel.krivanek at gmail.com>
> Hi,
> It is very common to see in actively used images that the number of
> instances of Point is very high. Sometimes in order of hundreds of
> thousands. There is several reasons for that:
> Pharo every few milliseconds checks for the new display size. That check
> generates two instances of Point that are not garbage collected in
> reasonably short time. So if you periodically check the result of "Point
> allInstances size", you will see that it is quickly growing.
> On the other hand. That Point instances are not referenced by anyone so as
> soon as you do Smalltalk garbageCollect, the amount of Points in reduced.
> And they are correctly garbage collected by the VM after some time which
> often longer than one minute. So no action needed.

Even though these get cleared out, its still extra work for the GC.
Presumably most of the time the display size is identical to the last one,
so I wonder if the existing screen size might be passed to the primitive to
test and avoid creating a new new point if its the same.  Off the top of my
head, something like this (untested)...

  MorphicUIManager >> checkForNewDisplaySize
Display hasScreenSizeChanged ifFalse: [^ Display].
DisplayScreen startUp.
World restoreMorphicDisplay.

  DisplayScreen >> hasScreenSizeChanged
      ^self class isActualScreenSizeX: width Y: height.

  DisplayScreen class >> isActualScreenSizeX: width Y: height
      <primitive: 106>

  InterpreterPrimitives >> primitiveScreenSize "primitive 106"
        "no arguments(original) ==> DisplayScreen_class>>actualScreenSize
; returning new Point from ioScreenSIze "
        "two arguments ==> DisplayScreen_class>>isActualyScreenSizeX;Y: ;
returning Boolean of whether X,Y match ioScreenSize"
| pointWord x y|
pointWord := self ioScreenSize.
x := pointWord >> 16 bitAnd: 65535.
y := pointWord bitAnd: 65535.
argumentCount = 2 ifTrue: [
((x = (self stackValue: 1)) and: [y = (self stackTop)])
ifTrue: [self pop: 3 thenPush: objectMemory trueObject]
ifFalse: [self pop: 3 thenPush: objectMemory trueObject].
self pop: 1 thenPush: (self makePointwithxValue: x    yValue: y)

<snipped other sources of Points>
cheers -ben
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20170214/55addd99/attachment.html>

More information about the Vm-dev mailing list