[iOS] Use memory footprint to dynamically adjust behavior of allocators
authormsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 12 May 2017 14:15:08 +0000 (14:15 +0000)
committermsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 12 May 2017 14:15:08 +0000 (14:15 +0000)
commit13180db2b654366e97b81bf143061e06c2199341
tree57f452d4e54ecb3743c63dd89556729e31ba70c4
parent5281fb8debe1a31dfaff885a3efe38c00046aefe
[iOS] Use memory footprint to dynamically adjust behavior of allocators
https://bugs.webkit.org/show_bug.cgi?id=171944

Reviewed by Filip Pizlo.

Source/bmalloc:

This change is iOS only.

After the scavenger thread completes scavenging, it asks the OS for how much total memory the
process is using.  This information is used to update the sleep delay for the scanvenger thread,
as well as to provide memory in use data for other parts of the system.

The scavenger sleep time is calculated using the following quadradic equation.

    scavengerSleep = 1.2*percentFreeMemory^2 - percentFreeMemory + 2

Where percentFreeMemory is between 0 and 100.  The result is constrained to the values 2 and 250.

This equation empirically works out to providing a 2ms sleep time when we have less than 10%
memory available, 30ms when 20% is available and 250ms when 50% or more is available.  In testing,
this exponentially agressive scavenging delay by itself reduced memory usage and made it much
more deterministic when used without the corresponding change in the JSC Heap.

Changed the scavenger thread to use the User Initiated QOS priority to ensure it doesn't
get starved.

Moved the non-Windows functionality of WTF::RAMSize() to new files AvailableMemory.{cpp,h}
and implemented in the function availableMemory().  That functions limits the value returned
on iOS to a maximum of 840MB as that is the jetsam soft memory limit.
Added a new API availableMemory() so that WTF::RAMSize() will use this value.

* CMakeLists.txt:
* bmalloc.xcodeproj/project.pbxproj:
* bmalloc/BPlatform.h:
* bmalloc/Heap.cpp:
(bmalloc::Heap::Heap):
(bmalloc::Heap::updateMemoryInUseParameters):
(bmalloc::Heap::concurrentScavenge):
(bmalloc::Heap::scavenge):
* bmalloc/Heap.h:
(bmalloc::Heap::memoryFootprint):
(bmalloc::Heap::percentAvailableMemoryInUse):
* bmalloc/Sizes.h:
* bmalloc/bmalloc.h:
(bmalloc::api::availableMemory):
(bmalloc::api::memoryFootprint):
(bmalloc::api::percentAvailableMemoryInUse):
* bmalloc/AvailableMemory.cpp: Added.
(bmalloc::computeAvailableMemory):
(bmalloc::availableMemory):
* bmalloc/AvailableMemory.h: Added.

Source/JavaScriptCore:

This change is iOS only.

Added the ability to react to when memory usage is critical.  This is defined as memory
usage being above the newly added option criticalGCMemoryThreshold.  When we are in this
critical state, all collections are Full and we limit the amount of memory we allocate
between collections to 1/4th the memory above the critical threshold.

Changed the calculation of proportionalHeapSize to be based on process memory footprint
and not how big the heap is.  Also, the values of Options::smallHeapRAMFraction and
Options::mediumHeapRAMFraction are overriden so that most of the heap growth is happens
using the more agressive Options::smallHeapGrowthFactor.

* heap/Heap.cpp:
(JSC::Heap::Heap):
(JSC::Heap::overCriticalMemoryThreshold):
(JSC::Heap::shouldDoFullCollection):
(JSC::Heap::collectIfNecessaryOrDefer):
* heap/Heap.h:
* runtime/Options.cpp:
(JSC::overrideDefaults):
(JSC::Options::initialize):
* runtime/Options.h:

Source/WTF:

Moved the non-Windows implementation of RAMSize() to bmalloc/AvailableMemory.cpp and
called the function availableMemory().

* wtf/RAMSize.cpp:
(WTF::computeRAMSize):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@216763 268f45cc-cd09-0410-ab3c-d52691b4dbfc
17 files changed:
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/heap/Heap.cpp
Source/JavaScriptCore/heap/Heap.h
Source/JavaScriptCore/runtime/Options.cpp
Source/JavaScriptCore/runtime/Options.h
Source/WTF/ChangeLog
Source/WTF/wtf/RAMSize.cpp
Source/bmalloc/CMakeLists.txt
Source/bmalloc/ChangeLog
Source/bmalloc/bmalloc.xcodeproj/project.pbxproj
Source/bmalloc/bmalloc/AvailableMemory.cpp [new file with mode: 0644]
Source/bmalloc/bmalloc/AvailableMemory.h [new file with mode: 0644]
Source/bmalloc/bmalloc/BPlatform.h
Source/bmalloc/bmalloc/Heap.cpp
Source/bmalloc/bmalloc/Heap.h
Source/bmalloc/bmalloc/Sizes.h
Source/bmalloc/bmalloc/bmalloc.h