| OLD | NEW |
| 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 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 56 Object* Heap::roots_[Heap::kRootListLength]; | 56 Object* Heap::roots_[Heap::kRootListLength]; |
| 57 | 57 |
| 58 NewSpace Heap::new_space_; | 58 NewSpace Heap::new_space_; |
| 59 OldSpace* Heap::old_pointer_space_ = NULL; | 59 OldSpace* Heap::old_pointer_space_ = NULL; |
| 60 OldSpace* Heap::old_data_space_ = NULL; | 60 OldSpace* Heap::old_data_space_ = NULL; |
| 61 OldSpace* Heap::code_space_ = NULL; | 61 OldSpace* Heap::code_space_ = NULL; |
| 62 MapSpace* Heap::map_space_ = NULL; | 62 MapSpace* Heap::map_space_ = NULL; |
| 63 CellSpace* Heap::cell_space_ = NULL; | 63 CellSpace* Heap::cell_space_ = NULL; |
| 64 LargeObjectSpace* Heap::lo_space_ = NULL; | 64 LargeObjectSpace* Heap::lo_space_ = NULL; |
| 65 | 65 |
| 66 int Heap::old_gen_promotion_limit_ = kMinimumPromotionLimit; | 66 intptr_t Heap::old_gen_promotion_limit_ = kMinimumPromotionLimit; |
| 67 int Heap::old_gen_allocation_limit_ = kMinimumAllocationLimit; | 67 intptr_t Heap::old_gen_allocation_limit_ = kMinimumAllocationLimit; |
| 68 | 68 |
| 69 int Heap::old_gen_exhausted_ = false; | 69 int Heap::old_gen_exhausted_ = false; |
| 70 | 70 |
| 71 int Heap::amount_of_external_allocated_memory_ = 0; | 71 int Heap::amount_of_external_allocated_memory_ = 0; |
| 72 int Heap::amount_of_external_allocated_memory_at_last_global_gc_ = 0; | 72 int Heap::amount_of_external_allocated_memory_at_last_global_gc_ = 0; |
| 73 | 73 |
| 74 // semispace_size_ should be a power of 2 and old_generation_size_ should be | 74 // semispace_size_ should be a power of 2 and old_generation_size_ should be |
| 75 // a multiple of Page::kPageSize. | 75 // a multiple of Page::kPageSize. |
| 76 #if defined(ANDROID) | 76 #if defined(ANDROID) |
| 77 int Heap::max_semispace_size_ = 2*MB; | 77 int Heap::max_semispace_size_ = 2*MB; |
| 78 int Heap::max_old_generation_size_ = 192*MB; | 78 intptr_t Heap::max_old_generation_size_ = 192*MB; |
| 79 int Heap::initial_semispace_size_ = 128*KB; | 79 int Heap::initial_semispace_size_ = 128*KB; |
| 80 size_t Heap::code_range_size_ = 0; | 80 size_t Heap::code_range_size_ = 0; |
| 81 #elif defined(V8_TARGET_ARCH_X64) | 81 #elif defined(V8_TARGET_ARCH_X64) |
| 82 int Heap::max_semispace_size_ = 16*MB; | 82 int Heap::max_semispace_size_ = 16*MB; |
| 83 int Heap::max_old_generation_size_ = 1*GB; | 83 intptr_t Heap::max_old_generation_size_ = 1*GB; |
| 84 int Heap::initial_semispace_size_ = 1*MB; | 84 int Heap::initial_semispace_size_ = 1*MB; |
| 85 size_t Heap::code_range_size_ = 512*MB; | 85 size_t Heap::code_range_size_ = 512*MB; |
| 86 #else | 86 #else |
| 87 int Heap::max_semispace_size_ = 8*MB; | 87 int Heap::max_semispace_size_ = 8*MB; |
| 88 int Heap::max_old_generation_size_ = 512*MB; | 88 intptr_t Heap::max_old_generation_size_ = 512*MB; |
| 89 int Heap::initial_semispace_size_ = 512*KB; | 89 int Heap::initial_semispace_size_ = 512*KB; |
| 90 size_t Heap::code_range_size_ = 0; | 90 size_t Heap::code_range_size_ = 0; |
| 91 #endif | 91 #endif |
| 92 | 92 |
| 93 // The snapshot semispace size will be the default semispace size if | 93 // The snapshot semispace size will be the default semispace size if |
| 94 // snapshotting is used and will be the requested semispace size as | 94 // snapshotting is used and will be the requested semispace size as |
| 95 // set up by ConfigureHeap otherwise. | 95 // set up by ConfigureHeap otherwise. |
| 96 int Heap::reserved_semispace_size_ = Heap::max_semispace_size_; | 96 int Heap::reserved_semispace_size_ = Heap::max_semispace_size_; |
| 97 | 97 |
| 98 List<Heap::GCPrologueCallbackPair> Heap::gc_prologue_callbacks_; | 98 List<Heap::GCPrologueCallbackPair> Heap::gc_prologue_callbacks_; |
| 99 List<Heap::GCEpilogueCallbackPair> Heap::gc_epilogue_callbacks_; | 99 List<Heap::GCEpilogueCallbackPair> Heap::gc_epilogue_callbacks_; |
| 100 | 100 |
| 101 GCCallback Heap::global_gc_prologue_callback_ = NULL; | 101 GCCallback Heap::global_gc_prologue_callback_ = NULL; |
| 102 GCCallback Heap::global_gc_epilogue_callback_ = NULL; | 102 GCCallback Heap::global_gc_epilogue_callback_ = NULL; |
| 103 HeapObjectCallback Heap::gc_safe_size_of_old_object_ = NULL; | 103 HeapObjectCallback Heap::gc_safe_size_of_old_object_ = NULL; |
| 104 | 104 |
| 105 // Variables set based on semispace_size_ and old_generation_size_ in | 105 // Variables set based on semispace_size_ and old_generation_size_ in |
| 106 // ConfigureHeap. | 106 // ConfigureHeap. |
| 107 | 107 |
| 108 // Will be 4 * reserved_semispace_size_ to ensure that young | 108 // Will be 4 * reserved_semispace_size_ to ensure that young |
| 109 // generation can be aligned to its size. | 109 // generation can be aligned to its size. |
| 110 int Heap::survived_since_last_expansion_ = 0; | 110 int Heap::survived_since_last_expansion_ = 0; |
| 111 int Heap::external_allocation_limit_ = 0; | 111 intptr_t Heap::external_allocation_limit_ = 0; |
| 112 | 112 |
| 113 Heap::HeapState Heap::gc_state_ = NOT_IN_GC; | 113 Heap::HeapState Heap::gc_state_ = NOT_IN_GC; |
| 114 | 114 |
| 115 int Heap::mc_count_ = 0; | 115 int Heap::mc_count_ = 0; |
| 116 int Heap::ms_count_ = 0; | 116 int Heap::ms_count_ = 0; |
| 117 int Heap::gc_count_ = 0; | 117 int Heap::gc_count_ = 0; |
| 118 | 118 |
| 119 GCTracer* Heap::tracer_ = NULL; | 119 GCTracer* Heap::tracer_ = NULL; |
| 120 | 120 |
| 121 int Heap::unflattened_strings_length_ = 0; | 121 int Heap::unflattened_strings_length_ = 0; |
| 122 | 122 |
| 123 int Heap::always_allocate_scope_depth_ = 0; | 123 int Heap::always_allocate_scope_depth_ = 0; |
| 124 int Heap::linear_allocation_scope_depth_ = 0; | 124 int Heap::linear_allocation_scope_depth_ = 0; |
| 125 int Heap::contexts_disposed_ = 0; | 125 int Heap::contexts_disposed_ = 0; |
| 126 | 126 |
| 127 int Heap::young_survivors_after_last_gc_ = 0; | 127 int Heap::young_survivors_after_last_gc_ = 0; |
| 128 int Heap::high_survival_rate_period_length_ = 0; | 128 int Heap::high_survival_rate_period_length_ = 0; |
| 129 double Heap::survival_rate_ = 0; | 129 double Heap::survival_rate_ = 0; |
| 130 Heap::SurvivalRateTrend Heap::previous_survival_rate_trend_ = Heap::STABLE; | 130 Heap::SurvivalRateTrend Heap::previous_survival_rate_trend_ = Heap::STABLE; |
| 131 Heap::SurvivalRateTrend Heap::survival_rate_trend_ = Heap::STABLE; | 131 Heap::SurvivalRateTrend Heap::survival_rate_trend_ = Heap::STABLE; |
| 132 | 132 |
| 133 #ifdef DEBUG | 133 #ifdef DEBUG |
| 134 bool Heap::allocation_allowed_ = true; | 134 bool Heap::allocation_allowed_ = true; |
| 135 | 135 |
| 136 int Heap::allocation_timeout_ = 0; | 136 int Heap::allocation_timeout_ = 0; |
| 137 bool Heap::disallow_allocation_failure_ = false; | 137 bool Heap::disallow_allocation_failure_ = false; |
| 138 #endif // DEBUG | 138 #endif // DEBUG |
| 139 | 139 |
| 140 int GCTracer::alive_after_last_gc_ = 0; | 140 intptr_t GCTracer::alive_after_last_gc_ = 0; |
| 141 double GCTracer::last_gc_end_timestamp_ = 0.0; | 141 double GCTracer::last_gc_end_timestamp_ = 0.0; |
| 142 int GCTracer::max_gc_pause_ = 0; | 142 int GCTracer::max_gc_pause_ = 0; |
| 143 int GCTracer::max_alive_after_gc_ = 0; | 143 intptr_t GCTracer::max_alive_after_gc_ = 0; |
| 144 int GCTracer::min_in_mutator_ = kMaxInt; | 144 int GCTracer::min_in_mutator_ = kMaxInt; |
| 145 | 145 |
| 146 int Heap::Capacity() { | 146 int Heap::Capacity() { |
| 147 if (!HasBeenSetup()) return 0; | 147 if (!HasBeenSetup()) return 0; |
| 148 | 148 |
| 149 return new_space_.Capacity() + | 149 return new_space_.Capacity() + |
| 150 old_pointer_space_->Capacity() + | 150 old_pointer_space_->Capacity() + |
| 151 old_data_space_->Capacity() + | 151 old_data_space_->Capacity() + |
| 152 code_space_->Capacity() + | 152 code_space_->Capacity() + |
| 153 map_space_->Capacity() + | 153 map_space_->Capacity() + |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 new_space_.ReportStatistics(); | 282 new_space_.ReportStatistics(); |
| 283 new_space_.ClearHistograms(); | 283 new_space_.ClearHistograms(); |
| 284 } | 284 } |
| 285 #endif | 285 #endif |
| 286 } | 286 } |
| 287 | 287 |
| 288 | 288 |
| 289 #if defined(ENABLE_LOGGING_AND_PROFILING) | 289 #if defined(ENABLE_LOGGING_AND_PROFILING) |
| 290 void Heap::PrintShortHeapStatistics() { | 290 void Heap::PrintShortHeapStatistics() { |
| 291 if (!FLAG_trace_gc_verbose) return; | 291 if (!FLAG_trace_gc_verbose) return; |
| 292 PrintF("Memory allocator, used: %8d, available: %8d\n", | 292 PrintF("Memory allocator, used: %8" V8_PTR_PREFIX "d" |
| 293 ", available: %8" V8_PTR_PREFIX "d\n", |
| 293 MemoryAllocator::Size(), | 294 MemoryAllocator::Size(), |
| 294 MemoryAllocator::Available()); | 295 MemoryAllocator::Available()); |
| 295 PrintF("New space, used: %8d, available: %8d\n", | 296 PrintF("New space, used: %8" V8_PTR_PREFIX "d" |
| 297 ", available: %8" V8_PTR_PREFIX "d\n", |
| 296 Heap::new_space_.Size(), | 298 Heap::new_space_.Size(), |
| 297 new_space_.Available()); | 299 new_space_.Available()); |
| 298 PrintF("Old pointers, used: %8d, available: %8d, waste: %8d\n", | 300 PrintF("Old pointers, used: %8" V8_PTR_PREFIX "d" |
| 301 ", available: %8" V8_PTR_PREFIX "d" |
| 302 ", waste: %8" V8_PTR_PREFIX "d\n", |
| 299 old_pointer_space_->Size(), | 303 old_pointer_space_->Size(), |
| 300 old_pointer_space_->Available(), | 304 old_pointer_space_->Available(), |
| 301 old_pointer_space_->Waste()); | 305 old_pointer_space_->Waste()); |
| 302 PrintF("Old data space, used: %8d, available: %8d, waste: %8d\n", | 306 PrintF("Old data space, used: %8" V8_PTR_PREFIX "d" |
| 307 ", available: %8" V8_PTR_PREFIX "d" |
| 308 ", waste: %8" V8_PTR_PREFIX "d\n", |
| 303 old_data_space_->Size(), | 309 old_data_space_->Size(), |
| 304 old_data_space_->Available(), | 310 old_data_space_->Available(), |
| 305 old_data_space_->Waste()); | 311 old_data_space_->Waste()); |
| 306 PrintF("Code space, used: %8d, available: %8d, waste: %8d\n", | 312 PrintF("Code space, used: %8" V8_PTR_PREFIX "d" |
| 313 ", available: %8" V8_PTR_PREFIX "d" |
| 314 ", waste: %8" V8_PTR_PREFIX "d\n", |
| 307 code_space_->Size(), | 315 code_space_->Size(), |
| 308 code_space_->Available(), | 316 code_space_->Available(), |
| 309 code_space_->Waste()); | 317 code_space_->Waste()); |
| 310 PrintF("Map space, used: %8d, available: %8d, waste: %8d\n", | 318 PrintF("Map space, used: %8" V8_PTR_PREFIX "d" |
| 319 ", available: %8" V8_PTR_PREFIX "d" |
| 320 ", waste: %8" V8_PTR_PREFIX "d\n", |
| 311 map_space_->Size(), | 321 map_space_->Size(), |
| 312 map_space_->Available(), | 322 map_space_->Available(), |
| 313 map_space_->Waste()); | 323 map_space_->Waste()); |
| 314 PrintF("Cell space, used: %8d, available: %8d, waste: %8d\n", | 324 PrintF("Cell space, used: %8" V8_PTR_PREFIX "d" |
| 325 ", available: %8" V8_PTR_PREFIX "d" |
| 326 ", waste: %8" V8_PTR_PREFIX "d\n", |
| 315 cell_space_->Size(), | 327 cell_space_->Size(), |
| 316 cell_space_->Available(), | 328 cell_space_->Available(), |
| 317 cell_space_->Waste()); | 329 cell_space_->Waste()); |
| 318 PrintF("Large object space, used: %8d, avaialble: %8d\n", | 330 PrintF("Large object space, used: %8" V8_PTR_PREFIX "d" |
| 331 ", available: %8" V8_PTR_PREFIX "d\n", |
| 319 lo_space_->Size(), | 332 lo_space_->Size(), |
| 320 lo_space_->Available()); | 333 lo_space_->Available()); |
| 321 } | 334 } |
| 322 #endif | 335 #endif |
| 323 | 336 |
| 324 | 337 |
| 325 // TODO(1238405): Combine the infrastructure for --heap-stats and | 338 // TODO(1238405): Combine the infrastructure for --heap-stats and |
| 326 // --log-gc to avoid the complicated preprocessor and flag testing. | 339 // --log-gc to avoid the complicated preprocessor and flag testing. |
| 327 void Heap::ReportStatisticsAfterGC() { | 340 void Heap::ReportStatisticsAfterGC() { |
| 328 // Similar to the before GC, we use some complicated logic to ensure that | 341 // Similar to the before GC, we use some complicated logic to ensure that |
| (...skipping 28 matching lines...) Expand all Loading... |
| 357 } | 370 } |
| 358 | 371 |
| 359 if (FLAG_gc_verbose) Print(); | 372 if (FLAG_gc_verbose) Print(); |
| 360 #endif | 373 #endif |
| 361 | 374 |
| 362 #if defined(DEBUG) || defined(ENABLE_LOGGING_AND_PROFILING) | 375 #if defined(DEBUG) || defined(ENABLE_LOGGING_AND_PROFILING) |
| 363 ReportStatisticsBeforeGC(); | 376 ReportStatisticsBeforeGC(); |
| 364 #endif | 377 #endif |
| 365 } | 378 } |
| 366 | 379 |
| 367 int Heap::SizeOfObjects() { | 380 intptr_t Heap::SizeOfObjects() { |
| 368 int total = 0; | 381 intptr_t total = 0; |
| 369 AllSpaces spaces; | 382 AllSpaces spaces; |
| 370 for (Space* space = spaces.next(); space != NULL; space = spaces.next()) { | 383 for (Space* space = spaces.next(); space != NULL; space = spaces.next()) { |
| 371 total += space->Size(); | 384 total += space->Size(); |
| 372 } | 385 } |
| 373 return total; | 386 return total; |
| 374 } | 387 } |
| 375 | 388 |
| 376 void Heap::GarbageCollectionEpilogue() { | 389 void Heap::GarbageCollectionEpilogue() { |
| 377 #ifdef DEBUG | 390 #ifdef DEBUG |
| 378 allow_allocation(true); | 391 allow_allocation(true); |
| (...skipping 576 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 955 old_pointer_space_->FlushTopPageWatermark(); | 968 old_pointer_space_->FlushTopPageWatermark(); |
| 956 map_space_->FlushTopPageWatermark(); | 969 map_space_->FlushTopPageWatermark(); |
| 957 | 970 |
| 958 // Implements Cheney's copying algorithm | 971 // Implements Cheney's copying algorithm |
| 959 LOG(ResourceEvent("scavenge", "begin")); | 972 LOG(ResourceEvent("scavenge", "begin")); |
| 960 | 973 |
| 961 // Clear descriptor cache. | 974 // Clear descriptor cache. |
| 962 DescriptorLookupCache::Clear(); | 975 DescriptorLookupCache::Clear(); |
| 963 | 976 |
| 964 // Used for updating survived_since_last_expansion_ at function end. | 977 // Used for updating survived_since_last_expansion_ at function end. |
| 965 int survived_watermark = PromotedSpaceSize(); | 978 intptr_t survived_watermark = PromotedSpaceSize(); |
| 966 | 979 |
| 967 CheckNewSpaceExpansionCriteria(); | 980 CheckNewSpaceExpansionCriteria(); |
| 968 | 981 |
| 969 // Flip the semispaces. After flipping, to space is empty, from space has | 982 // Flip the semispaces. After flipping, to space is empty, from space has |
| 970 // live objects. | 983 // live objects. |
| 971 new_space_.Flip(); | 984 new_space_.Flip(); |
| 972 new_space_.ResetAllocationInfo(); | 985 new_space_.ResetAllocationInfo(); |
| 973 | 986 |
| 974 // We need to sweep newly copied objects which can be either in the | 987 // We need to sweep newly copied objects which can be either in the |
| 975 // to space or promoted to the old generation. For to-space | 988 // to space or promoted to the old generation. For to-space |
| (...skipping 2513 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3489 | 3502 |
| 3490 | 3503 |
| 3491 // This function expects that NewSpace's allocated objects histogram is | 3504 // This function expects that NewSpace's allocated objects histogram is |
| 3492 // populated (via a call to CollectStatistics or else as a side effect of a | 3505 // populated (via a call to CollectStatistics or else as a side effect of a |
| 3493 // just-completed scavenge collection). | 3506 // just-completed scavenge collection). |
| 3494 void Heap::ReportHeapStatistics(const char* title) { | 3507 void Heap::ReportHeapStatistics(const char* title) { |
| 3495 USE(title); | 3508 USE(title); |
| 3496 PrintF(">>>>>> =============== %s (%d) =============== >>>>>>\n", | 3509 PrintF(">>>>>> =============== %s (%d) =============== >>>>>>\n", |
| 3497 title, gc_count_); | 3510 title, gc_count_); |
| 3498 PrintF("mark-compact GC : %d\n", mc_count_); | 3511 PrintF("mark-compact GC : %d\n", mc_count_); |
| 3499 PrintF("old_gen_promotion_limit_ %d\n", old_gen_promotion_limit_); | 3512 PrintF("old_gen_promotion_limit_ %" V8_PTR_PREFIX "d\n", |
| 3500 PrintF("old_gen_allocation_limit_ %d\n", old_gen_allocation_limit_); | 3513 old_gen_promotion_limit_); |
| 3514 PrintF("old_gen_allocation_limit_ %" V8_PTR_PREFIX "d\n", |
| 3515 old_gen_allocation_limit_); |
| 3501 | 3516 |
| 3502 PrintF("\n"); | 3517 PrintF("\n"); |
| 3503 PrintF("Number of handles : %d\n", HandleScope::NumberOfHandles()); | 3518 PrintF("Number of handles : %d\n", HandleScope::NumberOfHandles()); |
| 3504 GlobalHandles::PrintStats(); | 3519 GlobalHandles::PrintStats(); |
| 3505 PrintF("\n"); | 3520 PrintF("\n"); |
| 3506 | 3521 |
| 3507 PrintF("Heap statistics : "); | 3522 PrintF("Heap statistics : "); |
| 3508 MemoryAllocator::ReportStatistics(); | 3523 MemoryAllocator::ReportStatistics(); |
| 3509 PrintF("To space : "); | 3524 PrintF("To space : "); |
| 3510 new_space_.ReportStatistics(); | 3525 new_space_.ReportStatistics(); |
| (...skipping 551 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4062 | 4077 |
| 4063 // The old generation is paged. | 4078 // The old generation is paged. |
| 4064 max_old_generation_size_ = RoundUp(max_old_generation_size_, Page::kPageSize); | 4079 max_old_generation_size_ = RoundUp(max_old_generation_size_, Page::kPageSize); |
| 4065 | 4080 |
| 4066 heap_configured = true; | 4081 heap_configured = true; |
| 4067 return true; | 4082 return true; |
| 4068 } | 4083 } |
| 4069 | 4084 |
| 4070 | 4085 |
| 4071 bool Heap::ConfigureHeapDefault() { | 4086 bool Heap::ConfigureHeapDefault() { |
| 4072 return ConfigureHeap(FLAG_max_new_space_size / 2, FLAG_max_old_space_size); | 4087 return ConfigureHeap( |
| 4088 FLAG_max_new_space_size * (KB / 2), FLAG_max_old_space_size * MB); |
| 4073 } | 4089 } |
| 4074 | 4090 |
| 4075 | 4091 |
| 4076 void Heap::RecordStats(HeapStats* stats, bool take_snapshot) { | 4092 void Heap::RecordStats(HeapStats* stats, bool take_snapshot) { |
| 4077 *stats->start_marker = HeapStats::kStartMarker; | 4093 *stats->start_marker = HeapStats::kStartMarker; |
| 4078 *stats->end_marker = HeapStats::kEndMarker; | 4094 *stats->end_marker = HeapStats::kEndMarker; |
| 4079 *stats->new_space_size = new_space_.Size(); | 4095 *stats->new_space_size = new_space_.Size(); |
| 4080 *stats->new_space_capacity = new_space_.Capacity(); | 4096 *stats->new_space_capacity = new_space_.Capacity(); |
| 4081 *stats->old_pointer_space_size = old_pointer_space_->Size(); | 4097 *stats->old_pointer_space_size = old_pointer_space_->Size(); |
| 4082 *stats->old_pointer_space_capacity = old_pointer_space_->Capacity(); | 4098 *stats->old_pointer_space_capacity = old_pointer_space_->Capacity(); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 4104 if (FreeListNode::IsFreeListNode(obj)) continue; | 4120 if (FreeListNode::IsFreeListNode(obj)) continue; |
| 4105 InstanceType type = obj->map()->instance_type(); | 4121 InstanceType type = obj->map()->instance_type(); |
| 4106 ASSERT(0 <= type && type <= LAST_TYPE); | 4122 ASSERT(0 <= type && type <= LAST_TYPE); |
| 4107 stats->objects_per_type[type]++; | 4123 stats->objects_per_type[type]++; |
| 4108 stats->size_per_type[type] += obj->Size(); | 4124 stats->size_per_type[type] += obj->Size(); |
| 4109 } | 4125 } |
| 4110 } | 4126 } |
| 4111 } | 4127 } |
| 4112 | 4128 |
| 4113 | 4129 |
| 4114 int Heap::PromotedSpaceSize() { | 4130 intptr_t Heap::PromotedSpaceSize() { |
| 4115 return old_pointer_space_->Size() | 4131 return old_pointer_space_->Size() |
| 4116 + old_data_space_->Size() | 4132 + old_data_space_->Size() |
| 4117 + code_space_->Size() | 4133 + code_space_->Size() |
| 4118 + map_space_->Size() | 4134 + map_space_->Size() |
| 4119 + cell_space_->Size() | 4135 + cell_space_->Size() |
| 4120 + lo_space_->Size(); | 4136 + lo_space_->Size(); |
| 4121 } | 4137 } |
| 4122 | 4138 |
| 4123 | 4139 |
| 4124 int Heap::PromotedExternalMemorySize() { | 4140 int Heap::PromotedExternalMemorySize() { |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4250 | 4266 |
| 4251 | 4267 |
| 4252 void Heap::TearDown() { | 4268 void Heap::TearDown() { |
| 4253 if (FLAG_print_cumulative_gc_stat) { | 4269 if (FLAG_print_cumulative_gc_stat) { |
| 4254 PrintF("\n\n"); | 4270 PrintF("\n\n"); |
| 4255 PrintF("gc_count=%d ", gc_count_); | 4271 PrintF("gc_count=%d ", gc_count_); |
| 4256 PrintF("mark_sweep_count=%d ", ms_count_); | 4272 PrintF("mark_sweep_count=%d ", ms_count_); |
| 4257 PrintF("mark_compact_count=%d ", mc_count_); | 4273 PrintF("mark_compact_count=%d ", mc_count_); |
| 4258 PrintF("max_gc_pause=%d ", GCTracer::get_max_gc_pause()); | 4274 PrintF("max_gc_pause=%d ", GCTracer::get_max_gc_pause()); |
| 4259 PrintF("min_in_mutator=%d ", GCTracer::get_min_in_mutator()); | 4275 PrintF("min_in_mutator=%d ", GCTracer::get_min_in_mutator()); |
| 4260 PrintF("max_alive_after_gc=%d ", GCTracer::get_max_alive_after_gc()); | 4276 PrintF("max_alive_after_gc=%" V8_PTR_PREFIX "d ", |
| 4277 GCTracer::get_max_alive_after_gc()); |
| 4261 PrintF("\n\n"); | 4278 PrintF("\n\n"); |
| 4262 } | 4279 } |
| 4263 | 4280 |
| 4264 GlobalHandles::TearDown(); | 4281 GlobalHandles::TearDown(); |
| 4265 | 4282 |
| 4266 ExternalStringTable::TearDown(); | 4283 ExternalStringTable::TearDown(); |
| 4267 | 4284 |
| 4268 new_space_.TearDown(); | 4285 new_space_.TearDown(); |
| 4269 | 4286 |
| 4270 if (old_pointer_space_ != NULL) { | 4287 if (old_pointer_space_ != NULL) { |
| (...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4376 UNREACHABLE(); | 4393 UNREACHABLE(); |
| 4377 } | 4394 } |
| 4378 | 4395 |
| 4379 | 4396 |
| 4380 #ifdef DEBUG | 4397 #ifdef DEBUG |
| 4381 | 4398 |
| 4382 class PrintHandleVisitor: public ObjectVisitor { | 4399 class PrintHandleVisitor: public ObjectVisitor { |
| 4383 public: | 4400 public: |
| 4384 void VisitPointers(Object** start, Object** end) { | 4401 void VisitPointers(Object** start, Object** end) { |
| 4385 for (Object** p = start; p < end; p++) | 4402 for (Object** p = start; p < end; p++) |
| 4386 PrintF(" handle %p to %p\n", p, *p); | 4403 PrintF(" handle %p to %p\n", |
| 4404 reinterpret_cast<void*>(p), |
| 4405 reinterpret_cast<void*>(*p)); |
| 4387 } | 4406 } |
| 4388 }; | 4407 }; |
| 4389 | 4408 |
| 4390 void Heap::PrintHandles() { | 4409 void Heap::PrintHandles() { |
| 4391 PrintF("Handles:\n"); | 4410 PrintF("Handles:\n"); |
| 4392 PrintHandleVisitor v; | 4411 PrintHandleVisitor v; |
| 4393 HandleScopeImplementer::Iterate(&v); | 4412 HandleScopeImplementer::Iterate(&v); |
| 4394 } | 4413 } |
| 4395 | 4414 |
| 4396 #endif | 4415 #endif |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4729 void Heap::TracePathToGlobal() { | 4748 void Heap::TracePathToGlobal() { |
| 4730 search_target = NULL; | 4749 search_target = NULL; |
| 4731 search_for_any_global = true; | 4750 search_for_any_global = true; |
| 4732 | 4751 |
| 4733 MarkRootVisitor root_visitor; | 4752 MarkRootVisitor root_visitor; |
| 4734 IterateRoots(&root_visitor, VISIT_ONLY_STRONG); | 4753 IterateRoots(&root_visitor, VISIT_ONLY_STRONG); |
| 4735 } | 4754 } |
| 4736 #endif | 4755 #endif |
| 4737 | 4756 |
| 4738 | 4757 |
| 4739 static int CountTotalHolesSize() { | 4758 static intptr_t CountTotalHolesSize() { |
| 4740 int holes_size = 0; | 4759 intptr_t holes_size = 0; |
| 4741 OldSpaces spaces; | 4760 OldSpaces spaces; |
| 4742 for (OldSpace* space = spaces.next(); | 4761 for (OldSpace* space = spaces.next(); |
| 4743 space != NULL; | 4762 space != NULL; |
| 4744 space = spaces.next()) { | 4763 space = spaces.next()) { |
| 4745 holes_size += space->Waste() + space->AvailableFree(); | 4764 holes_size += space->Waste() + space->AvailableFree(); |
| 4746 } | 4765 } |
| 4747 return holes_size; | 4766 return holes_size; |
| 4748 } | 4767 } |
| 4749 | 4768 |
| 4750 | 4769 |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4828 UNREACHABLE(); | 4847 UNREACHABLE(); |
| 4829 } | 4848 } |
| 4830 PrintF(" "); | 4849 PrintF(" "); |
| 4831 | 4850 |
| 4832 PrintF("external=%d ", static_cast<int>(scopes_[Scope::EXTERNAL])); | 4851 PrintF("external=%d ", static_cast<int>(scopes_[Scope::EXTERNAL])); |
| 4833 PrintF("mark=%d ", static_cast<int>(scopes_[Scope::MC_MARK])); | 4852 PrintF("mark=%d ", static_cast<int>(scopes_[Scope::MC_MARK])); |
| 4834 PrintF("sweep=%d ", static_cast<int>(scopes_[Scope::MC_SWEEP])); | 4853 PrintF("sweep=%d ", static_cast<int>(scopes_[Scope::MC_SWEEP])); |
| 4835 PrintF("sweepns=%d ", static_cast<int>(scopes_[Scope::MC_SWEEP_NEWSPACE])); | 4854 PrintF("sweepns=%d ", static_cast<int>(scopes_[Scope::MC_SWEEP_NEWSPACE])); |
| 4836 PrintF("compact=%d ", static_cast<int>(scopes_[Scope::MC_COMPACT])); | 4855 PrintF("compact=%d ", static_cast<int>(scopes_[Scope::MC_COMPACT])); |
| 4837 | 4856 |
| 4838 PrintF("total_size_before=%d ", start_size_); | 4857 PrintF("total_size_before=%" V8_PTR_PREFIX "d ", start_size_); |
| 4839 PrintF("total_size_after=%d ", Heap::SizeOfObjects()); | 4858 PrintF("total_size_after=%" V8_PTR_PREFIX "d ", Heap::SizeOfObjects()); |
| 4840 PrintF("holes_size_before=%d ", in_free_list_or_wasted_before_gc_); | 4859 PrintF("holes_size_before=%" V8_PTR_PREFIX "d ", |
| 4841 PrintF("holes_size_after=%d ", CountTotalHolesSize()); | 4860 in_free_list_or_wasted_before_gc_); |
| 4861 PrintF("holes_size_after=%" V8_PTR_PREFIX "d ", CountTotalHolesSize()); |
| 4842 | 4862 |
| 4843 PrintF("allocated=%d ", allocated_since_last_gc_); | 4863 PrintF("allocated=%" V8_PTR_PREFIX "d ", allocated_since_last_gc_); |
| 4844 PrintF("promoted=%d ", promoted_objects_size_); | 4864 PrintF("promoted=%" V8_PTR_PREFIX "d ", promoted_objects_size_); |
| 4845 | 4865 |
| 4846 PrintF("\n"); | 4866 PrintF("\n"); |
| 4847 } | 4867 } |
| 4848 | 4868 |
| 4849 #if defined(ENABLE_LOGGING_AND_PROFILING) | 4869 #if defined(ENABLE_LOGGING_AND_PROFILING) |
| 4850 Heap::PrintShortHeapStatistics(); | 4870 Heap::PrintShortHeapStatistics(); |
| 4851 #endif | 4871 #endif |
| 4852 } | 4872 } |
| 4853 | 4873 |
| 4854 | 4874 |
| (...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4976 void ExternalStringTable::TearDown() { | 4996 void ExternalStringTable::TearDown() { |
| 4977 new_space_strings_.Free(); | 4997 new_space_strings_.Free(); |
| 4978 old_space_strings_.Free(); | 4998 old_space_strings_.Free(); |
| 4979 } | 4999 } |
| 4980 | 5000 |
| 4981 | 5001 |
| 4982 List<Object*> ExternalStringTable::new_space_strings_; | 5002 List<Object*> ExternalStringTable::new_space_strings_; |
| 4983 List<Object*> ExternalStringTable::old_space_strings_; | 5003 List<Object*> ExternalStringTable::old_space_strings_; |
| 4984 | 5004 |
| 4985 } } // namespace v8::internal | 5005 } } // namespace v8::internal |
| OLD | NEW |