Re: [Gc] Is there a way to walk the entire heap of live objects

Christian Schafmeister <[email protected]> Fri, 06 Jun 2014 02:30:02 -0400
Newsgroups gmane.comp.programming.garbage-collection.boehmgc
Message-ID <[email protected]>
Thank you both - that is very helpful.  I’ll try it tomorrow.

Before posting to the email list I did find this very old email on the topic and the code looks like the code you posted below.
The old code didn’t work but I’ll try your tomorrow.

Again - thank you very much - I’ll post the results.

Best,

.Chris.



On Jun 6, 2014, at 12:16 AM, Peter Wang <[email protected]> wrote:

> On Thu, 05 Jun 2014 07:57:53 -0400, Christian Schafmeister <[email protected]> wrote:
>> Hi there,
>> 
>> Is there any functionality in the Boehm GC that would allow me to
>> freeze the garbage collector and walk the heap of live objects?    I’d
>> like to take an inventory of all of the live objects to determine the
>> source of my current memory problems (30 GB of virtual memory used
>> after 4 hours of runtime).
> 
> Hi,
> 
> We do something like that in the Mercury project using the following
> function.
> 
> I am not an expert on Boehm GC internals, and the code is only used in a
> special memory profiling grade, so not heavily exercised.
> Please let me know if there is something wrong with it.
> 
> Peter
> 
> (in reclaim.c)
> 
> STATIC void GC_mercury_do_enumerate_reachable_objects(struct hblk *hbp,
>    word dummy)
> {
>    struct hblkhdr * hhdr = HDR(hbp);
>    size_t sz = hhdr -> hb_sz;
>    size_t bit_no;
>    char *p, *plim;
> 
>    if (GC_block_empty(hhdr)) {
>        return;
>    }
> 
>    p = hbp->hb_body;
>    bit_no = 0;
>    if (sz > MAXOBJBYTES) { /* one big object */
>        plim = p;
>    } else {
>        plim = hbp->hb_body + HBLKSIZE - sz;
>    }
>    /* Go through all words in block. */
>    while (p <= plim) {
>        if (mark_bit_from_hdr(hhdr, bit_no)) {
>            GC_mercury_callback_reachable_object((GC_word *)p,
> 		BYTES_TO_WORDS(sz));
>        }
>        bit_no += MARK_BIT_OFFSET(sz);
>        p += sz;
>    }
> }
> 
> GC_INNER void GC_mercury_enumerate_reachable_objects(void)
> {
>    GC_ASSERT(GC_mercury_callback_reachable_object);
>    GC_apply_to_all_blocks(GC_mercury_do_enumerate_reachable_objects, (word)0);
> }