Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(133)

Side by Side Diff: Source/platform/heap/ThreadState.cpp

Issue 1252683003: Oilpan: Schedule a precise GC when a page navigates (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 632 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 // Heap::markedObjectSize() may be underestimated if any thread has not 643 // Heap::markedObjectSize() may be underestimated if any thread has not
644 // finished completeSweep(). 644 // finished completeSweep().
645 size_t currentObjectSizeKb = currentObjectSize() >> 10; 645 size_t currentObjectSizeKb = currentObjectSize() >> 10;
646 // Schedule a precise GC if Oilpan has allocated more than 1 MB since 646 // Schedule a precise GC if Oilpan has allocated more than 1 MB since
647 // the last GC and the current memory usage is >50% larger than 647 // the last GC and the current memory usage is >50% larger than
648 // the estimated live memory usage. 648 // the estimated live memory usage.
649 return allocatedObjectSizeKb >= 1024 && currentObjectSizeKb > (estimatedLive ObjectSizeKb * 3) / 2; 649 return allocatedObjectSizeKb >= 1024 && currentObjectSizeKb > (estimatedLive ObjectSizeKb * 3) / 2;
650 #endif 650 #endif
651 } 651 }
652 652
653 bool ThreadState::shouldSchedulePageNavigationGC(float estimatedRemovalRatio)
654 {
655 if (UNLIKELY(isGCForbidden()))
656 return false;
657
658 if (shouldForceMemoryPressureGC())
659 return true;
660
661 // Avoid potential overflow by truncating to Kb.
662 size_t allocatedObjectSizeKb = Heap::allocatedObjectSize() >> 10;
663 // The estimated size is updated when the main thread finishes lazy
664 // sweeping. If this thread reaches here before the main thread finishes
665 // lazy sweeping, the thread will use the estimated size of the last GC.
666 size_t estimatedLiveObjectSizeKb = (estimatedLiveObjectSize() >> 10) * (1 - estimatedRemovalRatio);
667 // Heap::markedObjectSize() may be underestimated if any thread has not
668 // finished completeSweep().
669 size_t currentObjectSizeKb = currentObjectSize() >> 10;
670 // Schedule a precise GC if Oilpan has allocated more than 1 MB since
671 // the last GC and the current memory usage is >50% larger than
672 // the estimated live memory usage.
673 return allocatedObjectSizeKb >= 1024 && currentObjectSizeKb > (estimatedLive ObjectSizeKb * 3) / 2;
674 }
675
676 void ThreadState::schedulePageNavigationGCIfNeeded(float estimatedRemovalRatio)
677 {
678 ASSERT(checkThread());
679 // Finish on-going lazy sweeping.
haraken 2015/08/11 07:43:08 Add: // TODO(haraken): It might not make sense
keishi 2015/08/11 08:12:58 Done.
680 completeSweep();
681 ASSERT(!isSweepingInProgress());
682 ASSERT(!sweepForbidden());
683
684 Heap::reportMemoryUsageForTracing();
685 if (shouldSchedulePageNavigationGC(estimatedRemovalRatio))
686 schedulePageNavigationGC();
687 }
688
689 void ThreadState::schedulePageNavigationGC()
690 {
691 ASSERT(checkThread());
692 ASSERT(!isSweepingInProgress());
693 setGCState(PageNavigationGCScheduled);
694 }
695
653 // TODO(haraken): We should improve the GC heuristics. 696 // TODO(haraken): We should improve the GC heuristics.
654 // These heuristics affect performance significantly. 697 // These heuristics affect performance significantly.
655 bool ThreadState::shouldForceConservativeGC() 698 bool ThreadState::shouldForceConservativeGC()
656 { 699 {
657 if (UNLIKELY(isGCForbidden())) 700 if (UNLIKELY(isGCForbidden()))
658 return false; 701 return false;
659 702
660 if (shouldForceMemoryPressureGC()) 703 if (shouldForceMemoryPressureGC())
661 return true; 704 return true;
662 705
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
903 if (isGCForbidden()) 946 if (isGCForbidden())
904 return; 947 return;
905 948
906 switch (gcState()) { 949 switch (gcState()) {
907 case FullGCScheduled: 950 case FullGCScheduled:
908 Heap::collectAllGarbage(); 951 Heap::collectAllGarbage();
909 break; 952 break;
910 case PreciseGCScheduled: 953 case PreciseGCScheduled:
911 Heap::collectGarbage(NoHeapPointersOnStack, GCWithoutSweep, Heap::Precis eGC); 954 Heap::collectGarbage(NoHeapPointersOnStack, GCWithoutSweep, Heap::Precis eGC);
912 break; 955 break;
956 case PageNavigationGCScheduled:
957 Heap::collectGarbage(NoHeapPointersOnStack, GCWithSweep, Heap::PreciseGC );
958 break;
913 case IdleGCScheduled: 959 case IdleGCScheduled:
914 // Idle time GC will be scheduled by Blink Scheduler. 960 // Idle time GC will be scheduled by Blink Scheduler.
915 break; 961 break;
916 default: 962 default:
917 break; 963 break;
918 } 964 }
919 } 965 }
920 966
921 void ThreadState::flushHeapDoesNotContainCacheIfNeeded() 967 void ThreadState::flushHeapDoesNotContainCacheIfNeeded()
922 { 968 {
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after
1531 json->beginArray(it->key.ascii().data()); 1577 json->beginArray(it->key.ascii().data());
1532 for (size_t age = 0; age <= maxHeapObjectAge; ++age) 1578 for (size_t age = 0; age <= maxHeapObjectAge; ++age)
1533 json->pushInteger(it->value.ages[age]); 1579 json->pushInteger(it->value.ages[age]);
1534 json->endArray(); 1580 json->endArray();
1535 } 1581 }
1536 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(TRACE_DISABLED_BY_DEFAULT("blink_gc"), s tatsName, this, json.release()); 1582 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(TRACE_DISABLED_BY_DEFAULT("blink_gc"), s tatsName, this, json.release());
1537 } 1583 }
1538 #endif 1584 #endif
1539 1585
1540 } // namespace blink 1586 } // namespace blink
OLDNEW
« Source/platform/heap/ThreadState.h ('K') | « Source/platform/heap/ThreadState.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698