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