< prev index next >
src/share/vm/gc_implementation/g1/concurrentMark.inline.hpp
Print this page
rev 7994 : [mq]: filter
*** 295,314 ****
if (_cm->par_mark_and_count(obj, hr, _marked_bytes_array, _card_bm)) {
// No OrderAccess:store_load() is needed. It is implicit in the
// CAS done in CMBitMap::parMark() call in the routine above.
HeapWord* global_finger = _cm->finger();
! #if _CHECK_BOTH_FINGERS_
! // we will check both the local and global fingers
!
! if (_finger != NULL && objAddr < _finger) {
if (_cm->verbose_high()) {
! gclog_or_tty->print_cr("[%u] below the local finger ("PTR_FORMAT"), "
! "pushing it", _worker_id, p2i(_finger));
}
push(obj);
! } else if (_curr_region != NULL && objAddr < _region_limit) {
// do nothing
} else if (objAddr < global_finger) {
// Notice that the global finger might be moving forward
// concurrently. This is not a problem. In the worst case, we
// mark the object while it is above the global finger and, by
--- 295,328 ----
if (_cm->par_mark_and_count(obj, hr, _marked_bytes_array, _card_bm)) {
// No OrderAccess:store_load() is needed. It is implicit in the
// CAS done in CMBitMap::parMark() call in the routine above.
HeapWord* global_finger = _cm->finger();
! if (_CHECK_BOTH_FINGERS_ && _finger != NULL && objAddr < _finger) {
! if (obj->is_typeArray()) {
! // Immediately process arrays of binary data, rather
! // than pushing on the mark stack. This keeps us from
! // adding humongous objects to the mark stack that might
! // be reclaimed before the entry is processed - see
! // G1EagerReclaimHumongousPreSnapshotTypeArrays. The
! // cost of the additional type test is mitigated by
! // avoiding a trip through the mark stack, and by only
! // doing bookkeeping update and avoiding the actual scan
! // of the object - a typeArray contains no references,
! // and the metadata is built-in.
! process_grey_object<false>(obj);
! } else {
if (_cm->verbose_high()) {
! gclog_or_tty->print_cr(
! "[%u] below the local finger (" PTR_FORMAT "), pushing " PTR_FORMAT,
! _worker_id, p2i(_finger), p2i(objAddr));
}
push(obj);
! }
! } else if (_CHECK_BOTH_FINGERS_ &&
! _curr_region != NULL &&
! objAddr < _region_limit) {
// do nothing
} else if (objAddr < global_finger) {
// Notice that the global finger might be moving forward
// concurrently. This is not a problem. In the worst case, we
// mark the object while it is above the global finger and, by
*** 316,348 ****
// passed this object. In this case, the object will probably
// be visited when a task is scanning the region and will also
// be pushed on the stack. So, some duplicate work, but no
// correctness problems.
if (_cm->verbose_high()) {
! gclog_or_tty->print_cr("[%u] below the global finger "
! "("PTR_FORMAT"), pushing it",
! _worker_id, p2i(global_finger));
}
push(obj);
} else {
// do nothing
}
- #else // _CHECK_BOTH_FINGERS_
- // we will only check the global finger
-
- if (objAddr < global_finger) {
- // see long comment above
-
- if (_cm->verbose_high()) {
- gclog_or_tty->print_cr("[%u] below the global finger "
- "("PTR_FORMAT"), pushing it",
- _worker_id, p2i(global_finger));
- }
- push(obj);
- }
- #endif // _CHECK_BOTH_FINGERS_
}
}
}
}
}
--- 330,353 ----
// passed this object. In this case, the object will probably
// be visited when a task is scanning the region and will also
// be pushed on the stack. So, some duplicate work, but no
// correctness problems.
+ if (obj->is_typeArray()) {
+ // As above, immediately scan arrays of binary data.
+ process_grey_object<false>(obj);
+ } else {
if (_cm->verbose_high()) {
! gclog_or_tty->print_cr(
! "[%u] below the global finger (" PTR_FORMAT "), pushing " PTR_FORMAT,
! _worker_id, p2i(global_finger), p2i(objAddr));
}
push(obj);
+ }
} else {
// do nothing
}
}
}
}
}
}
< prev index next >