diff options
-rw-r--r-- | runtime/gc/collector/semi_space.cc | 20 | ||||
-rw-r--r-- | runtime/parsed_options.cc | 6 | ||||
-rwxr-xr-x | test/run-test | 3 |
3 files changed, 21 insertions, 8 deletions
diff --git a/runtime/gc/collector/semi_space.cc b/runtime/gc/collector/semi_space.cc index 681bfaac83..82d6992922 100644 --- a/runtime/gc/collector/semi_space.cc +++ b/runtime/gc/collector/semi_space.cc @@ -251,13 +251,19 @@ void SemiSpace::MarkingPhase() { // Note: Freed bytes can be negative if we copy form a compacted space to a free-list backed // space. RecordFree(ObjectBytePair(from_objects - to_objects, from_bytes - to_bytes)); - // Clear the from space. Protect it with PROT_READ here and if - // kProtectFromSpace is true, will protect it with PROT_NONE later - // in FinishPhase() so the rosalloc verification works (can read the - // metadata magic number.) + // Clear and protect the from space. from_space_->Clear(); - VLOG(heap) << "Protecting from_space_ with PROT_READ : " << *from_space_; - from_space_->GetMemMap()->Protect(PROT_READ); + if (kProtectFromSpace && !from_space_->IsRosAllocSpace()) { + // Protect with PROT_NONE. + VLOG(heap) << "Protecting from_space_ : " << *from_space_; + from_space_->GetMemMap()->Protect(PROT_NONE); + } else { + // If RosAllocSpace, we'll leave it as PROT_READ here so the + // rosaloc verification can read the metadata magic number and + // protect it with PROT_NONE later in FinishPhase(). + VLOG(heap) << "Protecting from_space_ with PROT_READ : " << *from_space_; + from_space_->GetMemMap()->Protect(PROT_READ); + } heap_->PreSweepingGcVerification(this); if (swap_semi_spaces_) { heap_->SwapSemiSpaces(); @@ -752,7 +758,7 @@ void SemiSpace::SetFromSpace(space::ContinuousMemMapAllocSpace* from_space) { void SemiSpace::FinishPhase() { TimingLogger::ScopedTiming t(__FUNCTION__, GetTimings()); - if (kProtectFromSpace) { + if (kProtectFromSpace && from_space_->IsRosAllocSpace()) { VLOG(heap) << "Protecting from_space_ with PROT_NONE : " << *from_space_; from_space_->GetMemMap()->Protect(PROT_NONE); } diff --git a/runtime/parsed_options.cc b/runtime/parsed_options.cc index 4ba3cb999d..efc4a7195b 100644 --- a/runtime/parsed_options.cc +++ b/runtime/parsed_options.cc @@ -413,6 +413,12 @@ bool ParsedOptions::Parse(const RuntimeOptions& options, bool ignore_unrecognize use_homogeneous_space_compaction_for_oom_ = true; } else if (option == "-XX:DisableHSpaceCompactForOOM") { use_homogeneous_space_compaction_for_oom_ = false; + } else if (StartsWith(option, "-XX:HspaceCompactForOOMMinIntervalMs=")) { + unsigned int value; + if (!ParseUnsignedInteger(option, '=', &value)) { + return false; + } + min_interval_homogeneous_space_compaction_by_oom_ = MsToNs(value); } else if (StartsWith(option, "-D")) { properties_.push_back(option.substr(strlen("-D"))); } else if (StartsWith(option, "-Xjnitrace:")) { diff --git a/test/run-test b/test/run-test index aba4e05d03..d2b1ec9b05 100755 --- a/test/run-test +++ b/test/run-test @@ -281,7 +281,8 @@ tmp_dir="`cd $oldwd ; python -c "import os; print os.path.realpath('$tmp_dir')"` mkdir -p $tmp_dir if [ "$basic_verify" = "true" ]; then - run_args="${run_args} --runtime-option -Xgc:preverify --runtime-option -Xgc:postverify" + # Set HspaceCompactForOOMMinIntervalMs to zero to run hspace compaction for OOM more frequently in tests. + run_args="${run_args} --runtime-option -Xgc:preverify --runtime-option -Xgc:postverify --runtime-option -XX:HspaceCompactForOOMMinIntervalMs=0" fi if [ "$gc_verify" = "true" ]; then run_args="${run_args} --runtime-option -Xgc:preverify_rosalloc --runtime-option -Xgc:postverify_rosalloc" |