factor/library/tools/memory.factor

90 lines
2.3 KiB
Factor
Raw Normal View History

2006-03-25 01:06:52 -05:00
! Copyright (C) 2004, 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
2005-02-14 21:58:07 -05:00
IN: memory
USING: arrays errors generic hashtables io kernel
2006-05-15 01:01:47 -04:00
kernel-internals math namespaces parser prettyprint
sequences strings vectors words ;
2004-11-25 21:53:27 -05:00
2005-09-24 15:21:17 -04:00
: full-gc ( -- ) generations 1 - gc ;
2005-02-18 19:02:06 -05:00
! Printing an overview of heap usage.
: kb.
1024 /i number>string
6 CHAR: \s pad-left write
" KB" write ;
2004-11-25 21:53:27 -05:00
2005-02-14 21:58:07 -05:00
: (room.) ( free total -- )
2dup swap - swap ( free used total )
kb. " total " write
kb. " used " write
kb. " free" print ;
: room. ( -- )
room
2005-05-11 00:43:52 -04:00
0 swap [
"Generation " write over pprint ":" write
2006-05-15 00:03:55 -04:00
first2 (room.) 1+
2005-05-11 00:43:52 -04:00
] each drop
2005-05-11 00:52:27 -04:00
"Semi-space: " write kb. terpri
"Cards: " write kb. terpri
"Code space: " write (room.) ;
2004-11-25 21:53:27 -05:00
2005-02-18 19:02:06 -05:00
! Some words for iterating through the heap.
2005-02-14 21:58:07 -05:00
2005-08-19 21:46:12 -04:00
: (each-object) ( quot -- )
2005-09-14 00:37:50 -04:00
next-object dup
2005-09-24 15:21:17 -04:00
[ swap [ call ] keep (each-object) ] [ 2drop ] if ; inline
2005-08-19 21:46:12 -04:00
2005-02-17 22:49:19 -05:00
: each-object ( quot -- )
2005-09-21 01:12:16 -04:00
[ begin-scan [ (each-object) ] keep ]
[ end-scan ] cleanup drop ; inline
2005-02-17 22:49:19 -05:00
: (instances) ( obj quot seq -- )
>r over >r call [ r> r> push ] [ r> r> 2drop ] if ; inline
2005-10-01 01:44:49 -04:00
: instances ( quot -- seq )
10000 <vector> [
-rot [ (instances) ] 2keep
] each-object nip ; inline
2005-02-18 19:02:06 -05:00
G: each-slot ( obj quot -- )
1 standard-combination ; inline
M: array each-slot ( array quot -- ) each ;
M: object each-slot ( obj quot -- )
over class "slots" word-prop [
-rot [ >r swap first slot r> call ] 2keep
] each 2drop ;
: refers? ( to obj -- ? )
f swap [ pick eq? or ] each-slot nip ;
: references ( obj -- list )
2005-02-20 20:38:24 -05:00
[ dupd refers? ] instances nip ;
2006-03-22 17:21:41 -05:00
: hash+ ( n key hash -- )
[ hash [ 0 ] unless* + ] 2keep set-hash ;
2005-02-18 20:37:01 -05:00
: heap-stat-step ( counts sizes obj -- )
2006-03-22 17:21:41 -05:00
[ dup size swap class rot hash+ ] keep
1 swap class rot hash+ ;
2005-02-18 20:37:01 -05:00
: heap-stats ( -- counts sizes )
2005-02-18 20:37:01 -05:00
#! Return a list of instance count/total size pairs.
2006-03-22 17:21:41 -05:00
H{ } clone H{ } clone
[ >r 2dup r> heap-stat-step ] each-object ;
2005-02-18 20:37:01 -05:00
2006-03-22 17:21:41 -05:00
: heap-stat. ( instances bytes class -- )
pprint ": " write
pprint " bytes, " write
pprint " instances" print ;
2005-02-18 19:02:06 -05:00
: heap-stats. ( -- )
heap-stats dup hash-keys
[ [ word-name ] 2apply <=> ] sort [
2006-03-22 17:21:41 -05:00
( hash hash key -- )
[ [ pick hash ] keep pick hash ] keep heap-stat.
2006-03-22 18:23:32 -05:00
] each 2drop ;