Analysing the size of code-related entities

This page provides an analysis for the size of the image, with a focus on the size of code entities, like methods and classes.

For performance reasons the vaues of these metrics are caches in GtMemoryMetrics Object << #GtMemoryMetrics slots: { #cache }; package: 'GToolkit-Releaser' . They can be reset using the snippet below.

GtMemoryMetrics reset
  

Current image size is 560.02 MiB.

Total analysed size: 215.57 MiB

Methods: 59.13 MiB for 413172 methods.

The size of methods includes all bytecodes, additional state and literals. Literals include strings and literal arrays, but excludes symbols.

String literals size: 6.62 MiB

Classes: 88.07 MiB for 30033 classess.

Instance Side: 35.72 MiB

Without method dictionaries: 12.65 MiB

By componets: 35.33 MiB

Method dictionaries: 23.08 MiB

Basic Size in Memory: 3.05 MiB

Other: 9.20 MiB

Subclasses: 272.16 KiB

Protocols: 5.87 MiB

Layout: 703.59 KiB

Shared pools: 2.38 MiB

Class side: 52.35 MiB (metaclasses)

Without method dictionaries: 30.45 MiB

By componets: 26.97 MiB

Method dictionaries: 21.90 MiB

Basic Size in Memory: 1.83 MiB

Other: 3.24 MiB

Protocols: 2.56 MiB

Layout: 703.90 KiB

By data:

Basic Size in Memory: 4.88 MiB

Method dictionaries: 44.98 MiB

Subclasses: 272.16 KiB

Protocols: 8.43 MiB

Shared pools: 2.38 MiB

Layout: 1.37 MiB

The size of classes includes the size of the class object and various method dictionaries, but excludes the actual methods in those dictionaries

Symbols: 6.27 MiB for 205143 symbols

Pragmas Cache: 4.86 MiB

GT Completion Cache: 53.46 MiB

Packages: 1.78 MiB

Navigation Environment: 1.99 MiB

When using traits, metaclasses use two extra arrays. This can introduce a memory overhead when traits have many users.

Traits overhead: 12.18 MiB

This measures the size of several types of instances, to double check that the previous calculations did not miss something.

MethodDictionary Dictionary << #MethodDictionary layout: VariableLayout; slots: {}; tag: 'Methods'; package: 'Kernel-CodeModel' sanity check:

74472 instances

70.34 MiB using HashedCollection>>#gtSpecificSizeInMemory gtSpecificSizeInMemory ^ self sizeInMemory + array sizeInMemory

30.03 MiB using #selector instancesSizeInMemory "Answers the number of bytes consumed by all its instances including their object header. Note: we do not use #allInstances as allInstancesDo: has a fallback for low memory" | bytes | bytes := 0. self allInstancesDo: [:each | bytes := bytes + each sizeInMemory ]. ^ bytes

CompiledMethod CompiledCode << #CompiledMethod layout: CompiledMethodLayout; slots: {}; tag: 'Methods'; package: 'Kernel-CodeModel' :

413335 instances

59.16 MiB using CompiledMethod>>#gtSpecificSizeInMemory gtSpecificSizeInMemory ^ super gtSpecificSizeInMemory + (self penultimateLiteral isMethodProperties ifTrue: [ self penultimateLiteral sizeInMemory ] ifFalse: [ 0 ])

34.89 MiB using #selector instancesSizeInMemory "Answers the number of bytes consumed by all its instances including their object header. Note: we do not use #allInstances as allInstancesDo: has a fallback for low memory" | bytes | bytes := 0. self allInstancesDo: [:each | bytes := bytes + each sizeInMemory ]. ^ bytes

CompiledBlock CompiledCode << #CompiledBlock layout: CompiledMethodLayout; slots: {}; tag: 'Methods'; package: 'Kernel-CodeModel' instances

118599 instances

6.91 MiB using #selector instancesSizeInMemory "Answers the number of bytes consumed by all its instances including their object header. Note: we do not use #allInstances as allInstancesDo: has a fallback for low memory" | bytes | bytes := 0. self allInstancesDo: [:each | bytes := bytes + each sizeInMemory ]. ^ bytes

ClassOrganization Object << #ClassOrganization slots: {}; package: 'GToolkit-Pharo11Stubs' :

0 instances

0 B using ClassOrganization>>#gtSpecificSizeInMemory gtSpecificSizeInMemory ^ self sizeInMemory + protocolOrganizer gtSpecificSizeInMemory