forked from mirrors/gecko-dev
Bug 1787526 - Part 1: Add configuration for semispace nursery r=sfink
Add a GC parameter and pref for semispace nursery which is disabled by default. Enable it for the shell rootanalysis job to get get some test coverage. Differential Revision: https://phabricator.services.mozilla.com/D196431
This commit is contained in:
parent
0ab737bb68
commit
2ae057efaf
11 changed files with 67 additions and 2 deletions
|
|
@ -2121,6 +2121,13 @@ void nsJSContext::EnsureStatics() {
|
|||
"javascript.options.mem.gc_compacting",
|
||||
(void*)JSGC_COMPACTING_ENABLED);
|
||||
|
||||
#ifdef NIGHTLY_BUILD
|
||||
Preferences::RegisterCallbackAndCall(
|
||||
SetMemoryPrefChangedCallbackBool,
|
||||
"javascript.options.mem.gc_experimental_semispace_nursery",
|
||||
(void*)JSGC_SEMISPACE_NURSERY_ENABLED);
|
||||
#endif
|
||||
|
||||
Preferences::RegisterCallbackAndCall(
|
||||
SetMemoryPrefChangedCallbackBool,
|
||||
"javascript.options.mem.gc_parallel_marking",
|
||||
|
|
|
|||
|
|
@ -372,6 +372,9 @@ void LoadJSGCMemoryOptions(const char* aPrefName, void* /* aClosure */) {
|
|||
PREF("gc_parallel_marking", JSGC_PARALLEL_MARKING_ENABLED),
|
||||
PREF("gc_parallel_marking_threshold_mb",
|
||||
JSGC_PARALLEL_MARKING_THRESHOLD_MB),
|
||||
#ifdef NIGHTLY_BUILD
|
||||
PREF("gc_experimental_semispace_nursery", JSGC_SEMISPACE_NURSERY_ENABLED),
|
||||
#endif
|
||||
// Note: Workers do not currently trigger eager minor GC, but if that is
|
||||
// desired the following parameters should be added:
|
||||
// javascript.options.mem.nursery_eager_collection_threshold_kb
|
||||
|
|
@ -426,6 +429,9 @@ void LoadJSGCMemoryOptions(const char* aPrefName, void* /* aClosure */) {
|
|||
}
|
||||
case JSGC_COMPACTING_ENABLED:
|
||||
case JSGC_PARALLEL_MARKING_ENABLED:
|
||||
#ifdef NIGHTLY_BUILD
|
||||
case JSGC_SEMISPACE_NURSERY_ENABLED:
|
||||
#endif
|
||||
case JSGC_BALANCED_HEAP_LIMITS_ENABLED: {
|
||||
bool present;
|
||||
bool prefValue = GetPref(pref->fullName, false, &present);
|
||||
|
|
|
|||
|
|
@ -459,6 +459,15 @@ typedef enum JSGCParamKey {
|
|||
* Default: ParallelMarkingThresholdMB
|
||||
*/
|
||||
JSGC_PARALLEL_MARKING_THRESHOLD_MB = 50,
|
||||
|
||||
/**
|
||||
* Whether the semispace nursery is enabled.
|
||||
*
|
||||
* Pref: javascript.options.mem.gc_experimental_semispace_nursery
|
||||
* Default: SemispaceNurseryEnabled
|
||||
*/
|
||||
JSGC_SEMISPACE_NURSERY_ENABLED = 51,
|
||||
|
||||
} JSGCParamKey;
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -4,6 +4,6 @@
|
|||
"debug": true,
|
||||
"env": {
|
||||
"JS_GC_ZEAL": "GenerationalGC",
|
||||
"JSTESTS_EXTRA_ARGS": "--jitflags=debug"
|
||||
"JSTESTS_EXTRA_ARGS": "--jitflags=debug --args='--gc-param=semispaceNurseryEnabled=1'"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1073,6 +1073,11 @@ bool GCRuntime::setParameter(JSGCParamKey key, uint32_t value,
|
|||
marker->incrementalWeakMapMarkingEnabled = value != 0;
|
||||
}
|
||||
break;
|
||||
case JSGC_SEMISPACE_NURSERY_ENABLED: {
|
||||
AutoUnlockGC unlock(lock);
|
||||
nursery().setSemispaceEnabled(value);
|
||||
break;
|
||||
}
|
||||
case JSGC_MIN_EMPTY_CHUNK_COUNT:
|
||||
setMinEmptyChunkCount(value, lock);
|
||||
break;
|
||||
|
|
@ -1160,6 +1165,11 @@ void GCRuntime::resetParameter(JSGCParamKey key, AutoLockGC& lock) {
|
|||
TuningDefaults::IncrementalWeakMapMarkingEnabled;
|
||||
}
|
||||
break;
|
||||
case JSGC_SEMISPACE_NURSERY_ENABLED: {
|
||||
AutoUnlockGC unlock(lock);
|
||||
nursery().setSemispaceEnabled(TuningDefaults::SemispaceNurseryEnabled);
|
||||
break;
|
||||
}
|
||||
case JSGC_MIN_EMPTY_CHUNK_COUNT:
|
||||
setMinEmptyChunkCount(TuningDefaults::MinEmptyChunkCount, lock);
|
||||
break;
|
||||
|
|
@ -1241,6 +1251,8 @@ uint32_t GCRuntime::getParameter(JSGCParamKey key, const AutoLockGC& lock) {
|
|||
return parallelMarkingEnabled;
|
||||
case JSGC_INCREMENTAL_WEAKMAP_ENABLED:
|
||||
return marker().incrementalWeakMapMarkingEnabled;
|
||||
case JSGC_SEMISPACE_NURSERY_ENABLED:
|
||||
return nursery().semispaceEnabled();
|
||||
case JSGC_CHUNK_BYTES:
|
||||
return ChunkSize;
|
||||
case JSGC_HELPER_THREAD_RATIO:
|
||||
|
|
|
|||
|
|
@ -83,7 +83,8 @@ class TenuredChunk;
|
|||
_("maxHelperThreads", JSGC_MAX_HELPER_THREADS, true) \
|
||||
_("helperThreadCount", JSGC_HELPER_THREAD_COUNT, false) \
|
||||
_("markingThreadCount", JSGC_MARKING_THREAD_COUNT, true) \
|
||||
_("systemPageSizeKB", JSGC_SYSTEM_PAGE_SIZE_KB, false)
|
||||
_("systemPageSizeKB", JSGC_SYSTEM_PAGE_SIZE_KB, false) \
|
||||
_("semispaceNurseryEnabled", JSGC_SEMISPACE_NURSERY_ENABLED, true)
|
||||
|
||||
// Get the key and writability give a GC parameter name.
|
||||
extern bool GetGCParameterInfo(const char* name, JSGCParamKey* keyOut,
|
||||
|
|
|
|||
|
|
@ -223,6 +223,7 @@ js::Nursery::Nursery(GCRuntime* gc)
|
|||
startPosition_(0),
|
||||
capacity_(0),
|
||||
enableProfiling_(false),
|
||||
semispaceEnabled_(gc::TuningDefaults::SemispaceNurseryEnabled),
|
||||
canAllocateStrings_(true),
|
||||
canAllocateBigInts_(true),
|
||||
reportDeduplications_(false),
|
||||
|
|
@ -464,6 +465,20 @@ void js::Nursery::discardCodeAndSetJitFlagsForZone(JS::Zone* zone) {
|
|||
}
|
||||
}
|
||||
|
||||
void js::Nursery::setSemispaceEnabled(bool enabled) {
|
||||
if (semispaceEnabled() == enabled) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isEmpty()) {
|
||||
gc->minorGC(JS::GCReason::EVICT_NURSERY);
|
||||
}
|
||||
|
||||
disable();
|
||||
semispaceEnabled_ = enabled;
|
||||
enable();
|
||||
}
|
||||
|
||||
bool js::Nursery::isEmpty() const {
|
||||
if (!isEnabled()) {
|
||||
return true;
|
||||
|
|
|
|||
|
|
@ -103,6 +103,9 @@ class Nursery {
|
|||
void disableBigInts();
|
||||
bool canAllocateBigInts() const { return canAllocateBigInts_; }
|
||||
|
||||
void setSemispaceEnabled(bool enabled);
|
||||
bool semispaceEnabled() const { return semispaceEnabled_; }
|
||||
|
||||
// Return true if no allocations have been made since the last collection.
|
||||
bool isEmpty() const;
|
||||
|
||||
|
|
@ -553,6 +556,9 @@ class Nursery {
|
|||
|
||||
mozilla::TimeDuration profileThreshold_;
|
||||
|
||||
// Whether to use semispace collection.
|
||||
bool semispaceEnabled_;
|
||||
|
||||
// Whether we will nursery-allocate strings.
|
||||
bool canAllocateStrings_;
|
||||
|
||||
|
|
|
|||
|
|
@ -536,6 +536,9 @@ static const bool ParallelMarkingEnabled = false;
|
|||
/* JSGC_INCREMENTAL_WEAKMAP_ENABLED */
|
||||
static const bool IncrementalWeakMapMarkingEnabled = true;
|
||||
|
||||
/* JSGC_SEMISPACE_NURSERY_ENABLED */
|
||||
static const bool SemispaceNurseryEnabled = false;
|
||||
|
||||
/* JSGC_HELPER_THREAD_RATIO */
|
||||
static const double HelperThreadRatio = 0.5;
|
||||
|
||||
|
|
|
|||
|
|
@ -60,3 +60,4 @@ testChangeParam("mallocThresholdBase");
|
|||
testChangeParam("urgentThreshold");
|
||||
testChangeParam("helperThreadRatio");
|
||||
testChangeParam("maxHelperThreads");
|
||||
testChangeParam("semispaceNurseryEnabled");
|
||||
|
|
|
|||
|
|
@ -959,6 +959,11 @@ pref("javascript.options.mem.gc_incremental_slice_ms", 5);
|
|||
// JSGC_COMPACTING_ENABLED
|
||||
pref("javascript.options.mem.gc_compacting", true);
|
||||
|
||||
#ifdef NIGHTLY_BUILD
|
||||
// JSGC_SEMISPACE_NURSERY_ENABLED
|
||||
pref("javascript.options.mem.gc_experimental_semispace_nursery", false);
|
||||
#endif
|
||||
|
||||
// JSGC_PARALLEL_MARKING_ENABLED
|
||||
// This only applies to the main runtime and does not affect workers.
|
||||
#ifndef ANDROID
|
||||
|
|
|
|||
Loading…
Reference in a new issue