On Thu, Apr 29, 2010 at 6:00 PM, Andreas Raab <andreas.raab@gmx.de> wrote:
On 4/29/2010 6:22 AM, Mariano Martinez Peck wrote:
and then I call it like this for example:
oop := self firstAccessibleObject. [oop = nil] whileFalse: [ (self isIntegerObject: oop) ifFalse: [ size := self internalByteSize: oop. ......] oop := self accessibleObjectAfter: oop. ].
Do you realize that this simple computes the used memory which is information that's directly accessible via the vm parameters? I don't recall which one but you might want to look at these to see if they already have what you need.
Thanks Andreas. I guess I should have explained my situation. Basically, what I was trying to do (and I did at the end) is to use the last free bit of the object header to use it to detect used and unused objects. I modified the VM so that when an object receives a message, it enables such bit. I also have primitives to mark and unmark all objects. I am not sure what I will do then with the unused objects, but for the moment, I just wanted to get numbers. Statistics. So, for example I wanted to know how many objects were with the bit on and how many with the bit off. Also the amount of memory those objects represents. The method is: primitiveGetStadistics | oop usedCount unusedCount results usedMemory unusedMemory usedCountOop unusedCountOop usedMemoryOop unusedMemoryOop | usedCount := unusedCount := 0. usedMemory := unusedMemory := 0. self print: 'Start to check objects'; cr. oop := self firstAccessibleObject. [oop = nil] whileFalse: [ (self isIntegerObject: oop) ifFalse: [ (self internalIsUsed: oop) ifTrue: [ usedCount := usedCount +1. usedMemory := usedMemory + (self internalByteSize: oop). ] ifFalse: [ unusedCount := unusedCount +1. unusedMemory := unusedMemory + (self internalByteSize: oop). ]. ]. oop := self accessibleObjectAfter: oop. ]. self print: 'Finish to check objects'; cr. self print: 'Push stadistics'; cr. self pushRemappableOop: (self instantiateClass: (self classArray) indexableSize: 4). self pushRemappableOop: (self positive64BitIntegerFor: usedCount). self pushRemappableOop: (self positive64BitIntegerFor: usedMemory). self pushRemappableOop: (self positive64BitIntegerFor: unusedCount). self pushRemappableOop: (self positive64BitIntegerFor: unusedMemory). self print: 'Pop stadistics'; cr. unusedMemoryOop := self popRemappableOop. unusedCountOop := self popRemappableOop. usedMemoryOop := self popRemappableOop. usedCountOop := self popRemappableOop. results := self popRemappableOop. self print: 'Write stadistics in array'; cr. self storePointer: 0 ofObject: results withValue: usedCountOop. self storePointer: 1 ofObject: results withValue: unusedCountOop. self storePointer: 2 ofObject: results withValue: usedMemoryOop. self storePointer: 3 ofObject: results withValue: unusedMemoryOop. self print: 'Push result array in stadistics'; cr. self pop: 1 thenPush: results. And as you may guess, internalIsUsed: oop self inline: true. ^((self baseHeader: oop) bitAnd: UsedObjectBit) ~= 0 So then, from the image side, I can get statistics at certain point, and get something like the attached screenshot. Thanks. Mariano
Cheers, - Andreas
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project