JDK-8033764 : Remove the usage of StarTask from BufferingOopClosure
  • Type: Enhancement
  • Component: hotspot
  • Sub-Component: gc
  • Affected Version: 9
  • Priority: P4
  • Status: Resolved
  • Resolution: Fixed
  • Submitted: 2014-02-06
  • Updated: 2015-01-21
  • Resolved: 2014-02-10
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
8u40Fixed 9 b04Fixed
G1 uses the BufferingOopClosure to separate the root iteration from the object copying. The oop*/narrowOop* roots are gathered in a buffer and then bulk processed. By only timing the processing part and not the root iteration, the object copying time can be measured.

Currently, the BufferingOopClosure uses StarTask, from the taskqueue code, to differentiate between oop* and narrowOop* roots. The StarTask uses the least significant bit to mark whether the address contains an oop or a narrowOop. This works for most of the roots, since the addresses are aligned and the LSB is always 0. However, oops can be embedded as immediates in the JITed code and the addresses for these are not necessarily aligned. This prevents us from using StarTasks with oops in the CodeCache.

See this comment from g1_process_strong_roots:
BufferingOopClosure buf_scan_non_heap_roots(scan_non_heap_roots);
// Walk the code cache/strong code roots w/o buffering, because StarTask
// cannot handle unaligned oop locations.
CodeBlobToOopClosure eager_scan_code_roots(scan_non_heap_roots, true /* do_marking */);

I suggest that we replace the StartTask usage with another implementation that allows the BufferingOopClosures to be used for the CodeCache scanning.