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 839 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
850 if (sweepForbidden()) | 850 if (sweepForbidden()) |
851 return; | 851 return; |
852 | 852 |
853 ThreadState::SweepForbiddenScope scope(this); | 853 ThreadState::SweepForbiddenScope scope(this); |
854 { | 854 { |
855 TRACE_EVENT0("blink_gc", "ThreadState::completeSweep"); | 855 TRACE_EVENT0("blink_gc", "ThreadState::completeSweep"); |
856 for (int i = 0; i < NumberOfHeaps; i++) | 856 for (int i = 0; i < NumberOfHeaps; i++) |
857 m_heaps[i]->completeSweep(); | 857 m_heaps[i]->completeSweep(); |
858 } | 858 } |
859 | 859 |
860 if (isMainThread()) { | 860 if (isMainThread() && m_allocatedObjectSizeBeforeGC) { |
861 // FIXME: Heap::markedObjectSize() may not be accurate because other | 861 // FIXME: Heap::markedObjectSize() may not be accurate because other |
862 // threads may not have finished sweeping. | 862 // threads may not have finished sweeping. |
863 m_collectionRate = 1.0 * Heap::markedObjectSize() / m_allocatedObjectSiz
eBeforeSweeping; | 863 m_collectionRate = 1.0 * Heap::markedObjectSize() / m_allocatedObjectSiz
eBeforeGC; |
| 864 ASSERT(m_collectionRate >= 0); |
| 865 |
| 866 // The main thread might be at a safe point, with other |
| 867 // threads leaving theirs and accumulating marked object size |
| 868 // while continuing to sweep. That accumulated size might end up |
| 869 // exceeding what the main thread sampled in preGC() (recorded |
| 870 // in m_allocatedObjectSizeBeforeGC), resulting in a non-sensical |
| 871 // > 1.0 rate. |
| 872 // |
| 873 // This is rare (cf. HeapTest.Threading for a case though); |
| 874 // reset the invalid rate if encountered. |
| 875 // |
| 876 if (m_collectionRate > 1.0) |
| 877 m_collectionRate = 1.0; |
864 } else { | 878 } else { |
865 // FIXME: We should make m_lowCollectionRate available in non-main | 879 // FIXME: We should make m_collectionRate available in non-main threads. |
866 // threads. | |
867 m_collectionRate = 1.0; | 880 m_collectionRate = 1.0; |
868 } | 881 } |
869 | 882 |
870 setGCState(gcState() == Sweeping ? NoGCScheduled : GCScheduled); | 883 setGCState(gcState() == Sweeping ? NoGCScheduled : GCScheduled); |
871 } | 884 } |
872 | 885 |
873 void ThreadState::prepareRegionTree() | 886 void ThreadState::prepareRegionTree() |
874 { | 887 { |
875 // Add the regions allocated by this thread to the region search tree. | 888 // Add the regions allocated by this thread to the region search tree. |
876 for (PageMemoryRegion* region : m_allocatedRegionsSinceLastGC) | 889 for (PageMemoryRegion* region : m_allocatedRegionsSinceLastGC) |
877 Heap::addPageMemoryRegion(region); | 890 Heap::addPageMemoryRegion(region); |
878 m_allocatedRegionsSinceLastGC.clear(); | 891 m_allocatedRegionsSinceLastGC.clear(); |
879 } | 892 } |
880 | 893 |
881 void ThreadState::flushHeapDoesNotContainCacheIfNeeded() | 894 void ThreadState::flushHeapDoesNotContainCacheIfNeeded() |
882 { | 895 { |
883 if (m_shouldFlushHeapDoesNotContainCache) { | 896 if (m_shouldFlushHeapDoesNotContainCache) { |
884 Heap::flushHeapDoesNotContainCache(); | 897 Heap::flushHeapDoesNotContainCache(); |
885 m_shouldFlushHeapDoesNotContainCache = false; | 898 m_shouldFlushHeapDoesNotContainCache = false; |
886 } | 899 } |
887 } | 900 } |
888 | 901 |
889 void ThreadState::preGC() | 902 void ThreadState::preGC() |
890 { | 903 { |
891 ASSERT(!isInGC()); | 904 ASSERT(!isInGC()); |
892 setGCState(GCRunning); | 905 setGCState(GCRunning); |
893 makeConsistentForSweeping(); | 906 makeConsistentForSweeping(); |
894 prepareRegionTree(); | 907 prepareRegionTree(); |
895 flushHeapDoesNotContainCacheIfNeeded(); | 908 flushHeapDoesNotContainCacheIfNeeded(); |
| 909 if (isMainThread()) |
| 910 m_allocatedObjectSizeBeforeGC = Heap::allocatedObjectSize() + Heap::mark
edObjectSize(); |
896 } | 911 } |
897 | 912 |
898 void ThreadState::postGC(GCType gcType) | 913 void ThreadState::postGC(GCType gcType) |
899 { | 914 { |
900 ASSERT(isInGC()); | 915 ASSERT(isInGC()); |
901 setGCState(gcType == GCWithSweep ? EagerSweepScheduled : LazySweepScheduled)
; | 916 setGCState(gcType == GCWithSweep ? EagerSweepScheduled : LazySweepScheduled)
; |
902 for (int i = 0; i < NumberOfHeaps; i++) | 917 for (int i = 0; i < NumberOfHeaps; i++) |
903 m_heaps[i]->prepareForSweep(); | 918 m_heaps[i]->prepareForSweep(); |
904 } | 919 } |
905 | 920 |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1030 } | 1045 } |
1031 } | 1046 } |
1032 | 1047 |
1033 void ThreadState::postGCProcessing() | 1048 void ThreadState::postGCProcessing() |
1034 { | 1049 { |
1035 checkThread(); | 1050 checkThread(); |
1036 if (gcState() != EagerSweepScheduled && gcState() != LazySweepScheduled) | 1051 if (gcState() != EagerSweepScheduled && gcState() != LazySweepScheduled) |
1037 return; | 1052 return; |
1038 | 1053 |
1039 m_didV8GCAfterLastGC = false; | 1054 m_didV8GCAfterLastGC = false; |
1040 if (isMainThread()) | |
1041 m_allocatedObjectSizeBeforeSweeping = Heap::allocatedObjectSize(); | |
1042 | 1055 |
1043 #if ENABLE(GC_PROFILE_HEAP) | 1056 #if ENABLE(GC_PROFILE_HEAP) |
1044 // We snapshot the heap prior to sweeping to get numbers for both resources | 1057 // We snapshot the heap prior to sweeping to get numbers for both resources |
1045 // that have been allocated since the last GC and for resources that are | 1058 // that have been allocated since the last GC and for resources that are |
1046 // going to be freed. | 1059 // going to be freed. |
1047 bool gcTracingEnabled; | 1060 bool gcTracingEnabled; |
1048 TRACE_EVENT_CATEGORY_GROUP_ENABLED("blink_gc", &gcTracingEnabled); | 1061 TRACE_EVENT_CATEGORY_GROUP_ENABLED("blink_gc", &gcTracingEnabled); |
1049 if (gcTracingEnabled) | 1062 if (gcTracingEnabled) |
1050 snapshot(); | 1063 snapshot(); |
1051 #endif | 1064 #endif |
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1162 return gcInfo; | 1175 return gcInfo; |
1163 } | 1176 } |
1164 } | 1177 } |
1165 if (needLockForIteration) | 1178 if (needLockForIteration) |
1166 threadAttachMutex().unlock(); | 1179 threadAttachMutex().unlock(); |
1167 return nullptr; | 1180 return nullptr; |
1168 } | 1181 } |
1169 #endif | 1182 #endif |
1170 | 1183 |
1171 } // namespace blink | 1184 } // namespace blink |
OLD | NEW |