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

Peter Wang <[email protected]> Fri, 6 Jun 2014 14:16:27 +1000
Newsgroups gmane.comp.programming.garbage-collection.boehmgc
Message-ID <[email protected]>
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);
}
_______________________________________________
bdwgc mailing list
[email protected]
https://lists.opendylan.org/mailman/listinfo/bdwgc