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 565 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
576 return estimationBaseSize - sizeRetainedByCollectedPersistents; | 576 return estimationBaseSize - sizeRetainedByCollectedPersistents; |
577 } | 577 } |
578 | 578 |
579 double ThreadState::heapGrowingRate() | 579 double ThreadState::heapGrowingRate() |
580 { | 580 { |
581 size_t currentSize = Heap::allocatedObjectSize() + Heap::markedObjectSize(); | 581 size_t currentSize = Heap::allocatedObjectSize() + Heap::markedObjectSize(); |
582 size_t estimatedSize = estimatedLiveSize(Heap::markedObjectSizeAtLastComplet
eSweep(), Heap::markedObjectSizeAtLastCompleteSweep()); | 582 size_t estimatedSize = estimatedLiveSize(Heap::markedObjectSizeAtLastComplet
eSweep(), Heap::markedObjectSizeAtLastCompleteSweep()); |
583 | 583 |
584 // If the estimatedSize is 0, we set a high growing rate to trigger a GC. | 584 // If the estimatedSize is 0, we set a high growing rate to trigger a GC. |
585 double growingRate = estimatedSize > 0 ? 1.0 * currentSize / estimatedSize :
100; | 585 double growingRate = estimatedSize > 0 ? 1.0 * currentSize / estimatedSize :
100; |
586 TRACE_COUNTER1("blink_gc", "ThreadState::heapEstimatedSizeKB", std::min(esti
matedSize / 1024, static_cast<size_t>(INT_MAX))); | 586 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("blink_gc"), "ThreadState::heapEsti
matedSizeKB", std::min(estimatedSize / 1024, static_cast<size_t>(INT_MAX))); |
587 TRACE_COUNTER1("blink_gc", "ThreadState::heapGrowingRate", static_cast<int>(
100 * growingRate)); | 587 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("blink_gc"), "ThreadState::heapGrow
ingRate", static_cast<int>(100 * growingRate)); |
588 return growingRate; | 588 return growingRate; |
589 } | 589 } |
590 | 590 |
591 double ThreadState::partitionAllocGrowingRate() | 591 double ThreadState::partitionAllocGrowingRate() |
592 { | 592 { |
593 size_t currentSize = WTF::Partitions::totalSizeOfCommittedPages(); | 593 size_t currentSize = WTF::Partitions::totalSizeOfCommittedPages(); |
594 size_t estimatedSize = estimatedLiveSize(currentSize, Heap::partitionAllocSi
zeAtLastGC()); | 594 size_t estimatedSize = estimatedLiveSize(currentSize, Heap::partitionAllocSi
zeAtLastGC()); |
595 | 595 |
596 // If the estimatedSize is 0, we set a high growing rate to trigger a GC. | 596 // If the estimatedSize is 0, we set a high growing rate to trigger a GC. |
597 double growingRate = estimatedSize > 0 ? 1.0 * currentSize / estimatedSize :
100; | 597 double growingRate = estimatedSize > 0 ? 1.0 * currentSize / estimatedSize :
100; |
598 TRACE_COUNTER1("blink_gc", "ThreadState::partitionAllocEstimatedSizeKB", std
::min(estimatedSize / 1024, static_cast<size_t>(INT_MAX))); | 598 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("blink_gc"), "ThreadState::partitio
nAllocEstimatedSizeKB", std::min(estimatedSize / 1024, static_cast<size_t>(INT_M
AX))); |
599 TRACE_COUNTER1("blink_gc", "ThreadState::partitionAllocGrowingRate", static_
cast<int>(100 * growingRate)); | 599 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("blink_gc"), "ThreadState::partitio
nAllocGrowingRate", static_cast<int>(100 * growingRate)); |
600 return growingRate; | 600 return growingRate; |
601 } | 601 } |
602 | 602 |
603 // TODO(haraken): We should improve the GC heuristics. The heuristics affect | 603 // TODO(haraken): We should improve the GC heuristics. The heuristics affect |
604 // performance significantly. | 604 // performance significantly. |
605 bool ThreadState::judgeGCThreshold(size_t totalMemorySizeThreshold, double heapG
rowingRateThreshold) | 605 bool ThreadState::judgeGCThreshold(size_t totalMemorySizeThreshold, double heapG
rowingRateThreshold) |
606 { | 606 { |
607 // If the allocated object size or the total memory size is small, don't tri
gger a GC. | 607 // If the allocated object size or the total memory size is small, don't tri
gger a GC. |
608 if (Heap::allocatedObjectSize() < 100 * 1024 || totalMemorySize() < totalMem
orySizeThreshold) | 608 if (Heap::allocatedObjectSize() < 100 * 1024 || totalMemorySize() < totalMem
orySizeThreshold) |
609 return false; | 609 return false; |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
964 case SweepingAndPreciseGCScheduled: | 964 case SweepingAndPreciseGCScheduled: |
965 ASSERT(checkThread()); | 965 ASSERT(checkThread()); |
966 VERIFY_STATE_TRANSITION(m_gcState == Sweeping || m_gcState == SweepingAn
dIdleGCScheduled || m_gcState == SweepingAndPreciseGCScheduled); | 966 VERIFY_STATE_TRANSITION(m_gcState == Sweeping || m_gcState == SweepingAn
dIdleGCScheduled || m_gcState == SweepingAndPreciseGCScheduled); |
967 break; | 967 break; |
968 default: | 968 default: |
969 ASSERT_NOT_REACHED(); | 969 ASSERT_NOT_REACHED(); |
970 } | 970 } |
971 m_gcState = gcState; | 971 m_gcState = gcState; |
972 #if ENABLE(GC_PROFILING) | 972 #if ENABLE(GC_PROFILING) |
973 if (isMainThread()) | 973 if (isMainThread()) |
974 TRACE_COUNTER1("blink_gc", "ThreadState::gcState", static_cast<int>(m_gc
State)); | 974 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("blink_gc"), "ThreadState::gcSt
ate", static_cast<int>(m_gcState)); |
975 #endif | 975 #endif |
976 } | 976 } |
977 | 977 |
978 #undef VERIFY_STATE_TRANSITION | 978 #undef VERIFY_STATE_TRANSITION |
979 | 979 |
980 ThreadState::GCState ThreadState::gcState() const | 980 ThreadState::GCState ThreadState::gcState() const |
981 { | 981 { |
982 return m_gcState; | 982 return m_gcState; |
983 } | 983 } |
984 | 984 |
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1210 | 1210 |
1211 void ThreadState::postSweep() | 1211 void ThreadState::postSweep() |
1212 { | 1212 { |
1213 ASSERT(checkThread()); | 1213 ASSERT(checkThread()); |
1214 Heap::reportMemoryUsageForTracing(); | 1214 Heap::reportMemoryUsageForTracing(); |
1215 | 1215 |
1216 if (isMainThread()) { | 1216 if (isMainThread()) { |
1217 double collectionRate = 0; | 1217 double collectionRate = 0; |
1218 if (Heap::objectSizeAtLastGC() > 0) | 1218 if (Heap::objectSizeAtLastGC() > 0) |
1219 collectionRate = 1 - 1.0 * Heap::markedObjectSize() / Heap::objectSi
zeAtLastGC(); | 1219 collectionRate = 1 - 1.0 * Heap::markedObjectSize() / Heap::objectSi
zeAtLastGC(); |
1220 TRACE_COUNTER1("blink_gc", "ThreadState::collectionRate", static_cast<in
t>(100 * collectionRate)); | 1220 TRACE_COUNTER1(TRACE_DISABLED_BY_DEFAULT("blink_gc"), "ThreadState::coll
ectionRate", static_cast<int>(100 * collectionRate)); |
1221 | 1221 |
1222 #if PRINT_HEAP_STATS | 1222 #if PRINT_HEAP_STATS |
1223 dataLogF("ThreadState::postSweep (collectionRate=%d%%)\n", static_cast<i
nt>(100 * collectionRate)); | 1223 dataLogF("ThreadState::postSweep (collectionRate=%d%%)\n", static_cast<i
nt>(100 * collectionRate)); |
1224 #endif | 1224 #endif |
1225 | 1225 |
1226 // Heap::markedObjectSize() may be underestimated here if any other | 1226 // Heap::markedObjectSize() may be underestimated here if any other |
1227 // thread has not yet finished lazy sweeping. | 1227 // thread has not yet finished lazy sweeping. |
1228 Heap::setMarkedObjectSizeAtLastCompleteSweep(Heap::markedObjectSize()); | 1228 Heap::setMarkedObjectSizeAtLastCompleteSweep(Heap::markedObjectSize()); |
1229 } | 1229 } |
1230 | 1230 |
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1661 json->beginArray(it->key.ascii().data()); | 1661 json->beginArray(it->key.ascii().data()); |
1662 for (size_t age = 0; age <= maxHeapObjectAge; ++age) | 1662 for (size_t age = 0; age <= maxHeapObjectAge; ++age) |
1663 json->pushInteger(it->value.ages[age]); | 1663 json->pushInteger(it->value.ages[age]); |
1664 json->endArray(); | 1664 json->endArray(); |
1665 } | 1665 } |
1666 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(TRACE_DISABLED_BY_DEFAULT("blink_gc"), s
tatsName, this, json.release()); | 1666 TRACE_EVENT_OBJECT_SNAPSHOT_WITH_ID(TRACE_DISABLED_BY_DEFAULT("blink_gc"), s
tatsName, this, json.release()); |
1667 } | 1667 } |
1668 #endif | 1668 #endif |
1669 | 1669 |
1670 } // namespace blink | 1670 } // namespace blink |
OLD | NEW |