[Vm-dev] About CompactClasses and their future [WAS] how many free bits we have in Object Header?

Mariano Martinez Peck marianopeck at gmail.com
Thu May 6 11:16:51 UTC 2010


On Thu, May 6, 2010 at 12:14 PM, Adrian Lienhard <adi at netstyle.ch> wrote:

>
> For measuring, I wouldn't look at the current process' memory consumption
> because the VM has some headroom to not have to allocate new memory too
> often. Depending on when memory is grown or shrunken, this may yield very
> different results. What I would do is to GC and save the image to disk and
> then compare the size of the .image files. I wouldn't run the tests either.
>
>
Thanks. I have just did that.


> Making more classes compact, may make sense. But I doubt that you get 3 or
> even 5 MB. That sounds way too good ;)
>
>
hahhaa 3mb was too much, maybe 300kb ;)

These are the results:

Seaside 3.0 one click:
    original: 21MB
    compact: 20.2

Pharo 1.0
     original: 15MB
     compacted: 14.6

PharoCore 1.1
     original: 13.6
     compacted: 13.3

So...those are the results. If you want I can create an issue and commit the
script.

Cheers

Mariano




> Cheers,
> Adrian
>
>
> On May 6, 2010, at 11:24 , Mariano Martinez Peck wrote:
>
> > Hi folks. I was just trying to understand this optimization of the
> Compact
> > Classes. If I understood correctly, most objects needs a second word
> there
> > they have 30 bits of OOP of their class and 2 for the header type.
> >
> > There are classes that have a LOT of instances. For those cases we have
> > compact classes where their instances have a number using those 5 bits in
> > the first word of the header, and thus, they don't need a second header.
> > Then, less memory is used.
> >
> > So...I understood ok ?
> >
> > Now, if that is the situation. I have evaluated Smalltalk
> > compactClassesArray  and I see that in the array there are a lot of nils.
> 16
> > classes in Squeak and 15 in Pharo. The rest of the 31, are just nil.
> >
> > Now I wonder if it is worth to do anything with that :
> >
> > a) Use 4 bits instead of 5 and free one more bit in the OH
> > b) remove completely CompactClasses as Adrian said
> > c) Let 5 bits but then add more classes (up to 31) so that we can get
> > benefits of that. Do you know if there are side effects of
> becomingCompact a
> > class ?
> >
> > If I evaluate SpaceTally new printSpaceAnalysis  I get something like
> this:
> >
> > Class                           code space # instances  inst space
> percent
> > ByteString                            2217       71317       3621735
>  19.3
> > CompiledMethod                       21064       56057       3517772
>  18.7
> > Bitmap                                3893        2256       3424604
>  18.2
> > Array                                 2478       71108       2198420
>  11.7
> > ByteSymbol                             959       37896        962465
> 5.1
> > ByteArray                             2778         317        778297
> 4.1
> > MethodDictionary                      1819        5964        449252
> 2.4
> > MCVersionInfo                         1313       10369        414760
> 2.2
> > DateAndTime                           6974       13793        331032
> 1.8
> > WeakArray                              827         286        326900
> 1.7
> > Association                            749       26784        321408
> 1.7
> > UUID                                  1528       10370        248880
> 1.3
> > Float                                11442       16450        197400
> 1.1
> > ClassOrganizer                        1398        5964        190848
> 1.0
> > ODatedEntry                            263        7049        169176
> 0.9
> > Time                                  5530       10369        165904
> 0.9
> > Duration                              3025       10290        164640
> 0.9
> > Date                                  3167       10289        164624
> 0.9
> > LargePositiveInteger                  2515       14340        118169
> 0.6
> > Metaclass                             4250        2876        115040
> 0.6
> > Point                                 6404        8476        101712
> 0.5
> > GlyphForm                              307        2030         73080
> 0.4
> > FreeTypeCacheEntry                     536        2238         71616
> 0.4
> > SpaceTallyItem                         651        2509         60216
> 0.3
> > OrderedCollection                     5351        2831         56620
> 0.3
> > FreeTypeFileInfo                       797         321         30816
> 0.2
> > FreeTypeFontFamilyMember              1274         537         25776
> 0.1
> > Color                                21202        1255         25100
> 0.1
> > TraitComposition                      2651        2013         24156
> 0.1
> > Set                                   3510        1358         21728
> 0.1
> > Dictionary                            5742        1344         21504
> 0.1
> > RemoteString                          1533        1236         19776
> 0.1
> > SparseLargeTable                      2376           2         18708
> 0.1
> > WordArray                             1821          30         18608
> 0.1
> > SoundBuffer                           3299           3         18508
> 0.1
> > Pragma                                1558         862         17240
> 0.1
> > Preference                            1534         379         16676
> 0.1
> > EventHandler                          3216         125         14500
> 0.1
> > MorphExtension                        3249         277         14404
> 0.1
> > Character                             6428         939         11268
> 0.1
> > SortedCollection                      1496         462         11088
> 0.1
> > AdditionalMethodState                 2576         859         10304
> 0.1
> > ISOLanguageDefinition                18114         402          9648
> 0.1
> > TimeStamp                              861         392          9408
> 0.1
> >
> >
> > So...for this quick evaluation, maybe we can become compact also the
> > following classes for example:
> >
> > Smalltalk compactClassesArray
> >
> > #( ByteSymbol ByteArray MethodDictionary "Association" "WeakArray"
> > "Metaclass" DateAndTime UUID Time Duration Date "MethodDictionary"
> > ClassOrganizer Metaclass Pragma OrderedCollection RemoteString WordArray
> > Color Character )
> > do: [:each | (Smalltalk at: each) becomeCompact]
> >
> > Do this make sense ? How could I measure this?  I took a Pharo image and
> > compare the memory used by the VM running all test before and after those
> > new compact classes. From the "Activity monitor" I noticed between 3 and
> 5
> > MB less used with these new compact classes.
> >
> > Thanks in advance
> >
> > Mariano
> >
> >
> > On Tue, May 4, 2010 at 2:12 PM, Adrian Lienhard <adi at netstyle.ch> wrote:
> >
> >>
> >> Hi Mariano,
> >>
> >> I see two solutions
> >> - make the identityHash (even) smaller
> >> - remove compact classes
> >>
> >> The former would probably not be hard to implement (just change some bit
> >> masks and then rehash all sets). I've brought up the idea about the
> latter
> >> some time ago on this mailing list. The idea is to remove compact
> classes to
> >> get a larger identityHash (trading memory against speed). After the
> removal,
> >> only two header types are left and hence you gain a spare bit. I think
> this
> >> shouldn't be too much work either, but I haven't come around to
> implementing
> >> it (yet).
> >>
> >> Good luck ;)
> >> Adrian
> >>
> >> On May 4, 2010, at 13:13 , Mariano Martinez Peck wrote:
> >>
> >>>>>
> >>>>> Now...the question is, is there another free bit in the object header
> ?
> >> I
> >>>>> need another one :(
> >>>>
> >>>> Based on the comment at the bottom of
> Interpreter>>internalIsImmutable:
> >>>> I suspect that somebody else has their eye on that last available bit
> >>>> also ;-)
> >>>>
> >>>>
> >>> Yes, I know :(   But for the moment I don't care to "integrate" my
> stuff.
> >> I
> >>> just want to play and experiment. And even for that, I need 2 bits :(
> >>> Of course, if I once make something good to integrate, I will have
> double
> >>> problem :(
> >>>
> >>> So...no solution ?
> >>
> >>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20100506/9a2ffc43/attachment.htm


More information about the Vm-dev mailing list