Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(868)

Side by Side Diff: src/heap.cc

Issue 5188006: Push version 2.5.7 to trunk.... (Closed) Base URL: http://v8.googlecode.com/svn/trunk/
Patch Set: Created 10 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/heap.h ('k') | src/heap-profiler.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2010 the V8 project authors. All rights reserved. 1 // Copyright 2010 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 20 matching lines...) Expand all
31 #include "api.h" 31 #include "api.h"
32 #include "bootstrapper.h" 32 #include "bootstrapper.h"
33 #include "codegen-inl.h" 33 #include "codegen-inl.h"
34 #include "compilation-cache.h" 34 #include "compilation-cache.h"
35 #include "debug.h" 35 #include "debug.h"
36 #include "heap-profiler.h" 36 #include "heap-profiler.h"
37 #include "global-handles.h" 37 #include "global-handles.h"
38 #include "mark-compact.h" 38 #include "mark-compact.h"
39 #include "natives.h" 39 #include "natives.h"
40 #include "objects-visiting.h" 40 #include "objects-visiting.h"
41 #include "scanner.h" 41 #include "scanner-base.h"
42 #include "scopeinfo.h" 42 #include "scopeinfo.h"
43 #include "snapshot.h" 43 #include "snapshot.h"
44 #include "v8threads.h" 44 #include "v8threads.h"
45 #if V8_TARGET_ARCH_ARM && !V8_INTERPRETED_REGEXP 45 #if V8_TARGET_ARCH_ARM && !V8_INTERPRETED_REGEXP
46 #include "regexp-macro-assembler.h" 46 #include "regexp-macro-assembler.h"
47 #include "arm/regexp-macro-assembler-arm.h" 47 #include "arm/regexp-macro-assembler-arm.h"
48 #endif 48 #endif
49 49
50 50
51 namespace v8 { 51 namespace v8 {
(...skipping 20 matching lines...) Expand all
72 intptr_t Heap::old_gen_allocation_limit_ = kMinimumAllocationLimit; 72 intptr_t Heap::old_gen_allocation_limit_ = kMinimumAllocationLimit;
73 73
74 int Heap::old_gen_exhausted_ = false; 74 int Heap::old_gen_exhausted_ = false;
75 75
76 int Heap::amount_of_external_allocated_memory_ = 0; 76 int Heap::amount_of_external_allocated_memory_ = 0;
77 int Heap::amount_of_external_allocated_memory_at_last_global_gc_ = 0; 77 int Heap::amount_of_external_allocated_memory_at_last_global_gc_ = 0;
78 78
79 // semispace_size_ should be a power of 2 and old_generation_size_ should be 79 // semispace_size_ should be a power of 2 and old_generation_size_ should be
80 // a multiple of Page::kPageSize. 80 // a multiple of Page::kPageSize.
81 #if defined(ANDROID) 81 #if defined(ANDROID)
82 int Heap::max_semispace_size_ = 2*MB; 82 static const int default_max_semispace_size_ = 2*MB;
83 intptr_t Heap::max_old_generation_size_ = 192*MB; 83 intptr_t Heap::max_old_generation_size_ = 192*MB;
84 int Heap::initial_semispace_size_ = 128*KB; 84 int Heap::initial_semispace_size_ = 128*KB;
85 intptr_t Heap::code_range_size_ = 0; 85 intptr_t Heap::code_range_size_ = 0;
86 intptr_t Heap::max_executable_size_ = max_old_generation_size_; 86 intptr_t Heap::max_executable_size_ = max_old_generation_size_;
87 #elif defined(V8_TARGET_ARCH_X64) 87 #elif defined(V8_TARGET_ARCH_X64)
88 int Heap::max_semispace_size_ = 16*MB; 88 static const int default_max_semispace_size_ = 16*MB;
89 intptr_t Heap::max_old_generation_size_ = 1*GB; 89 intptr_t Heap::max_old_generation_size_ = 1*GB;
90 int Heap::initial_semispace_size_ = 1*MB; 90 int Heap::initial_semispace_size_ = 1*MB;
91 intptr_t Heap::code_range_size_ = 512*MB; 91 intptr_t Heap::code_range_size_ = 512*MB;
92 intptr_t Heap::max_executable_size_ = 256*MB; 92 intptr_t Heap::max_executable_size_ = 256*MB;
93 #else 93 #else
94 int Heap::max_semispace_size_ = 8*MB; 94 static const int default_max_semispace_size_ = 8*MB;
95 intptr_t Heap::max_old_generation_size_ = 512*MB; 95 intptr_t Heap::max_old_generation_size_ = 512*MB;
96 int Heap::initial_semispace_size_ = 512*KB; 96 int Heap::initial_semispace_size_ = 512*KB;
97 intptr_t Heap::code_range_size_ = 0; 97 intptr_t Heap::code_range_size_ = 0;
98 intptr_t Heap::max_executable_size_ = 128*MB; 98 intptr_t Heap::max_executable_size_ = 128*MB;
99 #endif 99 #endif
100 100
101 // Allow build-time customization of the max semispace size. Building
102 // V8 with snapshots and a non-default max semispace size is much
103 // easier if you can define it as part of the build environment.
104 #if defined(V8_MAX_SEMISPACE_SIZE)
105 int Heap::max_semispace_size_ = V8_MAX_SEMISPACE_SIZE;
106 #else
107 int Heap::max_semispace_size_ = default_max_semispace_size_;
108 #endif
109
101 // The snapshot semispace size will be the default semispace size if 110 // The snapshot semispace size will be the default semispace size if
102 // snapshotting is used and will be the requested semispace size as 111 // snapshotting is used and will be the requested semispace size as
103 // set up by ConfigureHeap otherwise. 112 // set up by ConfigureHeap otherwise.
104 int Heap::reserved_semispace_size_ = Heap::max_semispace_size_; 113 int Heap::reserved_semispace_size_ = Heap::max_semispace_size_;
105 114
106 List<Heap::GCPrologueCallbackPair> Heap::gc_prologue_callbacks_; 115 List<Heap::GCPrologueCallbackPair> Heap::gc_prologue_callbacks_;
107 List<Heap::GCEpilogueCallbackPair> Heap::gc_epilogue_callbacks_; 116 List<Heap::GCEpilogueCallbackPair> Heap::gc_epilogue_callbacks_;
108 117
109 GCCallback Heap::global_gc_prologue_callback_ = NULL; 118 GCCallback Heap::global_gc_prologue_callback_ = NULL;
110 GCCallback Heap::global_gc_epilogue_callback_ = NULL; 119 GCCallback Heap::global_gc_epilogue_callback_ = NULL;
(...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 397
389 #if defined(DEBUG) || defined(ENABLE_LOGGING_AND_PROFILING) 398 #if defined(DEBUG) || defined(ENABLE_LOGGING_AND_PROFILING)
390 ReportStatisticsBeforeGC(); 399 ReportStatisticsBeforeGC();
391 #endif 400 #endif
392 } 401 }
393 402
394 intptr_t Heap::SizeOfObjects() { 403 intptr_t Heap::SizeOfObjects() {
395 intptr_t total = 0; 404 intptr_t total = 0;
396 AllSpaces spaces; 405 AllSpaces spaces;
397 for (Space* space = spaces.next(); space != NULL; space = spaces.next()) { 406 for (Space* space = spaces.next(); space != NULL; space = spaces.next()) {
398 total += space->Size(); 407 total += space->SizeOfObjects();
399 } 408 }
400 return total; 409 return total;
401 } 410 }
402 411
403 void Heap::GarbageCollectionEpilogue() { 412 void Heap::GarbageCollectionEpilogue() {
404 #ifdef DEBUG 413 #ifdef DEBUG
405 allow_allocation(true); 414 allow_allocation(true);
406 ZapFromSpace(); 415 ZapFromSpace();
407 416
408 if (FLAG_verify_heap) { 417 if (FLAG_verify_heap) {
(...skipping 2824 matching lines...) Expand 10 before | Expand all | Expand 10 after
3233 return result; 3242 return result;
3234 } 3243 }
3235 3244
3236 3245
3237 MaybeObject* Heap::AllocateStringFromUtf8(Vector<const char> string, 3246 MaybeObject* Heap::AllocateStringFromUtf8(Vector<const char> string,
3238 PretenureFlag pretenure) { 3247 PretenureFlag pretenure) {
3239 // V8 only supports characters in the Basic Multilingual Plane. 3248 // V8 only supports characters in the Basic Multilingual Plane.
3240 const uc32 kMaxSupportedChar = 0xFFFF; 3249 const uc32 kMaxSupportedChar = 0xFFFF;
3241 // Count the number of characters in the UTF-8 string and check if 3250 // Count the number of characters in the UTF-8 string and check if
3242 // it is an ASCII string. 3251 // it is an ASCII string.
3243 Access<Scanner::Utf8Decoder> decoder(Scanner::utf8_decoder()); 3252 Access<ScannerConstants::Utf8Decoder>
3253 decoder(ScannerConstants::utf8_decoder());
3244 decoder->Reset(string.start(), string.length()); 3254 decoder->Reset(string.start(), string.length());
3245 int chars = 0; 3255 int chars = 0;
3246 bool is_ascii = true; 3256 bool is_ascii = true;
3247 while (decoder->has_more()) { 3257 while (decoder->has_more()) {
3248 uc32 r = decoder->GetNext(); 3258 uc32 r = decoder->GetNext();
3249 if (r > String::kMaxAsciiCharCode) is_ascii = false; 3259 if (r > String::kMaxAsciiCharCode) is_ascii = false;
3250 chars++; 3260 chars++;
3251 } 3261 }
3252 3262
3253 // If the string is ascii, we do not need to convert the characters 3263 // If the string is ascii, we do not need to convert the characters
(...skipping 1138 matching lines...) Expand 10 before | Expand all | Expand 10 after
4392 *stats->map_space_capacity = map_space_->Capacity(); 4402 *stats->map_space_capacity = map_space_->Capacity();
4393 *stats->cell_space_size = cell_space_->Size(); 4403 *stats->cell_space_size = cell_space_->Size();
4394 *stats->cell_space_capacity = cell_space_->Capacity(); 4404 *stats->cell_space_capacity = cell_space_->Capacity();
4395 *stats->lo_space_size = lo_space_->Size(); 4405 *stats->lo_space_size = lo_space_->Size();
4396 GlobalHandles::RecordStats(stats); 4406 GlobalHandles::RecordStats(stats);
4397 *stats->memory_allocator_size = MemoryAllocator::Size(); 4407 *stats->memory_allocator_size = MemoryAllocator::Size();
4398 *stats->memory_allocator_capacity = 4408 *stats->memory_allocator_capacity =
4399 MemoryAllocator::Size() + MemoryAllocator::Available(); 4409 MemoryAllocator::Size() + MemoryAllocator::Available();
4400 *stats->os_error = OS::GetLastError(); 4410 *stats->os_error = OS::GetLastError();
4401 if (take_snapshot) { 4411 if (take_snapshot) {
4402 HeapIterator iterator; 4412 HeapIterator iterator(HeapIterator::kPreciseFiltering);
4403 for (HeapObject* obj = iterator.next(); 4413 for (HeapObject* obj = iterator.next();
4404 obj != NULL; 4414 obj != NULL;
4405 obj = iterator.next()) { 4415 obj = iterator.next()) {
4406 // Note: snapshot won't be precise because IsFreeListNode returns true
4407 // for any bytearray.
4408 if (FreeListNode::IsFreeListNode(obj)) continue;
4409 InstanceType type = obj->map()->instance_type(); 4416 InstanceType type = obj->map()->instance_type();
4410 ASSERT(0 <= type && type <= LAST_TYPE); 4417 ASSERT(0 <= type && type <= LAST_TYPE);
4411 stats->objects_per_type[type]++; 4418 stats->objects_per_type[type]++;
4412 stats->size_per_type[type] += obj->Size(); 4419 stats->size_per_type[type] += obj->Size();
4413 } 4420 }
4414 } 4421 }
4415 } 4422 }
4416 4423
4417 4424
4418 intptr_t Heap::PromotedSpaceSize() { 4425 intptr_t Heap::PromotedSpaceSize() {
(...skipping 334 matching lines...) Expand 10 before | Expand all | Expand 10 after
4753 case OLD_DATA_SPACE: 4760 case OLD_DATA_SPACE:
4754 return Heap::old_data_space(); 4761 return Heap::old_data_space();
4755 case CODE_SPACE: 4762 case CODE_SPACE:
4756 return Heap::code_space(); 4763 return Heap::code_space();
4757 default: 4764 default:
4758 return NULL; 4765 return NULL;
4759 } 4766 }
4760 } 4767 }
4761 4768
4762 4769
4763 SpaceIterator::SpaceIterator() : current_space_(FIRST_SPACE), iterator_(NULL) { 4770 SpaceIterator::SpaceIterator()
4771 : current_space_(FIRST_SPACE),
4772 iterator_(NULL),
4773 size_func_(NULL) {
4774 }
4775
4776
4777 SpaceIterator::SpaceIterator(HeapObjectCallback size_func)
4778 : current_space_(FIRST_SPACE),
4779 iterator_(NULL),
4780 size_func_(size_func) {
4764 } 4781 }
4765 4782
4766 4783
4767 SpaceIterator::~SpaceIterator() { 4784 SpaceIterator::~SpaceIterator() {
4768 // Delete active iterator if any. 4785 // Delete active iterator if any.
4769 delete iterator_; 4786 delete iterator_;
4770 } 4787 }
4771 4788
4772 4789
4773 bool SpaceIterator::has_next() { 4790 bool SpaceIterator::has_next() {
(...skipping 17 matching lines...) Expand all
4791 return CreateIterator(); 4808 return CreateIterator();
4792 } 4809 }
4793 4810
4794 4811
4795 // Create an iterator for the space to iterate. 4812 // Create an iterator for the space to iterate.
4796 ObjectIterator* SpaceIterator::CreateIterator() { 4813 ObjectIterator* SpaceIterator::CreateIterator() {
4797 ASSERT(iterator_ == NULL); 4814 ASSERT(iterator_ == NULL);
4798 4815
4799 switch (current_space_) { 4816 switch (current_space_) {
4800 case NEW_SPACE: 4817 case NEW_SPACE:
4801 iterator_ = new SemiSpaceIterator(Heap::new_space()); 4818 iterator_ = new SemiSpaceIterator(Heap::new_space(), size_func_);
4802 break; 4819 break;
4803 case OLD_POINTER_SPACE: 4820 case OLD_POINTER_SPACE:
4804 iterator_ = new HeapObjectIterator(Heap::old_pointer_space()); 4821 iterator_ = new HeapObjectIterator(Heap::old_pointer_space(), size_func_);
4805 break; 4822 break;
4806 case OLD_DATA_SPACE: 4823 case OLD_DATA_SPACE:
4807 iterator_ = new HeapObjectIterator(Heap::old_data_space()); 4824 iterator_ = new HeapObjectIterator(Heap::old_data_space(), size_func_);
4808 break; 4825 break;
4809 case CODE_SPACE: 4826 case CODE_SPACE:
4810 iterator_ = new HeapObjectIterator(Heap::code_space()); 4827 iterator_ = new HeapObjectIterator(Heap::code_space(), size_func_);
4811 break; 4828 break;
4812 case MAP_SPACE: 4829 case MAP_SPACE:
4813 iterator_ = new HeapObjectIterator(Heap::map_space()); 4830 iterator_ = new HeapObjectIterator(Heap::map_space(), size_func_);
4814 break; 4831 break;
4815 case CELL_SPACE: 4832 case CELL_SPACE:
4816 iterator_ = new HeapObjectIterator(Heap::cell_space()); 4833 iterator_ = new HeapObjectIterator(Heap::cell_space(), size_func_);
4817 break; 4834 break;
4818 case LO_SPACE: 4835 case LO_SPACE:
4819 iterator_ = new LargeObjectIterator(Heap::lo_space()); 4836 iterator_ = new LargeObjectIterator(Heap::lo_space(), size_func_);
4820 break; 4837 break;
4821 } 4838 }
4822 4839
4823 // Return the newly allocated iterator; 4840 // Return the newly allocated iterator;
4824 ASSERT(iterator_ != NULL); 4841 ASSERT(iterator_ != NULL);
4825 return iterator_; 4842 return iterator_;
4826 } 4843 }
4827 4844
4828 4845
4829 HeapIterator::HeapIterator() { 4846 class FreeListNodesFilter {
4847 public:
4848 FreeListNodesFilter() {
4849 MarkFreeListNodes();
4850 }
4851
4852 inline bool IsFreeListNode(HeapObject* object) {
4853 if (object->IsMarked()) {
4854 object->ClearMark();
4855 return true;
4856 } else {
4857 return false;
4858 }
4859 }
4860
4861 private:
4862 void MarkFreeListNodes() {
4863 Heap::old_pointer_space()->MarkFreeListNodes();
4864 Heap::old_data_space()->MarkFreeListNodes();
4865 MarkCodeSpaceFreeListNodes();
4866 Heap::map_space()->MarkFreeListNodes();
4867 Heap::cell_space()->MarkFreeListNodes();
4868 }
4869
4870 void MarkCodeSpaceFreeListNodes() {
4871 // For code space, using FreeListNode::IsFreeListNode is OK.
4872 HeapObjectIterator iter(Heap::code_space());
4873 for (HeapObject* obj = iter.next_object();
4874 obj != NULL;
4875 obj = iter.next_object()) {
4876 if (FreeListNode::IsFreeListNode(obj)) obj->SetMark();
4877 }
4878 }
4879
4880 AssertNoAllocation no_alloc;
4881 };
4882
4883
4884 HeapIterator::HeapIterator()
4885 : filtering_(HeapIterator::kNoFiltering),
4886 filter_(NULL) {
4887 Init();
4888 }
4889
4890
4891 HeapIterator::HeapIterator(HeapIterator::FreeListNodesFiltering filtering)
4892 : filtering_(filtering),
4893 filter_(NULL) {
4830 Init(); 4894 Init();
4831 } 4895 }
4832 4896
4833 4897
4834 HeapIterator::~HeapIterator() { 4898 HeapIterator::~HeapIterator() {
4835 Shutdown(); 4899 Shutdown();
4836 } 4900 }
4837 4901
4838 4902
4839 void HeapIterator::Init() { 4903 void HeapIterator::Init() {
4840 // Start the iteration. 4904 // Start the iteration.
4841 space_iterator_ = new SpaceIterator(); 4905 if (filtering_ == kPreciseFiltering) {
4906 filter_ = new FreeListNodesFilter;
4907 space_iterator_ =
4908 new SpaceIterator(MarkCompactCollector::SizeOfMarkedObject);
4909 } else {
4910 space_iterator_ = new SpaceIterator;
4911 }
4842 object_iterator_ = space_iterator_->next(); 4912 object_iterator_ = space_iterator_->next();
4843 } 4913 }
4844 4914
4845 4915
4846 void HeapIterator::Shutdown() { 4916 void HeapIterator::Shutdown() {
4917 #ifdef DEBUG
4918 // Assert that in precise mode we have iterated through all
4919 // objects. Otherwise, heap will be left in an inconsistent state.
4920 if (filtering_ == kPreciseFiltering) {
4921 ASSERT(object_iterator_ == NULL);
4922 }
4923 #endif
4847 // Make sure the last iterator is deallocated. 4924 // Make sure the last iterator is deallocated.
4848 delete space_iterator_; 4925 delete space_iterator_;
4849 space_iterator_ = NULL; 4926 space_iterator_ = NULL;
4850 object_iterator_ = NULL; 4927 object_iterator_ = NULL;
4928 delete filter_;
4929 filter_ = NULL;
4851 } 4930 }
4852 4931
4853 4932
4854 HeapObject* HeapIterator::next() { 4933 HeapObject* HeapIterator::next() {
4934 if (filter_ == NULL) return NextObject();
4935
4936 HeapObject* obj = NextObject();
4937 while (obj != NULL && filter_->IsFreeListNode(obj)) obj = NextObject();
4938 return obj;
4939 }
4940
4941
4942 HeapObject* HeapIterator::NextObject() {
4855 // No iterator means we are done. 4943 // No iterator means we are done.
4856 if (object_iterator_ == NULL) return NULL; 4944 if (object_iterator_ == NULL) return NULL;
4857 4945
4858 if (HeapObject* obj = object_iterator_->next_object()) { 4946 if (HeapObject* obj = object_iterator_->next_object()) {
4859 // If the current iterator has more objects we are fine. 4947 // If the current iterator has more objects we are fine.
4860 return obj; 4948 return obj;
4861 } else { 4949 } else {
4862 // Go though the spaces looking for one that has objects. 4950 // Go though the spaces looking for one that has objects.
4863 while (space_iterator_->has_next()) { 4951 while (space_iterator_->has_next()) {
4864 object_iterator_ = space_iterator_->next(); 4952 object_iterator_ = space_iterator_->next();
(...skipping 421 matching lines...) Expand 10 before | Expand all | Expand 10 after
5286 void ExternalStringTable::TearDown() { 5374 void ExternalStringTable::TearDown() {
5287 new_space_strings_.Free(); 5375 new_space_strings_.Free();
5288 old_space_strings_.Free(); 5376 old_space_strings_.Free();
5289 } 5377 }
5290 5378
5291 5379
5292 List<Object*> ExternalStringTable::new_space_strings_; 5380 List<Object*> ExternalStringTable::new_space_strings_;
5293 List<Object*> ExternalStringTable::old_space_strings_; 5381 List<Object*> ExternalStringTable::old_space_strings_;
5294 5382
5295 } } // namespace v8::internal 5383 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/heap.h ('k') | src/heap-profiler.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698