What's the best way to append an oop to a GrowableArray?

Ioi Lam ioi.lam at oracle.com
Thu Nov 29 17:58:33 UTC 2018


As suggested to me offline by Dean, the right way to do this is with a 
GrowableArray<Handle> :-)

Thanks

- Ioi



On 11/28/18 9:56 PM, Ioi Lam wrote:
> I have a memory model question:
>
> I need to create lots of objects and append them into a GrowableArray
>
>    GrowableArray<oop>* arr = new (ResourceObj::C_HEAP, mtInternal)
>         GrowableArray<oop>(10000, true);;
>
>    void doit() {
>        while (...) {
>            oop o = allocate_from_heap(.....);
>            arr->append(o);
>         }
>    }
>
> There is only a single thread that can append to the array, so I am 
> not using any locks.
>
> However, GC could happen inside this loop, so I have written a 
> do_oops() function that would scan the array during GC. (For 
> convenience, I am calling my_oops_do() from within 
> SystemDictionary:oops_do() for now ...).
>
>    void my_oops_do(OopClosure* f) {
>         int len = arr->length();
>         for (int i = 0; i < len; i++) {
>           f->do_oop(arr->adr_at(i));
>         }
>       }
>    }
>
> This seems to work fine on my dual socket Xeon, but will it work 
> everywhere? Do I need to do anything to ensure that the GC threads can 
> read the up-to-date values of the array elements, and the array length?
>
> Thanks
> - Ioi
>
>



More information about the hotspot-dev mailing list