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); > }