[Vm-dev] Re: [Pharo-project] Bug in WAMemoryItem>>sizeOfObject
Mariano Martinez Peck
marianopeck at gmail.com
Tue Mar 27 08:58:56 UTC 2012
And there is also #sizeInMemory
sizeInMemory
"Answer the number of bytes consumed by this instance including object
header."
| contentBytes |
contentBytes := Smalltalk wordSize. "base header"
contentBytes := contentBytes + (self class instSize * Smalltalk
wordSize). "instance vars"
self class isVariable ifTrue:[ | bytesPerElement | "indexed elements"
bytesPerElement := self class isBytes ifTrue: [1] ifFalse: [4].
contentBytes := contentBytes + (self basicSize * bytesPerElement)
].
contentBytes > 255 ifTrue: [ contentBytes := contentBytes + (2 *
Smalltalk wordSize) ]
ifFalse: [ self class isCompact
ifFalse: [ contentBytes := contentBytes
+ Smalltalk wordSize]
].
^contentBytes
which is also wrong for the cases of String. For example, 'aa' sizeInMemory
answers 6 but should be 8 because of alligment.
If someone fixes this, I think #sizeInMemory would be correct.
Cheers
On Thu, Mar 15, 2012 at 6:53 PM, Eliot Miranda <eliot.miranda at gmail.com>wrote:
>
> Hi Niko,
>
> the header size calculation is also wrong. If the byte size if the
> object body is > 255 bytes there needs to be an additional header size
> word. So something like
>
> byteSizeOfBody := anObject class isBytes
> ifTrue: [....]
> ifFalse: [.....].
> headerSize := byteSizeOfBody > 255
> ifTrue: [12]
> ifFalse:
> [anObject class indexIfCompact > 0
> ifTrue: [4]
> ifFalse: [8]].
>
> On Wed, Mar 14, 2012 at 1:05 PM, <niko.schwarz at googlemail.com> wrote:
>
>> Hi guys,
>>
>> I haven't checked if this bug exists already, so please ignore this if
>> it's been reported before.
>>
>> Bug in WAMemoryItem:
>>
>> sizeOfObject: anObject
>> | headerSize instanceSize variableSize |
>> headerSize := anObject class indexIfCompact > 0
>> ifTrue: [ 4 ]
>> ifFalse: [ 8 ].
>> instanceSize := anObject class instSize.
>> variableSize := anObject class isBytes
>> ifTrue: [ anObject basicSize ]
>> ifFalse: [
>> anObject class isWords
>> ifTrue: [ Smalltalk wordSize * anObject
>> basicSize ]
>> ifFalse: [ Smalltalk wordSize * anObject
>> basicSize // 2 ] ].
>> ^ headerSize + instanceSize + variableSize
>>
>>
>> In this snippet, the units that are added together in the last line are
>> of different units.
>>
>> instanceSize is in unit "number of machine words", whereas variableSize
>> and headerSize are in unit "bytes".
>>
>>
>> The method is fixed here:
>>
>> sizeOfObject: anObject
>> | headerSize instanceSize variableSize |
>> headerSize := anObject class indexIfCompact > 0
>> ifTrue: [ 4 ]
>> ifFalse: [ 8 ].
>> instanceSize := anObject class instSize * Smalltalk wordSize.
>> variableSize := anObject class isBytes
>> ifTrue: [ anObject basicSize ]
>> ifFalse: [
>> anObject class isWords
>> ifTrue: [ Smalltalk wordSize * anObject
>> basicSize ]
>> ifFalse: [ Smalltalk wordSize * anObject
>> basicSize // 2 ] ].
>> ^ headerSize + instanceSize + variableSize
>>
>>
>>
>> Example:
>>
>> |m|
>> dict := Dictionary new.
>> m := WAMemory new. dict traverseWithMemory: m seen: IdentitySet new.
>> m totalSize
>>
>> This will incorrectly spit out 10, but should return 16, on a 32 bit VM.
>>
>> Niko
>>
>> --
>> http://scg.unibe.ch/staff/Schwarz
>> twitter.com/nes1983
>> Tel: +41786126354
>>
>>
>>
>
>
> --
> best,
> Eliot
>
>
>
--
Mariano
http://marianopeck.wordpress.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/vm-dev/attachments/20120327/557f22d2/attachment.htm
More information about the Vm-dev
mailing list