| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_HEAP_H_ | 5 #ifndef V8_HEAP_H_ |
| 6 #define V8_HEAP_H_ | 6 #define V8_HEAP_H_ |
| 7 | 7 |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 | 9 |
| 10 #include "src/allocation.h" | 10 #include "src/allocation.h" |
| (...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 352 V(done_string, "done") \ | 352 V(done_string, "done") \ |
| 353 V(value_string, "value") \ | 353 V(value_string, "value") \ |
| 354 V(next_string, "next") \ | 354 V(next_string, "next") \ |
| 355 V(byte_length_string, "byteLength") \ | 355 V(byte_length_string, "byteLength") \ |
| 356 V(byte_offset_string, "byteOffset") \ | 356 V(byte_offset_string, "byteOffset") \ |
| 357 V(buffer_string, "buffer") \ | 357 V(buffer_string, "buffer") \ |
| 358 V(intl_initialized_marker_string, "v8::intl_initialized_marker") \ | 358 V(intl_initialized_marker_string, "v8::intl_initialized_marker") \ |
| 359 V(intl_impl_object_string, "v8::intl_object") | 359 V(intl_impl_object_string, "v8::intl_object") |
| 360 | 360 |
| 361 // Forward declarations. | 361 // Forward declarations. |
| 362 class GCTracer; | |
| 363 class HeapStats; | 362 class HeapStats; |
| 364 class Isolate; | 363 class Isolate; |
| 365 class WeakObjectRetainer; | 364 class WeakObjectRetainer; |
| 366 | 365 |
| 367 | 366 |
| 368 typedef String* (*ExternalStringTableUpdaterCallback)(Heap* heap, | 367 typedef String* (*ExternalStringTableUpdaterCallback)(Heap* heap, |
| 369 Object** pointer); | 368 Object** pointer); |
| 370 | 369 |
| 371 class StoreBufferRebuilder { | 370 class StoreBufferRebuilder { |
| 372 public: | 371 public: |
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 DISALLOW_COPY_AND_ASSIGN(ExternalStringTable); | 541 DISALLOW_COPY_AND_ASSIGN(ExternalStringTable); |
| 543 }; | 542 }; |
| 544 | 543 |
| 545 | 544 |
| 546 enum ArrayStorageAllocationMode { | 545 enum ArrayStorageAllocationMode { |
| 547 DONT_INITIALIZE_ARRAY_ELEMENTS, | 546 DONT_INITIALIZE_ARRAY_ELEMENTS, |
| 548 INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE | 547 INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE |
| 549 }; | 548 }; |
| 550 | 549 |
| 551 | 550 |
| 551 // GCTracer collects and prints ONE line after each garbage collector |
| 552 // invocation IFF --trace_gc is used. |
| 553 |
| 554 class GCTracer BASE_EMBEDDED { |
| 555 public: |
| 556 class Scope BASE_EMBEDDED { |
| 557 public: |
| 558 enum ScopeId { |
| 559 EXTERNAL, |
| 560 MC_MARK, |
| 561 MC_SWEEP, |
| 562 MC_SWEEP_NEWSPACE, |
| 563 MC_SWEEP_OLDSPACE, |
| 564 MC_SWEEP_CODE, |
| 565 MC_SWEEP_CELL, |
| 566 MC_SWEEP_MAP, |
| 567 MC_EVACUATE_PAGES, |
| 568 MC_UPDATE_NEW_TO_NEW_POINTERS, |
| 569 MC_UPDATE_ROOT_TO_NEW_POINTERS, |
| 570 MC_UPDATE_OLD_TO_NEW_POINTERS, |
| 571 MC_UPDATE_POINTERS_TO_EVACUATED, |
| 572 MC_UPDATE_POINTERS_BETWEEN_EVACUATED, |
| 573 MC_UPDATE_MISC_POINTERS, |
| 574 MC_WEAKCOLLECTION_PROCESS, |
| 575 MC_WEAKCOLLECTION_CLEAR, |
| 576 MC_FLUSH_CODE, |
| 577 NUMBER_OF_SCOPES |
| 578 }; |
| 579 |
| 580 Scope(GCTracer* tracer, ScopeId scope) |
| 581 : tracer_(tracer), |
| 582 scope_(scope) { |
| 583 start_time_ = base::OS::TimeCurrentMillis(); |
| 584 } |
| 585 |
| 586 ~Scope() { |
| 587 ASSERT(scope_ < NUMBER_OF_SCOPES); // scope_ is unsigned. |
| 588 tracer_->scopes_[scope_] += base::OS::TimeCurrentMillis() - start_time_; |
| 589 } |
| 590 |
| 591 private: |
| 592 GCTracer* tracer_; |
| 593 ScopeId scope_; |
| 594 double start_time_; |
| 595 |
| 596 DISALLOW_COPY_AND_ASSIGN(Scope); |
| 597 }; |
| 598 |
| 599 explicit GCTracer(Heap* heap); |
| 600 |
| 601 // Start collecting data. |
| 602 void start(GarbageCollector collector, |
| 603 const char* gc_reason, |
| 604 const char* collector_reason); |
| 605 |
| 606 // Stop collecting data and print results. |
| 607 void stop(); |
| 608 |
| 609 private: |
| 610 // Returns a string matching the collector. |
| 611 const char* CollectorString() const; |
| 612 |
| 613 // Print one detailed trace line in name=value format. |
| 614 void PrintNVP() const; |
| 615 |
| 616 // Print one trace line. |
| 617 void Print() const; |
| 618 |
| 619 // Timestamp set in the constructor. |
| 620 double start_time_; |
| 621 |
| 622 // Timestamp set in the destructor. |
| 623 double end_time_; |
| 624 |
| 625 // Size of objects in heap set in constructor. |
| 626 intptr_t start_object_size_; |
| 627 |
| 628 // Size of objects in heap set in destructor. |
| 629 intptr_t end_object_size_; |
| 630 |
| 631 // Size of memory allocated from OS set in constructor. |
| 632 intptr_t start_memory_size_; |
| 633 |
| 634 // Size of memory allocated from OS set in destructor. |
| 635 intptr_t end_memory_size_; |
| 636 |
| 637 // Type of collector. |
| 638 GarbageCollector collector_; |
| 639 |
| 640 // Amounts of time spent in different scopes during GC. |
| 641 double scopes_[Scope::NUMBER_OF_SCOPES]; |
| 642 |
| 643 // Total amount of space either wasted or contained in one of free lists |
| 644 // before the current GC. |
| 645 intptr_t in_free_list_or_wasted_before_gc_; |
| 646 |
| 647 // Difference between space used in the heap at the beginning of the current |
| 648 // collection and the end of the previous collection. |
| 649 intptr_t allocated_since_last_gc_; |
| 650 |
| 651 // Amount of time spent in mutator that is time elapsed between end of the |
| 652 // previous collection and the beginning of the current one. |
| 653 double spent_in_mutator_; |
| 654 |
| 655 // Incremental marking steps counters. |
| 656 int steps_count_; |
| 657 double steps_took_; |
| 658 double longest_step_; |
| 659 int steps_count_since_last_gc_; |
| 660 double steps_took_since_last_gc_; |
| 661 |
| 662 Heap* heap_; |
| 663 |
| 664 const char* gc_reason_; |
| 665 const char* collector_reason_; |
| 666 |
| 667 DISALLOW_COPY_AND_ASSIGN(GCTracer); |
| 668 }; |
| 669 |
| 670 |
| 552 class Heap { | 671 class Heap { |
| 553 public: | 672 public: |
| 554 // Configure heap size in MB before setup. Return false if the heap has been | 673 // Configure heap size in MB before setup. Return false if the heap has been |
| 555 // set up already. | 674 // set up already. |
| 556 bool ConfigureHeap(int max_semi_space_size, | 675 bool ConfigureHeap(int max_semi_space_size, |
| 557 int max_old_space_size, | 676 int max_old_space_size, |
| 558 int max_executable_size, | 677 int max_executable_size, |
| 559 size_t code_range_size); | 678 size_t code_range_size); |
| 560 bool ConfigureHeapDefault(); | 679 bool ConfigureHeapDefault(); |
| 561 | 680 |
| (...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1223 void VisitExternalResources(v8::ExternalResourceVisitor* visitor); | 1342 void VisitExternalResources(v8::ExternalResourceVisitor* visitor); |
| 1224 | 1343 |
| 1225 // An object should be promoted if the object has survived a | 1344 // An object should be promoted if the object has survived a |
| 1226 // scavenge operation. | 1345 // scavenge operation. |
| 1227 inline bool ShouldBePromoted(Address old_address, int object_size); | 1346 inline bool ShouldBePromoted(Address old_address, int object_size); |
| 1228 | 1347 |
| 1229 void ClearJSFunctionResultCaches(); | 1348 void ClearJSFunctionResultCaches(); |
| 1230 | 1349 |
| 1231 void ClearNormalizedMapCaches(); | 1350 void ClearNormalizedMapCaches(); |
| 1232 | 1351 |
| 1233 GCTracer* tracer() { return tracer_; } | 1352 GCTracer* tracer() { return &tracer_; } |
| 1234 | 1353 |
| 1235 // Returns the size of objects residing in non new spaces. | 1354 // Returns the size of objects residing in non new spaces. |
| 1236 intptr_t PromotedSpaceSizeOfObjects(); | 1355 intptr_t PromotedSpaceSizeOfObjects(); |
| 1237 | 1356 |
| 1238 double total_regexp_code_generated() { return total_regexp_code_generated_; } | 1357 double total_regexp_code_generated() { return total_regexp_code_generated_; } |
| 1239 void IncreaseTotalRegexpCodeGenerated(int size) { | 1358 void IncreaseTotalRegexpCodeGenerated(int size) { |
| 1240 total_regexp_code_generated_ += size; | 1359 total_regexp_code_generated_ += size; |
| 1241 } | 1360 } |
| 1242 | 1361 |
| 1243 void IncrementCodeGeneratedBytes(bool is_crankshafted, int size) { | 1362 void IncrementCodeGeneratedBytes(bool is_crankshafted, int size) { |
| (...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1745 GarbageCollector collector, | 1864 GarbageCollector collector, |
| 1746 const char* gc_reason, | 1865 const char* gc_reason, |
| 1747 const char* collector_reason, | 1866 const char* collector_reason, |
| 1748 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); | 1867 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); |
| 1749 | 1868 |
| 1750 // Performs garbage collection | 1869 // Performs garbage collection |
| 1751 // Returns whether there is a chance another major GC could | 1870 // Returns whether there is a chance another major GC could |
| 1752 // collect more garbage. | 1871 // collect more garbage. |
| 1753 bool PerformGarbageCollection( | 1872 bool PerformGarbageCollection( |
| 1754 GarbageCollector collector, | 1873 GarbageCollector collector, |
| 1755 GCTracer* tracer, | |
| 1756 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); | 1874 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); |
| 1757 | 1875 |
| 1758 inline void UpdateOldSpaceLimits(); | 1876 inline void UpdateOldSpaceLimits(); |
| 1759 | 1877 |
| 1760 // Selects the proper allocation space depending on the given object | 1878 // Selects the proper allocation space depending on the given object |
| 1761 // size, pretenuring decision, and preferred old-space. | 1879 // size, pretenuring decision, and preferred old-space. |
| 1762 static AllocationSpace SelectSpace(int object_size, | 1880 static AllocationSpace SelectSpace(int object_size, |
| 1763 AllocationSpace preferred_old_space, | 1881 AllocationSpace preferred_old_space, |
| 1764 PretenureFlag pretenure) { | 1882 PretenureFlag pretenure) { |
| 1765 ASSERT(preferred_old_space == OLD_POINTER_SPACE || | 1883 ASSERT(preferred_old_space == OLD_POINTER_SPACE || |
| (...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1971 static String* UpdateNewSpaceReferenceInExternalStringTableEntry( | 2089 static String* UpdateNewSpaceReferenceInExternalStringTableEntry( |
| 1972 Heap* heap, | 2090 Heap* heap, |
| 1973 Object** pointer); | 2091 Object** pointer); |
| 1974 | 2092 |
| 1975 Address DoScavenge(ObjectVisitor* scavenge_visitor, Address new_space_front); | 2093 Address DoScavenge(ObjectVisitor* scavenge_visitor, Address new_space_front); |
| 1976 static void ScavengeStoreBufferCallback(Heap* heap, | 2094 static void ScavengeStoreBufferCallback(Heap* heap, |
| 1977 MemoryChunk* page, | 2095 MemoryChunk* page, |
| 1978 StoreBufferEvent event); | 2096 StoreBufferEvent event); |
| 1979 | 2097 |
| 1980 // Performs a major collection in the whole heap. | 2098 // Performs a major collection in the whole heap. |
| 1981 void MarkCompact(GCTracer* tracer); | 2099 void MarkCompact(); |
| 1982 | 2100 |
| 1983 // Code to be run before and after mark-compact. | 2101 // Code to be run before and after mark-compact. |
| 1984 void MarkCompactPrologue(); | 2102 void MarkCompactPrologue(); |
| 1985 | 2103 |
| 1986 void ProcessNativeContexts(WeakObjectRetainer* retainer); | 2104 void ProcessNativeContexts(WeakObjectRetainer* retainer); |
| 1987 void ProcessArrayBuffers(WeakObjectRetainer* retainer); | 2105 void ProcessArrayBuffers(WeakObjectRetainer* retainer); |
| 1988 void ProcessAllocationSites(WeakObjectRetainer* retainer); | 2106 void ProcessAllocationSites(WeakObjectRetainer* retainer); |
| 1989 | 2107 |
| 1990 // Deopts all code that contains allocation instruction which are tenured or | 2108 // Deopts all code that contains allocation instruction which are tenured or |
| 1991 // not tenured. Moreover it clears the pretenuring allocation site statistics. | 2109 // not tenured. Moreover it clears the pretenuring allocation site statistics. |
| (...skipping 10 matching lines...) Expand all Loading... |
| 2002 // Record statistics before and after garbage collection. | 2120 // Record statistics before and after garbage collection. |
| 2003 void ReportStatisticsBeforeGC(); | 2121 void ReportStatisticsBeforeGC(); |
| 2004 void ReportStatisticsAfterGC(); | 2122 void ReportStatisticsAfterGC(); |
| 2005 | 2123 |
| 2006 // Slow part of scavenge object. | 2124 // Slow part of scavenge object. |
| 2007 static void ScavengeObjectSlow(HeapObject** p, HeapObject* object); | 2125 static void ScavengeObjectSlow(HeapObject** p, HeapObject* object); |
| 2008 | 2126 |
| 2009 // Total RegExp code ever generated | 2127 // Total RegExp code ever generated |
| 2010 double total_regexp_code_generated_; | 2128 double total_regexp_code_generated_; |
| 2011 | 2129 |
| 2012 GCTracer* tracer_; | 2130 GCTracer tracer_; |
| 2013 | 2131 |
| 2014 // Creates and installs the full-sized number string cache. | 2132 // Creates and installs the full-sized number string cache. |
| 2015 int FullSizeNumberStringCacheLength(); | 2133 int FullSizeNumberStringCacheLength(); |
| 2016 // Flush the number to string cache. | 2134 // Flush the number to string cache. |
| 2017 void FlushNumberStringCache(); | 2135 void FlushNumberStringCache(); |
| 2018 | 2136 |
| 2019 // Sets used allocation sites entries to undefined. | 2137 // Sets used allocation sites entries to undefined. |
| 2020 void FlushAllocationSitesScratchpad(); | 2138 void FlushAllocationSitesScratchpad(); |
| 2021 | 2139 |
| 2022 // Initializes the allocation sites scratchpad with undefined values. | 2140 // Initializes the allocation sites scratchpad with undefined values. |
| (...skipping 500 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2523 }; | 2641 }; |
| 2524 | 2642 |
| 2525 Key keys_[kLength]; | 2643 Key keys_[kLength]; |
| 2526 int results_[kLength]; | 2644 int results_[kLength]; |
| 2527 | 2645 |
| 2528 friend class Isolate; | 2646 friend class Isolate; |
| 2529 DISALLOW_COPY_AND_ASSIGN(DescriptorLookupCache); | 2647 DISALLOW_COPY_AND_ASSIGN(DescriptorLookupCache); |
| 2530 }; | 2648 }; |
| 2531 | 2649 |
| 2532 | 2650 |
| 2533 // GCTracer collects and prints ONE line after each garbage collector | |
| 2534 // invocation IFF --trace_gc is used. | |
| 2535 | |
| 2536 class GCTracer BASE_EMBEDDED { | |
| 2537 public: | |
| 2538 class Scope BASE_EMBEDDED { | |
| 2539 public: | |
| 2540 enum ScopeId { | |
| 2541 EXTERNAL, | |
| 2542 MC_MARK, | |
| 2543 MC_SWEEP, | |
| 2544 MC_SWEEP_NEWSPACE, | |
| 2545 MC_SWEEP_OLDSPACE, | |
| 2546 MC_SWEEP_CODE, | |
| 2547 MC_SWEEP_CELL, | |
| 2548 MC_SWEEP_MAP, | |
| 2549 MC_EVACUATE_PAGES, | |
| 2550 MC_UPDATE_NEW_TO_NEW_POINTERS, | |
| 2551 MC_UPDATE_ROOT_TO_NEW_POINTERS, | |
| 2552 MC_UPDATE_OLD_TO_NEW_POINTERS, | |
| 2553 MC_UPDATE_POINTERS_TO_EVACUATED, | |
| 2554 MC_UPDATE_POINTERS_BETWEEN_EVACUATED, | |
| 2555 MC_UPDATE_MISC_POINTERS, | |
| 2556 MC_WEAKCOLLECTION_PROCESS, | |
| 2557 MC_WEAKCOLLECTION_CLEAR, | |
| 2558 MC_FLUSH_CODE, | |
| 2559 NUMBER_OF_SCOPES | |
| 2560 }; | |
| 2561 | |
| 2562 Scope(GCTracer* tracer, ScopeId scope) | |
| 2563 : tracer_(tracer), | |
| 2564 scope_(scope) { | |
| 2565 start_time_ = base::OS::TimeCurrentMillis(); | |
| 2566 } | |
| 2567 | |
| 2568 ~Scope() { | |
| 2569 ASSERT(scope_ < NUMBER_OF_SCOPES); // scope_ is unsigned. | |
| 2570 tracer_->scopes_[scope_] += base::OS::TimeCurrentMillis() - start_time_; | |
| 2571 } | |
| 2572 | |
| 2573 private: | |
| 2574 GCTracer* tracer_; | |
| 2575 ScopeId scope_; | |
| 2576 double start_time_; | |
| 2577 | |
| 2578 DISALLOW_COPY_AND_ASSIGN(Scope); | |
| 2579 }; | |
| 2580 | |
| 2581 explicit GCTracer(Heap* heap, | |
| 2582 GarbageCollector collector, | |
| 2583 const char* gc_reason, | |
| 2584 const char* collector_reason); | |
| 2585 ~GCTracer(); | |
| 2586 | |
| 2587 private: | |
| 2588 // Returns a string matching the collector. | |
| 2589 const char* CollectorString() const; | |
| 2590 | |
| 2591 // Print one detailed trace line in name=value format. | |
| 2592 void PrintNVP() const; | |
| 2593 | |
| 2594 // Print one trace line. | |
| 2595 void Print() const; | |
| 2596 | |
| 2597 // Timestamp set in the constructor. | |
| 2598 double start_time_; | |
| 2599 | |
| 2600 // Timestamp set in the destructor. | |
| 2601 double end_time_; | |
| 2602 | |
| 2603 // Size of objects in heap set in constructor. | |
| 2604 intptr_t start_object_size_; | |
| 2605 | |
| 2606 // Size of objects in heap set in destructor. | |
| 2607 intptr_t end_object_size_; | |
| 2608 | |
| 2609 // Size of memory allocated from OS set in constructor. | |
| 2610 intptr_t start_memory_size_; | |
| 2611 | |
| 2612 // Size of memory allocated from OS set in destructor. | |
| 2613 intptr_t end_memory_size_; | |
| 2614 | |
| 2615 // Type of collector. | |
| 2616 GarbageCollector collector_; | |
| 2617 | |
| 2618 // Amounts of time spent in different scopes during GC. | |
| 2619 double scopes_[Scope::NUMBER_OF_SCOPES]; | |
| 2620 | |
| 2621 // Total amount of space either wasted or contained in one of free lists | |
| 2622 // before the current GC. | |
| 2623 intptr_t in_free_list_or_wasted_before_gc_; | |
| 2624 | |
| 2625 // Difference between space used in the heap at the beginning of the current | |
| 2626 // collection and the end of the previous collection. | |
| 2627 intptr_t allocated_since_last_gc_; | |
| 2628 | |
| 2629 // Amount of time spent in mutator that is time elapsed between end of the | |
| 2630 // previous collection and the beginning of the current one. | |
| 2631 double spent_in_mutator_; | |
| 2632 | |
| 2633 // Incremental marking steps counters. | |
| 2634 int steps_count_; | |
| 2635 double steps_took_; | |
| 2636 double longest_step_; | |
| 2637 int steps_count_since_last_gc_; | |
| 2638 double steps_took_since_last_gc_; | |
| 2639 | |
| 2640 Heap* heap_; | |
| 2641 | |
| 2642 const char* gc_reason_; | |
| 2643 const char* collector_reason_; | |
| 2644 | |
| 2645 DISALLOW_COPY_AND_ASSIGN(GCTracer); | |
| 2646 }; | |
| 2647 | |
| 2648 | |
| 2649 class RegExpResultsCache { | 2651 class RegExpResultsCache { |
| 2650 public: | 2652 public: |
| 2651 enum ResultsCacheType { REGEXP_MULTIPLE_INDICES, STRING_SPLIT_SUBSTRINGS }; | 2653 enum ResultsCacheType { REGEXP_MULTIPLE_INDICES, STRING_SPLIT_SUBSTRINGS }; |
| 2652 | 2654 |
| 2653 // Attempt to retrieve a cached result. On failure, 0 is returned as a Smi. | 2655 // Attempt to retrieve a cached result. On failure, 0 is returned as a Smi. |
| 2654 // On success, the returned result is guaranteed to be a COW-array. | 2656 // On success, the returned result is guaranteed to be a COW-array. |
| 2655 static Object* Lookup(Heap* heap, | 2657 static Object* Lookup(Heap* heap, |
| 2656 String* key_string, | 2658 String* key_string, |
| 2657 Object* key_pattern, | 2659 Object* key_pattern, |
| 2658 ResultsCacheType type); | 2660 ResultsCacheType type); |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2781 DisallowHeapAllocation no_allocation; // i.e. no gc allowed. | 2783 DisallowHeapAllocation no_allocation; // i.e. no gc allowed. |
| 2782 | 2784 |
| 2783 private: | 2785 private: |
| 2784 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); | 2786 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); |
| 2785 }; | 2787 }; |
| 2786 #endif // DEBUG | 2788 #endif // DEBUG |
| 2787 | 2789 |
| 2788 } } // namespace v8::internal | 2790 } } // namespace v8::internal |
| 2789 | 2791 |
| 2790 #endif // V8_HEAP_H_ | 2792 #endif // V8_HEAP_H_ |
| OLD | NEW |