OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
137 min_in_mutator_(kMaxInt), | 137 min_in_mutator_(kMaxInt), |
138 alive_after_last_gc_(0), | 138 alive_after_last_gc_(0), |
139 last_gc_end_timestamp_(0.0), | 139 last_gc_end_timestamp_(0.0), |
140 store_buffer_(this), | 140 store_buffer_(this), |
141 marking_(this), | 141 marking_(this), |
142 incremental_marking_(this), | 142 incremental_marking_(this), |
143 number_idle_notifications_(0), | 143 number_idle_notifications_(0), |
144 last_idle_notification_gc_count_(0), | 144 last_idle_notification_gc_count_(0), |
145 last_idle_notification_gc_count_init_(false), | 145 last_idle_notification_gc_count_init_(false), |
146 configured_(false), | 146 configured_(false), |
147 last_empty_page_was_given_back_to_the_os_(false), | |
148 chunks_queued_for_free_(NULL) { | 147 chunks_queued_for_free_(NULL) { |
149 // Allow build-time customization of the max semispace size. Building | 148 // Allow build-time customization of the max semispace size. Building |
150 // V8 with snapshots and a non-default max semispace size is much | 149 // V8 with snapshots and a non-default max semispace size is much |
151 // easier if you can define it as part of the build environment. | 150 // easier if you can define it as part of the build environment. |
152 #if defined(V8_MAX_SEMISPACE_SIZE) | 151 #if defined(V8_MAX_SEMISPACE_SIZE) |
153 max_semispace_size_ = reserved_semispace_size_ = V8_MAX_SEMISPACE_SIZE; | 152 max_semispace_size_ = reserved_semispace_size_ = V8_MAX_SEMISPACE_SIZE; |
154 #endif | 153 #endif |
155 | 154 |
156 intptr_t max_virtual = OS::MaxVirtualMemory(); | 155 intptr_t max_virtual = OS::MaxVirtualMemory(); |
157 | 156 |
(...skipping 648 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 tracer->set_full_gc_count(ms_count_); | 805 tracer->set_full_gc_count(ms_count_); |
807 | 806 |
808 MarkCompactPrologue(); | 807 MarkCompactPrologue(); |
809 | 808 |
810 mark_compact_collector_.CollectGarbage(); | 809 mark_compact_collector_.CollectGarbage(); |
811 | 810 |
812 LOG(isolate_, ResourceEvent("markcompact", "end")); | 811 LOG(isolate_, ResourceEvent("markcompact", "end")); |
813 | 812 |
814 gc_state_ = NOT_IN_GC; | 813 gc_state_ = NOT_IN_GC; |
815 | 814 |
816 Shrink(); | |
817 | |
818 isolate_->counters()->objs_since_last_full()->Set(0); | 815 isolate_->counters()->objs_since_last_full()->Set(0); |
819 | 816 |
820 contexts_disposed_ = 0; | 817 contexts_disposed_ = 0; |
821 } | 818 } |
822 | 819 |
823 | 820 |
824 void Heap::MarkCompactPrologue() { | 821 void Heap::MarkCompactPrologue() { |
825 // At any old GC clear the keyed lookup cache to enable collection of unused | 822 // At any old GC clear the keyed lookup cache to enable collection of unused |
826 // maps. | 823 // maps. |
827 isolate_->keyed_lookup_cache()->Clear(); | 824 isolate_->keyed_lookup_cache()->Clear(); |
(...skipping 4792 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5620 delete debug_utils_; | 5617 delete debug_utils_; |
5621 debug_utils_ = NULL; | 5618 debug_utils_ = NULL; |
5622 #endif | 5619 #endif |
5623 } | 5620 } |
5624 | 5621 |
5625 | 5622 |
5626 void Heap::Shrink() { | 5623 void Heap::Shrink() { |
5627 // Try to shrink all paged spaces. | 5624 // Try to shrink all paged spaces. |
5628 PagedSpaces spaces; | 5625 PagedSpaces spaces; |
5629 for (PagedSpace* space = spaces.next(); space != NULL; space = spaces.next()) | 5626 for (PagedSpace* space = spaces.next(); space != NULL; space = spaces.next()) |
5630 space->Shrink(); | 5627 space->ReleaseAllUnusedPages(); |
5631 } | 5628 } |
5632 | 5629 |
5633 | 5630 |
5634 void Heap::AddGCPrologueCallback(GCPrologueCallback callback, GCType gc_type) { | 5631 void Heap::AddGCPrologueCallback(GCPrologueCallback callback, GCType gc_type) { |
5635 ASSERT(callback != NULL); | 5632 ASSERT(callback != NULL); |
5636 GCPrologueCallbackPair pair(callback, gc_type); | 5633 GCPrologueCallbackPair pair(callback, gc_type); |
5637 ASSERT(!gc_prologue_callbacks_.Contains(pair)); | 5634 ASSERT(!gc_prologue_callbacks_.Contains(pair)); |
5638 return gc_prologue_callbacks_.Add(pair); | 5635 return gc_prologue_callbacks_.Add(pair); |
5639 } | 5636 } |
5640 | 5637 |
(...skipping 822 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6463 // Size of a large chunk is always a multiple of | 6460 // Size of a large chunk is always a multiple of |
6464 // OS::AllocationAlignment() so there is always | 6461 // OS::AllocationAlignment() so there is always |
6465 // enough space for a fake MemoryChunk header. | 6462 // enough space for a fake MemoryChunk header. |
6466 inner->set_owner(lo_space()); | 6463 inner->set_owner(lo_space()); |
6467 inner->SetFlag(MemoryChunk::ABOUT_TO_BE_FREED); | 6464 inner->SetFlag(MemoryChunk::ABOUT_TO_BE_FREED); |
6468 inner = MemoryChunk::FromAddress( | 6465 inner = MemoryChunk::FromAddress( |
6469 inner->address() + Page::kPageSize); | 6466 inner->address() + Page::kPageSize); |
6470 } | 6467 } |
6471 } | 6468 } |
6472 } | 6469 } |
| 6470 isolate_->heap()->store_buffer()->Compact(); |
6473 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED); | 6471 isolate_->heap()->store_buffer()->Filter(MemoryChunk::ABOUT_TO_BE_FREED); |
6474 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) { | 6472 for (chunk = chunks_queued_for_free_; chunk != NULL; chunk = next) { |
6475 next = chunk->next_chunk(); | 6473 next = chunk->next_chunk(); |
6476 isolate_->memory_allocator()->Free(chunk); | 6474 isolate_->memory_allocator()->Free(chunk); |
6477 } | 6475 } |
6478 chunks_queued_for_free_ = NULL; | 6476 chunks_queued_for_free_ = NULL; |
6479 } | 6477 } |
6480 | 6478 |
6481 } } // namespace v8::internal | 6479 } } // namespace v8::internal |
OLD | NEW |