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 16 matching lines...) Expand all Loading... |
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 "config.h" | 31 #include "config.h" |
32 #include "platform/heap/Heap.h" | 32 #include "platform/heap/Heap.h" |
33 | 33 |
34 #include "platform/ScriptForbiddenScope.h" | 34 #include "platform/ScriptForbiddenScope.h" |
35 #include "platform/Task.h" | 35 #include "platform/Task.h" |
36 #include "platform/TraceEvent.h" | 36 #include "platform/TraceEvent.h" |
| 37 #include "platform/heap/BlinkGCMemoryDumpProvider.h" |
37 #include "platform/heap/CallbackStack.h" | 38 #include "platform/heap/CallbackStack.h" |
38 #include "platform/heap/MarkingVisitor.h" | 39 #include "platform/heap/MarkingVisitor.h" |
39 #include "platform/heap/PageMemory.h" | 40 #include "platform/heap/PageMemory.h" |
40 #include "platform/heap/PagePool.h" | 41 #include "platform/heap/PagePool.h" |
41 #include "platform/heap/SafePoint.h" | 42 #include "platform/heap/SafePoint.h" |
42 #include "platform/heap/ThreadState.h" | 43 #include "platform/heap/ThreadState.h" |
43 #include "public/platform/Platform.h" | 44 #include "public/platform/Platform.h" |
| 45 #include "public/platform/WebMemoryAllocatorDump.h" |
44 #include "wtf/Assertions.h" | 46 #include "wtf/Assertions.h" |
45 #include "wtf/ContainerAnnotations.h" | 47 #include "wtf/ContainerAnnotations.h" |
46 #include "wtf/LeakAnnotations.h" | 48 #include "wtf/LeakAnnotations.h" |
47 #include "wtf/MainThread.h" | 49 #include "wtf/MainThread.h" |
48 #include "wtf/PageAllocator.h" | 50 #include "wtf/PageAllocator.h" |
49 #include "wtf/Partitions.h" | 51 #include "wtf/Partitions.h" |
50 #include "wtf/PassOwnPtr.h" | 52 #include "wtf/PassOwnPtr.h" |
51 #if ENABLE(GC_PROFILING) | 53 #if ENABLE(GC_PROFILING) |
52 #include "platform/TracedValue.h" | 54 #include "platform/TracedValue.h" |
53 #include "wtf/HashMap.h" | 55 #include "wtf/HashMap.h" |
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 | 252 |
251 ASSERT(!m_firstUnsweptPage); | 253 ASSERT(!m_firstUnsweptPage); |
252 // Add the BaseHeap's pages to the orphanedPagePool. | 254 // Add the BaseHeap's pages to the orphanedPagePool. |
253 for (BasePage* page = m_firstPage; page; page = page->next()) { | 255 for (BasePage* page = m_firstPage; page; page = page->next()) { |
254 Heap::decreaseAllocatedSpace(page->size()); | 256 Heap::decreaseAllocatedSpace(page->size()); |
255 Heap::orphanedPagePool()->addOrphanedPage(heapIndex(), page); | 257 Heap::orphanedPagePool()->addOrphanedPage(heapIndex(), page); |
256 } | 258 } |
257 m_firstPage = nullptr; | 259 m_firstPage = nullptr; |
258 } | 260 } |
259 | 261 |
| 262 void BaseHeap::takeSnapshot(const String& dumpBaseName) |
| 263 { |
| 264 size_t pageCount = 0; |
| 265 for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) { |
| 266 pageCount++; |
| 267 } |
| 268 WebMemoryAllocatorDump* allocatorDump = BlinkGCMemoryDumpProvider::instance(
)->createMemoryAllocatorDumpForCurrentGC(dumpBaseName); |
| 269 allocatorDump->AddScalar("blink_page_count", "objects", pageCount); |
| 270 } |
| 271 |
260 #if ENABLE(ASSERT) || ENABLE(GC_PROFILING) | 272 #if ENABLE(ASSERT) || ENABLE(GC_PROFILING) |
261 BasePage* BaseHeap::findPageFromAddress(Address address) | 273 BasePage* BaseHeap::findPageFromAddress(Address address) |
262 { | 274 { |
263 for (BasePage* page = m_firstPage; page; page = page->next()) { | 275 for (BasePage* page = m_firstPage; page; page = page->next()) { |
264 if (page->contains(address)) | 276 if (page->contains(address)) |
265 return page; | 277 return page; |
266 } | 278 } |
267 for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) { | 279 for (BasePage* page = m_firstUnsweptPage; page; page = page->next()) { |
268 if (page->contains(address)) | 280 if (page->contains(address)) |
269 return page; | 281 return page; |
(...skipping 1469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1739 s_ephemeronStack = new CallbackStack(); | 1751 s_ephemeronStack = new CallbackStack(); |
1740 s_heapDoesNotContainCache = new HeapDoesNotContainCache(); | 1752 s_heapDoesNotContainCache = new HeapDoesNotContainCache(); |
1741 s_freePagePool = new FreePagePool(); | 1753 s_freePagePool = new FreePagePool(); |
1742 s_orphanedPagePool = new OrphanedPagePool(); | 1754 s_orphanedPagePool = new OrphanedPagePool(); |
1743 s_allocatedObjectSize = 0; | 1755 s_allocatedObjectSize = 0; |
1744 s_allocatedSpace = 0; | 1756 s_allocatedSpace = 0; |
1745 s_markedObjectSize = 0; | 1757 s_markedObjectSize = 0; |
1746 s_estimatedMarkingTimePerByte = 0.0; | 1758 s_estimatedMarkingTimePerByte = 0.0; |
1747 | 1759 |
1748 GCInfoTable::init(); | 1760 GCInfoTable::init(); |
| 1761 |
| 1762 if (Platform::current() && Platform::current()->currentThread()) |
| 1763 Platform::current()->registerMemoryDumpProvider(BlinkGCMemoryDumpProvide
r::instance()); |
1749 } | 1764 } |
1750 | 1765 |
1751 void Heap::shutdown() | 1766 void Heap::shutdown() |
1752 { | 1767 { |
| 1768 if (Platform::current() && Platform::current()->currentThread()) |
| 1769 Platform::current()->unregisterMemoryDumpProvider(BlinkGCMemoryDumpProvi
der::instance()); |
1753 s_shutdownCalled = true; | 1770 s_shutdownCalled = true; |
1754 ThreadState::shutdownHeapIfNecessary(); | 1771 ThreadState::shutdownHeapIfNecessary(); |
1755 } | 1772 } |
1756 | 1773 |
1757 void Heap::doShutdown() | 1774 void Heap::doShutdown() |
1758 { | 1775 { |
1759 // We don't want to call doShutdown() twice. | 1776 // We don't want to call doShutdown() twice. |
1760 if (!s_markingStack) | 1777 if (!s_markingStack) |
1761 return; | 1778 return; |
1762 | 1779 |
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1996 | 2013 |
1997 if (state->isMainThread()) | 2014 if (state->isMainThread()) |
1998 ScriptForbiddenScope::enter(); | 2015 ScriptForbiddenScope::enter(); |
1999 | 2016 |
2000 TRACE_EVENT2("blink_gc", "Heap::collectGarbage", | 2017 TRACE_EVENT2("blink_gc", "Heap::collectGarbage", |
2001 "lazySweeping", gcType == ThreadState::GCWithoutSweep, | 2018 "lazySweeping", gcType == ThreadState::GCWithoutSweep, |
2002 "gcReason", gcReasonString(reason)); | 2019 "gcReason", gcReasonString(reason)); |
2003 TRACE_EVENT_SCOPED_SAMPLING_STATE("blink_gc", "BlinkGC"); | 2020 TRACE_EVENT_SCOPED_SAMPLING_STATE("blink_gc", "BlinkGC"); |
2004 double timeStamp = WTF::currentTimeMS(); | 2021 double timeStamp = WTF::currentTimeMS(); |
2005 | 2022 |
| 2023 if (gcType == ThreadState::TakeSnapshot) |
| 2024 BlinkGCMemoryDumpProvider::instance()->clearProcessDumpForCurrentGC(); |
| 2025 |
2006 // Disallow allocation during garbage collection (but not during the | 2026 // Disallow allocation during garbage collection (but not during the |
2007 // finalization that happens when the gcScope is torn down). | 2027 // finalization that happens when the gcScope is torn down). |
2008 ThreadState::NoAllocationScope noAllocationScope(state); | 2028 ThreadState::NoAllocationScope noAllocationScope(state); |
2009 | 2029 |
2010 preGC(); | 2030 preGC(); |
2011 | 2031 |
2012 StackFrameDepthScope stackDepthScope; | 2032 StackFrameDepthScope stackDepthScope; |
2013 | 2033 |
2014 size_t totalObjectSize = Heap::allocatedObjectSize() + Heap::markedObjectSiz
e(); | 2034 size_t totalObjectSize = Heap::allocatedObjectSize() + Heap::markedObjectSiz
e(); |
2015 if (gcType != ThreadState::TakeSnapshot) | 2035 if (gcType != ThreadState::TakeSnapshot) |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2316 size_t Heap::s_allocatedObjectSize = 0; | 2336 size_t Heap::s_allocatedObjectSize = 0; |
2317 size_t Heap::s_allocatedSpace = 0; | 2337 size_t Heap::s_allocatedSpace = 0; |
2318 size_t Heap::s_markedObjectSize = 0; | 2338 size_t Heap::s_markedObjectSize = 0; |
2319 // We don't want to use 0 KB for the initial value because it may end up | 2339 // We don't want to use 0 KB for the initial value because it may end up |
2320 // triggering the first GC of some thread too prematurely. | 2340 // triggering the first GC of some thread too prematurely. |
2321 size_t Heap::s_estimatedLiveObjectSize = 512 * 1024; | 2341 size_t Heap::s_estimatedLiveObjectSize = 512 * 1024; |
2322 size_t Heap::s_externalObjectSizeAtLastGC = 0; | 2342 size_t Heap::s_externalObjectSizeAtLastGC = 0; |
2323 double Heap::s_estimatedMarkingTimePerByte = 0.0; | 2343 double Heap::s_estimatedMarkingTimePerByte = 0.0; |
2324 | 2344 |
2325 } // namespace blink | 2345 } // namespace blink |
OLD | NEW |