Commit 855c654b authored by feng@chromium.org's avatar feng@chromium.org

Add LowMemoryNotification to the API on Android platform.

Android system provides a unique feature that it sends a notification to the
browser in low memory condition, and the browser cleans up cache and frees
resources. Forcing a GC in low memory condition can free DOM objects and also
can shrink the old spaces.

This patch addresses the last comment in 
http://codereview.chromium.org/173016/show

	
Mads Ager 2009/08/19 17:24:23 
I would prefer to not use the flags to signal that a compacting collection is
requested.

TBR = ager
Review URL: http://codereview.chromium.org/173102

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@2725 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent 8b42f23d
...@@ -2284,6 +2284,12 @@ class V8EXPORT V8 { ...@@ -2284,6 +2284,12 @@ class V8EXPORT V8 {
*/ */
static void IdleNotification(bool is_high_priority); static void IdleNotification(bool is_high_priority);
/**
* Optional notification that the system is running low on memory.
* V8 uses these notifications to attempt to free memory.
*/
static void LowMemoryNotification();
private: private:
V8(); V8();
......
...@@ -2604,10 +2604,18 @@ bool v8::V8::Dispose() { ...@@ -2604,10 +2604,18 @@ bool v8::V8::Dispose() {
} }
void v8::V8::IdleNotification(bool is_high_priority) { void v8::V8::IdleNotification(bool is_high_priority) {
i::V8::IdleNotification(is_high_priority); i::V8::IdleNotification(is_high_priority);
} }
void v8::V8::LowMemoryNotification() {
#if defined(ANDROID)
i::Heap::CollectAllGarbage(true);
#endif
}
const char* v8::V8::GetVersion() { const char* v8::V8::GetVersion() {
static v8::internal::EmbeddedVector<char, 128> buffer; static v8::internal::EmbeddedVector<char, 128> buffer;
v8::internal::Version::GetString(buffer); v8::internal::Version::GetString(buffer);
......
...@@ -315,11 +315,13 @@ void Heap::GarbageCollectionEpilogue() { ...@@ -315,11 +315,13 @@ void Heap::GarbageCollectionEpilogue() {
} }
void Heap::CollectAllGarbage() { void Heap::CollectAllGarbage(bool force_compaction) {
// Since we are ignoring the return value, the exact choice of space does // Since we are ignoring the return value, the exact choice of space does
// not matter, so long as we do not specify NEW_SPACE, which would not // not matter, so long as we do not specify NEW_SPACE, which would not
// cause a full GC. // cause a full GC.
MarkCompactCollector::SetForceCompaction(force_compaction);
CollectGarbage(0, OLD_POINTER_SPACE); CollectGarbage(0, OLD_POINTER_SPACE);
MarkCompactCollector::SetForceCompaction(false);
} }
......
...@@ -627,8 +627,9 @@ class Heap : public AllStatic { ...@@ -627,8 +627,9 @@ class Heap : public AllStatic {
// Returns whether required_space bytes are available after the collection. // Returns whether required_space bytes are available after the collection.
static bool CollectGarbage(int required_space, AllocationSpace space); static bool CollectGarbage(int required_space, AllocationSpace space);
// Performs a full garbage collection. // Performs a full garbage collection. Force compaction if the
static void CollectAllGarbage(); // parameter is true.
static void CollectAllGarbage(bool force_compaction = false);
// Performs a full garbage collection if a context has been disposed // Performs a full garbage collection if a context has been disposed
// since the last time the check was performed. // since the last time the check was performed.
......
...@@ -39,6 +39,7 @@ namespace internal { ...@@ -39,6 +39,7 @@ namespace internal {
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
// MarkCompactCollector // MarkCompactCollector
bool MarkCompactCollector::force_compaction_ = false;
bool MarkCompactCollector::compacting_collection_ = false; bool MarkCompactCollector::compacting_collection_ = false;
int MarkCompactCollector::previous_marked_count_ = 0; int MarkCompactCollector::previous_marked_count_ = 0;
...@@ -110,7 +111,7 @@ void MarkCompactCollector::Prepare(GCTracer* tracer) { ...@@ -110,7 +111,7 @@ void MarkCompactCollector::Prepare(GCTracer* tracer) {
#endif #endif
ASSERT(!FLAG_always_compact || !FLAG_never_compact); ASSERT(!FLAG_always_compact || !FLAG_never_compact);
compacting_collection_ = FLAG_always_compact; compacting_collection_ = FLAG_always_compact || force_compaction_;
// We compact the old generation if it gets too fragmented (ie, we could // We compact the old generation if it gets too fragmented (ie, we could
// recover an expected amount of space by reclaiming the waste and free // recover an expected amount of space by reclaiming the waste and free
......
...@@ -75,6 +75,12 @@ class MarkCompactCollector: public AllStatic { ...@@ -75,6 +75,12 @@ class MarkCompactCollector: public AllStatic {
// Type of functions to process non-live objects. // Type of functions to process non-live objects.
typedef void (*ProcessNonLiveFunction)(HeapObject* object); typedef void (*ProcessNonLiveFunction)(HeapObject* object);
// Set the global force_compaction flag, it must be called before Prepare
// to take effect.
static void SetForceCompaction(bool value) {
force_compaction_ = value;
}
// Prepares for GC by resetting relocation info in old and map spaces and // Prepares for GC by resetting relocation info in old and map spaces and
// choosing spaces to compact. // choosing spaces to compact.
static void Prepare(GCTracer* tracer); static void Prepare(GCTracer* tracer);
...@@ -117,6 +123,10 @@ class MarkCompactCollector: public AllStatic { ...@@ -117,6 +123,10 @@ class MarkCompactCollector: public AllStatic {
// The current stage of the collector. // The current stage of the collector.
static CollectorState state_; static CollectorState state_;
#endif #endif
// Global flag that forces a compaction.
static bool force_compaction_;
// Global flag indicating whether spaces were compacted on the last GC. // Global flag indicating whether spaces were compacted on the last GC.
static bool compacting_collection_; static bool compacting_collection_;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment