Quick question
Keith McGuigan
Keith.McGuigan at Sun.COM
Thu Dec 20 05:21:01 PST 2007
Gary Benson wrote:
> Hi all,
>
> How do I allocate a block of memory that won't be considered for
> garbage collection but that the garbage collector will scan for
> oops, rewriting them if necessary?
>
> Cheers,
> Gary
>
You can allocate out of the C-heap (see methods/macros in
share/vm/memory/allocation.hpp) for the memory, and then you'll have to
create an oops_do()-style method and arrange for it to be called during
GC.
How to call the method depends on what your intentions are for the
references in the memory block, i.e., do you want them to be strong GC
roots? Or not roots but just update the pointers? Since it sounds like
the latter, then you can refer to the oops_do() methods in the string
and symbol tables in share/vm/classfile/symbolTable.[ch]pp. The oops
iterated over there aren't roots either but they just get their pointers
updated. One thing to notice in that code path, though, is that the
oops_do() is only called for full (major) collections since those tables
are known to only refer to objects in the perm-gen. If you're referring
to non-perm-gen objects you'll need your call to be called from a minor
collection too.
Hope that helps.
--
- Keith
--
- Keith
More information about the hotspot-dev
mailing list