OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 302 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
313 new_space_.CollectStatistics(); | 313 new_space_.CollectStatistics(); |
314 new_space_.ReportStatistics(); | 314 new_space_.ReportStatistics(); |
315 new_space_.ClearHistograms(); | 315 new_space_.ClearHistograms(); |
316 } | 316 } |
317 #endif // DEBUG | 317 #endif // DEBUG |
318 } | 318 } |
319 | 319 |
320 | 320 |
321 void Heap::PrintShortHeapStatistics() { | 321 void Heap::PrintShortHeapStatistics() { |
322 if (!FLAG_trace_gc_verbose) return; | 322 if (!FLAG_trace_gc_verbose) return; |
323 PrintF("Memory allocator, used: %6" V8_PTR_PREFIX "d KB" | 323 PrintPID("Memory allocator, used: %6" V8_PTR_PREFIX "d KB" |
324 ", available: %6" V8_PTR_PREFIX "d KB\n", | 324 ", available: %6" V8_PTR_PREFIX "d KB\n", |
325 isolate_->memory_allocator()->Size() / KB, | 325 isolate_->memory_allocator()->Size() / KB, |
326 isolate_->memory_allocator()->Available() / KB); | 326 isolate_->memory_allocator()->Available() / KB); |
327 PrintF("New space, used: %6" V8_PTR_PREFIX "d KB" | 327 PrintPID("New space, used: %6" V8_PTR_PREFIX "d KB" |
328 ", available: %6" V8_PTR_PREFIX "d KB" | 328 ", available: %6" V8_PTR_PREFIX "d KB" |
329 ", committed: %6" V8_PTR_PREFIX "d KB\n", | 329 ", committed: %6" V8_PTR_PREFIX "d KB\n", |
330 new_space_.Size() / KB, | 330 new_space_.Size() / KB, |
331 new_space_.Available() / KB, | 331 new_space_.Available() / KB, |
332 new_space_.CommittedMemory() / KB); | 332 new_space_.CommittedMemory() / KB); |
333 PrintF("Old pointers, used: %6" V8_PTR_PREFIX "d KB" | 333 PrintPID("Old pointers, used: %6" V8_PTR_PREFIX "d KB" |
334 ", available: %6" V8_PTR_PREFIX "d KB" | 334 ", available: %6" V8_PTR_PREFIX "d KB" |
335 ", committed: %6" V8_PTR_PREFIX "d KB\n", | 335 ", committed: %6" V8_PTR_PREFIX "d KB\n", |
336 old_pointer_space_->SizeOfObjects() / KB, | 336 old_pointer_space_->SizeOfObjects() / KB, |
337 old_pointer_space_->Available() / KB, | 337 old_pointer_space_->Available() / KB, |
338 old_pointer_space_->CommittedMemory() / KB); | 338 old_pointer_space_->CommittedMemory() / KB); |
339 PrintF("Old data space, used: %6" V8_PTR_PREFIX "d KB" | 339 PrintPID("Old data space, used: %6" V8_PTR_PREFIX "d KB" |
340 ", available: %6" V8_PTR_PREFIX "d KB" | 340 ", available: %6" V8_PTR_PREFIX "d KB" |
341 ", committed: %6" V8_PTR_PREFIX "d KB\n", | 341 ", committed: %6" V8_PTR_PREFIX "d KB\n", |
342 old_data_space_->SizeOfObjects() / KB, | 342 old_data_space_->SizeOfObjects() / KB, |
343 old_data_space_->Available() / KB, | 343 old_data_space_->Available() / KB, |
344 old_data_space_->CommittedMemory() / KB); | 344 old_data_space_->CommittedMemory() / KB); |
345 PrintF("Code space, used: %6" V8_PTR_PREFIX "d KB" | 345 PrintPID("Code space, used: %6" V8_PTR_PREFIX "d KB" |
346 ", available: %6" V8_PTR_PREFIX "d KB" | 346 ", available: %6" V8_PTR_PREFIX "d KB" |
347 ", committed: %6" V8_PTR_PREFIX "d KB\n", | 347 ", committed: %6" V8_PTR_PREFIX "d KB\n", |
348 code_space_->SizeOfObjects() / KB, | 348 code_space_->SizeOfObjects() / KB, |
349 code_space_->Available() / KB, | 349 code_space_->Available() / KB, |
350 code_space_->CommittedMemory() / KB); | 350 code_space_->CommittedMemory() / KB); |
351 PrintF("Map space, used: %6" V8_PTR_PREFIX "d KB" | 351 PrintPID("Map space, used: %6" V8_PTR_PREFIX "d KB" |
352 ", available: %6" V8_PTR_PREFIX "d KB" | 352 ", available: %6" V8_PTR_PREFIX "d KB" |
353 ", committed: %6" V8_PTR_PREFIX "d KB\n", | 353 ", committed: %6" V8_PTR_PREFIX "d KB\n", |
354 map_space_->SizeOfObjects() / KB, | 354 map_space_->SizeOfObjects() / KB, |
355 map_space_->Available() / KB, | 355 map_space_->Available() / KB, |
356 map_space_->CommittedMemory() / KB); | 356 map_space_->CommittedMemory() / KB); |
357 PrintF("Cell space, used: %6" V8_PTR_PREFIX "d KB" | 357 PrintPID("Cell space, used: %6" V8_PTR_PREFIX "d KB" |
358 ", available: %6" V8_PTR_PREFIX "d KB" | 358 ", available: %6" V8_PTR_PREFIX "d KB" |
359 ", committed: %6" V8_PTR_PREFIX "d KB\n", | 359 ", committed: %6" V8_PTR_PREFIX "d KB\n", |
360 cell_space_->SizeOfObjects() / KB, | 360 cell_space_->SizeOfObjects() / KB, |
361 cell_space_->Available() / KB, | 361 cell_space_->Available() / KB, |
362 cell_space_->CommittedMemory() / KB); | 362 cell_space_->CommittedMemory() / KB); |
363 PrintF("Large object space, used: %6" V8_PTR_PREFIX "d KB" | 363 PrintPID("Large object space, used: %6" V8_PTR_PREFIX "d KB" |
364 ", available: %6" V8_PTR_PREFIX "d KB" | 364 ", available: %6" V8_PTR_PREFIX "d KB" |
365 ", committed: %6" V8_PTR_PREFIX "d KB\n", | 365 ", committed: %6" V8_PTR_PREFIX "d KB\n", |
366 lo_space_->SizeOfObjects() / KB, | 366 lo_space_->SizeOfObjects() / KB, |
367 lo_space_->Available() / KB, | 367 lo_space_->Available() / KB, |
368 lo_space_->CommittedMemory() / KB); | 368 lo_space_->CommittedMemory() / KB); |
369 } | 369 } |
370 | 370 |
371 | 371 |
372 // TODO(1238405): Combine the infrastructure for --heap-stats and | 372 // TODO(1238405): Combine the infrastructure for --heap-stats and |
373 // --log-gc to avoid the complicated preprocessor and flag testing. | 373 // --log-gc to avoid the complicated preprocessor and flag testing. |
374 void Heap::ReportStatisticsAfterGC() { | 374 void Heap::ReportStatisticsAfterGC() { |
375 // Similar to the before GC, we use some complicated logic to ensure that | 375 // Similar to the before GC, we use some complicated logic to ensure that |
376 // NewSpace statistics are logged exactly once when --log-gc is turned on. | 376 // NewSpace statistics are logged exactly once when --log-gc is turned on. |
377 #if defined(DEBUG) | 377 #if defined(DEBUG) |
378 if (FLAG_heap_stats) { | 378 if (FLAG_heap_stats) { |
(...skipping 520 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
899 if (!new_space_high_promotion_mode_active_ && | 899 if (!new_space_high_promotion_mode_active_ && |
900 new_space_.Capacity() == new_space_.MaximumCapacity() && | 900 new_space_.Capacity() == new_space_.MaximumCapacity() && |
901 IsStableOrIncreasingSurvivalTrend() && | 901 IsStableOrIncreasingSurvivalTrend() && |
902 IsHighSurvivalRate()) { | 902 IsHighSurvivalRate()) { |
903 // Stable high survival rates even though young generation is at | 903 // Stable high survival rates even though young generation is at |
904 // maximum capacity indicates that most objects will be promoted. | 904 // maximum capacity indicates that most objects will be promoted. |
905 // To decrease scavenger pauses and final mark-sweep pauses, we | 905 // To decrease scavenger pauses and final mark-sweep pauses, we |
906 // have to limit maximal capacity of the young generation. | 906 // have to limit maximal capacity of the young generation. |
907 new_space_high_promotion_mode_active_ = true; | 907 new_space_high_promotion_mode_active_ = true; |
908 if (FLAG_trace_gc) { | 908 if (FLAG_trace_gc) { |
909 PrintF("Limited new space size due to high promotion rate: %d MB\n", | 909 PrintPID("Limited new space size due to high promotion rate: %d MB\n", |
910 new_space_.InitialCapacity() / MB); | 910 new_space_.InitialCapacity() / MB); |
911 } | 911 } |
912 } else if (new_space_high_promotion_mode_active_ && | 912 } else if (new_space_high_promotion_mode_active_ && |
913 IsStableOrDecreasingSurvivalTrend() && | 913 IsStableOrDecreasingSurvivalTrend() && |
914 IsLowSurvivalRate()) { | 914 IsLowSurvivalRate()) { |
915 // Decreasing low survival rates might indicate that the above high | 915 // Decreasing low survival rates might indicate that the above high |
916 // promotion mode is over and we should allow the young generation | 916 // promotion mode is over and we should allow the young generation |
917 // to grow again. | 917 // to grow again. |
918 new_space_high_promotion_mode_active_ = false; | 918 new_space_high_promotion_mode_active_ = false; |
919 if (FLAG_trace_gc) { | 919 if (FLAG_trace_gc) { |
920 PrintF("Unlimited new space size due to low promotion rate: %d MB\n", | 920 PrintPID("Unlimited new space size due to low promotion rate: %d MB\n", |
921 new_space_.MaximumCapacity() / MB); | 921 new_space_.MaximumCapacity() / MB); |
922 } | 922 } |
923 } | 923 } |
924 | 924 |
925 if (new_space_high_promotion_mode_active_ && | 925 if (new_space_high_promotion_mode_active_ && |
926 new_space_.Capacity() > new_space_.InitialCapacity()) { | 926 new_space_.Capacity() > new_space_.InitialCapacity()) { |
927 new_space_.Shrink(); | 927 new_space_.Shrink(); |
928 } | 928 } |
929 | 929 |
930 isolate_->counters()->objs_since_last_young()->Set(0); | 930 isolate_->counters()->objs_since_last_young()->Set(0); |
931 | 931 |
(...skipping 4867 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5799 | 5799 |
5800 if (FLAG_stress_compaction) { | 5800 if (FLAG_stress_compaction) { |
5801 // This will cause more frequent GCs when stressing. | 5801 // This will cause more frequent GCs when stressing. |
5802 max_semispace_size_ = Page::kPageSize; | 5802 max_semispace_size_ = Page::kPageSize; |
5803 } | 5803 } |
5804 | 5804 |
5805 if (max_semispace_size > 0) { | 5805 if (max_semispace_size > 0) { |
5806 if (max_semispace_size < Page::kPageSize) { | 5806 if (max_semispace_size < Page::kPageSize) { |
5807 max_semispace_size = Page::kPageSize; | 5807 max_semispace_size = Page::kPageSize; |
5808 if (FLAG_trace_gc) { | 5808 if (FLAG_trace_gc) { |
5809 PrintF("Max semispace size cannot be less than %dkbytes\n", | 5809 PrintPID("Max semispace size cannot be less than %dkbytes\n", |
5810 Page::kPageSize >> 10); | 5810 Page::kPageSize >> 10); |
5811 } | 5811 } |
5812 } | 5812 } |
5813 max_semispace_size_ = max_semispace_size; | 5813 max_semispace_size_ = max_semispace_size; |
5814 } | 5814 } |
5815 | 5815 |
5816 if (Snapshot::IsEnabled()) { | 5816 if (Snapshot::IsEnabled()) { |
5817 // If we are using a snapshot we always reserve the default amount | 5817 // If we are using a snapshot we always reserve the default amount |
5818 // of memory for each semispace because code in the snapshot has | 5818 // of memory for each semispace because code in the snapshot has |
5819 // write-barrier code that relies on the size and alignment of new | 5819 // write-barrier code that relies on the size and alignment of new |
5820 // space. We therefore cannot use a larger max semispace size | 5820 // space. We therefore cannot use a larger max semispace size |
5821 // than the default reserved semispace size. | 5821 // than the default reserved semispace size. |
5822 if (max_semispace_size_ > reserved_semispace_size_) { | 5822 if (max_semispace_size_ > reserved_semispace_size_) { |
5823 max_semispace_size_ = reserved_semispace_size_; | 5823 max_semispace_size_ = reserved_semispace_size_; |
5824 if (FLAG_trace_gc) { | 5824 if (FLAG_trace_gc) { |
5825 PrintF("Max semispace size cannot be more than %dkbytes\n", | 5825 PrintPID("Max semispace size cannot be more than %dkbytes\n", |
5826 reserved_semispace_size_ >> 10); | 5826 reserved_semispace_size_ >> 10); |
5827 } | 5827 } |
5828 } | 5828 } |
5829 } else { | 5829 } else { |
5830 // If we are not using snapshots we reserve space for the actual | 5830 // If we are not using snapshots we reserve space for the actual |
5831 // max semispace size. | 5831 // max semispace size. |
5832 reserved_semispace_size_ = max_semispace_size_; | 5832 reserved_semispace_size_ = max_semispace_size_; |
5833 } | 5833 } |
5834 | 5834 |
5835 if (max_old_gen_size > 0) max_old_generation_size_ = max_old_gen_size; | 5835 if (max_old_gen_size > 0) max_old_generation_size_ = max_old_gen_size; |
5836 if (max_executable_size > 0) { | 5836 if (max_executable_size > 0) { |
(...skipping 1073 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6910 if (FLAG_print_cumulative_gc_stat) { | 6910 if (FLAG_print_cumulative_gc_stat) { |
6911 heap_->max_gc_pause_ = Max(heap_->max_gc_pause_, time); | 6911 heap_->max_gc_pause_ = Max(heap_->max_gc_pause_, time); |
6912 heap_->max_alive_after_gc_ = Max(heap_->max_alive_after_gc_, | 6912 heap_->max_alive_after_gc_ = Max(heap_->max_alive_after_gc_, |
6913 heap_->alive_after_last_gc_); | 6913 heap_->alive_after_last_gc_); |
6914 if (!first_gc) { | 6914 if (!first_gc) { |
6915 heap_->min_in_mutator_ = Min(heap_->min_in_mutator_, | 6915 heap_->min_in_mutator_ = Min(heap_->min_in_mutator_, |
6916 static_cast<int>(spent_in_mutator_)); | 6916 static_cast<int>(spent_in_mutator_)); |
6917 } | 6917 } |
6918 } | 6918 } |
6919 | 6919 |
6920 PrintF("%8.0f ms: ", heap_->isolate()->time_millis_since_init()); | 6920 PrintPID("%8.0f ms: ", heap_->isolate()->time_millis_since_init()); |
6921 | 6921 |
6922 if (!FLAG_trace_gc_nvp) { | 6922 if (!FLAG_trace_gc_nvp) { |
6923 int external_time = static_cast<int>(scopes_[Scope::EXTERNAL]); | 6923 int external_time = static_cast<int>(scopes_[Scope::EXTERNAL]); |
6924 | 6924 |
6925 double end_memory_size_mb = | 6925 double end_memory_size_mb = |
6926 static_cast<double>(heap_->isolate()->memory_allocator()->Size()) / MB; | 6926 static_cast<double>(heap_->isolate()->memory_allocator()->Size()) / MB; |
6927 | 6927 |
6928 PrintF("%s %.1f (%.1f) -> %.1f (%.1f) MB, ", | 6928 PrintF("%s %.1f (%.1f) -> %.1f (%.1f) MB, ", |
6929 CollectorString(), | 6929 CollectorString(), |
6930 static_cast<double>(start_object_size_) / MB, | 6930 static_cast<double>(start_object_size_) / MB, |
(...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7221 } else { | 7221 } else { |
7222 p ^= 0x1d1ed & (Page::kPageSize - 1); // I died. | 7222 p ^= 0x1d1ed & (Page::kPageSize - 1); // I died. |
7223 } | 7223 } |
7224 remembered_unmapped_pages_[remembered_unmapped_pages_index_] = | 7224 remembered_unmapped_pages_[remembered_unmapped_pages_index_] = |
7225 reinterpret_cast<Address>(p); | 7225 reinterpret_cast<Address>(p); |
7226 remembered_unmapped_pages_index_++; | 7226 remembered_unmapped_pages_index_++; |
7227 remembered_unmapped_pages_index_ %= kRememberedUnmappedPages; | 7227 remembered_unmapped_pages_index_ %= kRememberedUnmappedPages; |
7228 } | 7228 } |
7229 | 7229 |
7230 } } // namespace v8::internal | 7230 } } // namespace v8::internal |
OLD | NEW |