OLD | NEW |
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 12 matching lines...) Expand all Loading... |
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
29 */ | 29 */ |
30 | 30 |
31 #include "platform/heap/Heap.h" | 31 #include "platform/heap/Heap.h" |
32 | 32 |
| 33 #include "platform/Histogram.h" |
33 #include "platform/ScriptForbiddenScope.h" | 34 #include "platform/ScriptForbiddenScope.h" |
34 #include "platform/TraceEvent.h" | 35 #include "platform/TraceEvent.h" |
35 #include "platform/heap/BlinkGCMemoryDumpProvider.h" | 36 #include "platform/heap/BlinkGCMemoryDumpProvider.h" |
36 #include "platform/heap/CallbackStack.h" | 37 #include "platform/heap/CallbackStack.h" |
37 #include "platform/heap/MarkingVisitor.h" | 38 #include "platform/heap/MarkingVisitor.h" |
38 #include "platform/heap/PageMemory.h" | 39 #include "platform/heap/PageMemory.h" |
39 #include "platform/heap/PagePool.h" | 40 #include "platform/heap/PagePool.h" |
40 #include "platform/heap/SafePoint.h" | 41 #include "platform/heap/SafePoint.h" |
41 #include "platform/heap/ThreadState.h" | 42 #include "platform/heap/ThreadState.h" |
42 #include "public/platform/Platform.h" | 43 #include "public/platform/Platform.h" |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
104 const char* samplingState = TRACE_EVENT_GET_SAMPLING_STATE(); | 105 const char* samplingState = TRACE_EVENT_GET_SAMPLING_STATE(); |
105 if (m_state->isMainThread()) | 106 if (m_state->isMainThread()) |
106 TRACE_EVENT_SET_SAMPLING_STATE("blink_gc", "BlinkGCWaiting"); | 107 TRACE_EVENT_SET_SAMPLING_STATE("blink_gc", "BlinkGCWaiting"); |
107 | 108 |
108 // TODO(haraken): In an unlikely coincidence that two threads decide | 109 // TODO(haraken): In an unlikely coincidence that two threads decide |
109 // to collect garbage at the same time, avoid doing two GCs in | 110 // to collect garbage at the same time, avoid doing two GCs in |
110 // a row and return false. | 111 // a row and return false. |
111 double startTime = WTF::currentTimeMS(); | 112 double startTime = WTF::currentTimeMS(); |
112 bool allParked = gcType != BlinkGC::ThreadTerminationGC && ThreadState::
stopThreads(); | 113 bool allParked = gcType != BlinkGC::ThreadTerminationGC && ThreadState::
stopThreads(); |
113 double timeForStoppingThreads = WTF::currentTimeMS() - startTime; | 114 double timeForStoppingThreads = WTF::currentTimeMS() - startTime; |
114 Platform::current()->histogramCustomCounts("BlinkGC.TimeForStoppingThrea
ds", timeForStoppingThreads, 1, 1000, 50); | 115 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, timeToStopThreadsH
istogram, new CustomCountHistogram("BlinkGC.TimeForStoppingThreads", 1, 1000, 50
)); |
| 116 timeToStopThreadsHistogram.count(timeForStoppingThreads); |
115 | 117 |
116 if (m_state->isMainThread()) | 118 if (m_state->isMainThread()) |
117 TRACE_EVENT_SET_NONCONST_SAMPLING_STATE(samplingState); | 119 TRACE_EVENT_SET_NONCONST_SAMPLING_STATE(samplingState); |
118 | 120 |
119 return allParked; | 121 return allParked; |
120 } | 122 } |
121 | 123 |
122 Visitor* visitor() const { return m_visitor.get(); } | 124 Visitor* visitor() const { return m_visitor.get(); } |
123 | 125 |
124 private: | 126 private: |
(...skipping 320 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
445 // we should have crashed during marking before getting here.) | 447 // we should have crashed during marking before getting here.) |
446 orphanedPagePool()->decommitOrphanedPages(); | 448 orphanedPagePool()->decommitOrphanedPages(); |
447 | 449 |
448 double markingTimeInMilliseconds = WTF::currentTimeMS() - startTime; | 450 double markingTimeInMilliseconds = WTF::currentTimeMS() - startTime; |
449 s_estimatedMarkingTimePerByte = totalObjectSize ? (markingTimeInMilliseconds
/ 1000 / totalObjectSize) : 0; | 451 s_estimatedMarkingTimePerByte = totalObjectSize ? (markingTimeInMilliseconds
/ 1000 / totalObjectSize) : 0; |
450 | 452 |
451 #if PRINT_HEAP_STATS | 453 #if PRINT_HEAP_STATS |
452 dataLogF("Heap::collectGarbage (gcReason=%s, lazySweeping=%d, time=%.1lfms)\
n", gcReasonString(reason), gcType == BlinkGC::GCWithoutSweep, markingTimeInMill
iseconds); | 454 dataLogF("Heap::collectGarbage (gcReason=%s, lazySweeping=%d, time=%.1lfms)\
n", gcReasonString(reason), gcType == BlinkGC::GCWithoutSweep, markingTimeInMill
iseconds); |
453 #endif | 455 #endif |
454 | 456 |
455 Platform::current()->histogramCustomCounts("BlinkGC.CollectGarbage", marking
TimeInMilliseconds, 0, 10 * 1000, 50); | 457 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, markingTimeHistogram,
new CustomCountHistogram("BlinkGC.CollectGarbage", 0, 10 * 1000, 50)); |
456 Platform::current()->histogramCustomCounts("BlinkGC.TotalObjectSpace", Heap:
:allocatedObjectSize() / 1024, 0, 4 * 1024 * 1024, 50); | 458 markingTimeHistogram.count(markingTimeInMilliseconds); |
457 Platform::current()->histogramCustomCounts("BlinkGC.TotalAllocatedSpace", He
ap::allocatedSpace() / 1024, 0, 4 * 1024 * 1024, 50); | 459 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, totalObjectSpaceHistog
ram, new CustomCountHistogram("BlinkGC.TotalObjectSpace", 0, 4 * 1024 * 1024, 50
)); |
| 460 totalObjectSpaceHistogram.count(Heap::allocatedObjectSize() / 1024); |
| 461 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, totalAllocatedSpaceHis
togram, new CustomCountHistogram("BlinkGC.TotalAllocatedSpace", 0, 4 * 1024 * 10
24, 50)); |
| 462 totalAllocatedSpaceHistogram.count(Heap::allocatedSpace() / 1024); |
458 Platform::current()->histogramEnumeration("BlinkGC.GCReason", reason, BlinkG
C::NumberOfGCReason); | 463 Platform::current()->histogramEnumeration("BlinkGC.GCReason", reason, BlinkG
C::NumberOfGCReason); |
459 Heap::reportMemoryUsageHistogram(); | 464 Heap::reportMemoryUsageHistogram(); |
460 WTF::Partitions::reportMemoryUsageHistogram(); | 465 WTF::Partitions::reportMemoryUsageHistogram(); |
461 | 466 |
462 postGC(gcType); | 467 postGC(gcType); |
463 | 468 |
464 #if ENABLE(ASSERT) | 469 #if ENABLE(ASSERT) |
465 // 0 is used to figure non-assigned area, so avoid to use 0 in s_gcGeneratio
n. | 470 // 0 is used to figure non-assigned area, so avoid to use 0 in s_gcGeneratio
n. |
466 if (++s_gcGeneration == 0) { | 471 if (++s_gcGeneration == 0) { |
467 s_gcGeneration = 1; | 472 s_gcGeneration = 1; |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
552 double startTime = WTF::currentTimeMS(); | 557 double startTime = WTF::currentTimeMS(); |
553 | 558 |
554 // Call weak callbacks on objects that may now be pointing to dead objects. | 559 // Call weak callbacks on objects that may now be pointing to dead objects. |
555 while (popAndInvokeGlobalWeakCallback(visitor)) { } | 560 while (popAndInvokeGlobalWeakCallback(visitor)) { } |
556 | 561 |
557 // It is not permitted to trace pointers of live objects in the weak | 562 // It is not permitted to trace pointers of live objects in the weak |
558 // callback phase, so the marking stack should still be empty here. | 563 // callback phase, so the marking stack should still be empty here. |
559 ASSERT(s_markingStack->isEmpty()); | 564 ASSERT(s_markingStack->isEmpty()); |
560 | 565 |
561 double timeForGlobalWeakProcessing = WTF::currentTimeMS() - startTime; | 566 double timeForGlobalWeakProcessing = WTF::currentTimeMS() - startTime; |
562 Platform::current()->histogramCustomCounts("BlinkGC.TimeForGlobalWeakPrcessi
ng", timeForGlobalWeakProcessing, 1, 10 * 1000, 50); | 567 DEFINE_THREAD_SAFE_STATIC_LOCAL(CustomCountHistogram, globalWeakTimeHistogra
m, new CustomCountHistogram("BlinkGC.TimeForGlobalWeakPrcessing", 1, 10 * 1000,
50)); |
| 568 globalWeakTimeHistogram.count(timeForGlobalWeakProcessing); |
563 } | 569 } |
564 | 570 |
565 void Heap::collectAllGarbage() | 571 void Heap::collectAllGarbage() |
566 { | 572 { |
567 // We need to run multiple GCs to collect a chain of persistent handles. | 573 // We need to run multiple GCs to collect a chain of persistent handles. |
568 size_t previousLiveObjects = 0; | 574 size_t previousLiveObjects = 0; |
569 for (int i = 0; i < 5; ++i) { | 575 for (int i = 0; i < 5; ++i) { |
570 collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, Bli
nkGC::ForcedGC); | 576 collectGarbage(BlinkGC::NoHeapPointersOnStack, BlinkGC::GCWithSweep, Bli
nkGC::ForcedGC); |
571 size_t liveObjects = Heap::markedObjectSize(); | 577 size_t liveObjects = Heap::markedObjectSize(); |
572 if (liveObjects == previousLiveObjects) | 578 if (liveObjects == previousLiveObjects) |
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
714 size_t Heap::s_wrapperCount = 0; | 720 size_t Heap::s_wrapperCount = 0; |
715 size_t Heap::s_wrapperCountAtLastGC = 0; | 721 size_t Heap::s_wrapperCountAtLastGC = 0; |
716 size_t Heap::s_collectedWrapperCount = 0; | 722 size_t Heap::s_collectedWrapperCount = 0; |
717 size_t Heap::s_partitionAllocSizeAtLastGC = 0; | 723 size_t Heap::s_partitionAllocSizeAtLastGC = 0; |
718 double Heap::s_estimatedMarkingTimePerByte = 0.0; | 724 double Heap::s_estimatedMarkingTimePerByte = 0.0; |
719 #if ENABLE(ASSERT) | 725 #if ENABLE(ASSERT) |
720 uint16_t Heap::s_gcGeneration = 0; | 726 uint16_t Heap::s_gcGeneration = 0; |
721 #endif | 727 #endif |
722 | 728 |
723 } // namespace blink | 729 } // namespace blink |
OLD | NEW |