RFR: 8061630: G1 iterates over JNIHandles two times

Erik Helin erik.helin at oracle.com
Tue Oct 21 14:47:58 UTC 2014


Hi all,

this patch removes a redundant call to JNIHandles::weak_oops_do. The 
call to JNIHandles::weak_oops_do can be removed because is it also 
called by ReferenceProcessor::process_discovered_references via
G1CollectedHeap::process_discovered_references, see 
ReferenceProcessor::process_phaseJNI.

Both calls to JNIHandles::weak_oops_do uses the same kind of closure for
checking if an oop alive, G1STWIsAliveClosure. However, 
JNIHandles::weak_oops_do in g1CollectedHeap.cpp gets passed an 
G1KeepAliveClosure, whereas the call to JNIHandles::weak_oops_do in 
referenceProcessor.cpp gets passed an G1CopyingKeepAliveClosure.

Looking at JNIHandleBlock::weak_oops_do, one can see that the 
`keep_alive` closure will only be called on the root if the `is_alive` 
closure returns true for the value of the handle. If the 
G1STWIsAliveClosure returns true, that means the value is either outside 
the collection set or the value has been forwarded. Since the root 
(JNIHandle) is outside the G1 heap, G1CopyingKeepAliveClosure will use a 
G1ParCopyClosure (see _copy_non_heap_obj_cl in 
G1CopyingKeepAliveClosure). Therefore, if we want to remove the 
G1KeepAliveClosure phase, we must ensure ourselves that G1ParCopyClosure 
and G1KeepAliveClosure do the same thing for a JNIHandle root with a 
value that is either outside the collection set or
already forwarded.

If the value is outside the collection set and not humongous, then both
G1ParCopyClosure and G1STWIsAliveClosure do nothing. If the value is
humongous, then both closures calls 
G1CollectedHeap::set_humongous_is_live. If the value is in the 
collection set, then G1STWIsAliveClosure assumes it has been forwarded 
and updates the root. G1ParCopyClosure will also update the root, since 
the value already has been forwarded.

Due to the above, G1ParCopyClosure already does everything 
G1KeepAliveClosure does for JNIHandles, so there is no need to iterate 
over them again using G1KeepAliveClosure.

Webrev:
http://cr.openjdk.java.net/~ehelin/8061630/webrev.00/

Bug:
https://bugs.openjdk.java.net/browse/JDK-8061630

Testing:
JPRT

Thanks,
Erik


More information about the hotspot-gc-dev mailing list