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

Side by Side Diff: src/heap.h

Issue 390823003: v8: make GCTracer persistent. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 5 months 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/global-handles.cc ('k') | src/heap.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 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 531 matching lines...) Expand 10 before | Expand all | Expand 10 after
542 DISALLOW_COPY_AND_ASSIGN(ExternalStringTable); 542 DISALLOW_COPY_AND_ASSIGN(ExternalStringTable);
543 }; 543 };
544 544
545 545
546 enum ArrayStorageAllocationMode { 546 enum ArrayStorageAllocationMode {
547 DONT_INITIALIZE_ARRAY_ELEMENTS, 547 DONT_INITIALIZE_ARRAY_ELEMENTS,
548 INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE 548 INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE
549 }; 549 };
550 550
551 551
552 // GCTracer collects and prints ONE line after each garbage collector
553 // invocation IFF --trace_gc is used.
554
555 class GCTracer BASE_EMBEDDED {
556 public:
557 class Scope BASE_EMBEDDED {
558 public:
559 enum ScopeId {
560 EXTERNAL,
561 MC_MARK,
562 MC_SWEEP,
563 MC_SWEEP_NEWSPACE,
564 MC_SWEEP_OLDSPACE,
565 MC_SWEEP_CODE,
566 MC_SWEEP_CELL,
567 MC_SWEEP_MAP,
568 MC_EVACUATE_PAGES,
569 MC_UPDATE_NEW_TO_NEW_POINTERS,
570 MC_UPDATE_ROOT_TO_NEW_POINTERS,
571 MC_UPDATE_OLD_TO_NEW_POINTERS,
572 MC_UPDATE_POINTERS_TO_EVACUATED,
573 MC_UPDATE_POINTERS_BETWEEN_EVACUATED,
574 MC_UPDATE_MISC_POINTERS,
575 MC_WEAKCOLLECTION_PROCESS,
576 MC_WEAKCOLLECTION_CLEAR,
577 MC_FLUSH_CODE,
578 kNumberOfScopes
jochen (gone - plz use gerrit) 2014/07/14 11:55:32 it's a bit odd to mix MACRO_STYLE and kStyle in th
579 };
580
581 Scope(GCTracer* tracer, ScopeId scope)
582 : tracer_(tracer),
583 scope_(scope) {
584 start_time_ = base::OS::TimeCurrentMillis();
585 }
586
587 ~Scope() {
588 ASSERT(scope_ < kNumberOfScopes); // scope_ is unsigned.
589 tracer_->scopes_[scope_] += base::OS::TimeCurrentMillis() - start_time_;
590 }
591
592 private:
593 GCTracer* tracer_;
594 ScopeId scope_;
595 double start_time_;
596 };
jochen (gone - plz use gerrit) 2014/07/14 11:55:32 DISALLOW_COPY_AND_ASSIGN()
597
598 explicit GCTracer(Heap* heap);
599 ~GCTracer();
600
601 void start(const char* gc_reason, const char* collector_reason);
602 void stop();
603
604 // Sets the collector.
605 void set_collector(GarbageCollector collector) { collector_ = collector; }
606
607 // Sets the GC count.
608 void set_gc_count(unsigned int count) { gc_count_ = count; }
609
610 // Sets the full GC count.
611 void set_full_gc_count(int count) { full_gc_count_ = count; }
612
613 void increment_nodes_died_in_new_space() {
614 nodes_died_in_new_space_++;
615 }
616
617 void increment_nodes_copied_in_new_space() {
618 nodes_copied_in_new_space_++;
619 }
620
621 void increment_nodes_promoted() {
622 nodes_promoted_++;
623 }
624
625 int steps_count() { return steps_count_; }
626
627 void add_step(double duration) {
628 steps_count_++;
629 steps_count_since_last_gc_++;
630 steps_took_ += duration;
631 steps_took_since_last_gc_ += duration;
632 longest_step_ = Max(longest_step_, duration);
633 }
634
635 void reset_step_counters(bool reset_all_counters) {
636 if (reset_all_counters) {
637 steps_count_ = 0;
638 steps_took_ = 0.0;
639 }
640 steps_count_since_last_gc_ = 0;
641 steps_took_since_last_gc_ = 0.0;
642 longest_step_ = 0.0;
643 }
644
645 private:
646 // Returns a string matching the collector.
647 const char* CollectorString();
648
649 // Returns size of object in heap (in MB).
650 inline double SizeOfHeapObjects();
651
652 // Timestamp set in the constructor.
653 double start_time_;
654
655 // Size of objects in heap set in constructor.
656 intptr_t start_object_size_;
657
658 // Size of memory allocated from OS set in constructor.
659 intptr_t start_memory_size_;
660
661 // Type of collector.
662 GarbageCollector collector_;
663
664 // A count (including this one, e.g. the first collection is 1) of the
665 // number of garbage collections.
666 unsigned int gc_count_;
667
668 // A count (including this one) of the number of full garbage collections.
669 int full_gc_count_;
670
671 // Amounts of time spent in different scopes during GC.
672 double scopes_[Scope::kNumberOfScopes];
673
674 // Total amount of space either wasted or contained in one of free lists
675 // before the current GC.
676 intptr_t in_free_list_or_wasted_before_gc_;
677
678 // Difference between space used in the heap at the beginning of the current
679 // collection and the end of the previous collection.
680 intptr_t allocated_since_last_gc_;
681
682 // Amount of time spent in mutator that is time elapsed between end of the
683 // previous collection and the beginning of the current one.
684 double spent_in_mutator_;
685
686 // Number of died nodes in the new space.
687 int nodes_died_in_new_space_;
688
689 // Number of copied nodes to the new space.
690 int nodes_copied_in_new_space_;
691
692 // Number of promoted nodes to the old space.
693 int nodes_promoted_;
694
695 // Incremental marking steps counters.
696 int steps_count_;
697 double steps_took_;
698 double longest_step_;
699 int steps_count_since_last_gc_;
700 double steps_took_since_last_gc_;
701
702 Heap* heap_;
703
704 const char* gc_reason_;
705 const char* collector_reason_;
706 };
jochen (gone - plz use gerrit) 2014/07/14 11:55:33 disallopw copy/assign
707
708
552 class Heap { 709 class Heap {
553 public: 710 public:
554 // Configure heap size in MB before setup. Return false if the heap has been 711 // Configure heap size in MB before setup. Return false if the heap has been
555 // set up already. 712 // set up already.
556 bool ConfigureHeap(int max_semi_space_size, 713 bool ConfigureHeap(int max_semi_space_size,
557 int max_old_space_size, 714 int max_old_space_size,
558 int max_executable_size, 715 int max_executable_size,
559 size_t code_range_size); 716 size_t code_range_size);
560 bool ConfigureHeapDefault(); 717 bool ConfigureHeapDefault();
561 718
(...skipping 649 matching lines...) Expand 10 before | Expand all | Expand 10 after
1211 void VisitExternalResources(v8::ExternalResourceVisitor* visitor); 1368 void VisitExternalResources(v8::ExternalResourceVisitor* visitor);
1212 1369
1213 // An object should be promoted if the object has survived a 1370 // An object should be promoted if the object has survived a
1214 // scavenge operation. 1371 // scavenge operation.
1215 inline bool ShouldBePromoted(Address old_address, int object_size); 1372 inline bool ShouldBePromoted(Address old_address, int object_size);
1216 1373
1217 void ClearJSFunctionResultCaches(); 1374 void ClearJSFunctionResultCaches();
1218 1375
1219 void ClearNormalizedMapCaches(); 1376 void ClearNormalizedMapCaches();
1220 1377
1221 GCTracer* tracer() { return tracer_; } 1378 GCTracer* tracer() { return &tracer_; }
1222 1379
1223 // Returns the size of objects residing in non new spaces. 1380 // Returns the size of objects residing in non new spaces.
1224 intptr_t PromotedSpaceSizeOfObjects(); 1381 intptr_t PromotedSpaceSizeOfObjects();
1225 1382
1226 double total_regexp_code_generated() { return total_regexp_code_generated_; } 1383 double total_regexp_code_generated() { return total_regexp_code_generated_; }
1227 void IncreaseTotalRegexpCodeGenerated(int size) { 1384 void IncreaseTotalRegexpCodeGenerated(int size) {
1228 total_regexp_code_generated_ += size; 1385 total_regexp_code_generated_ += size;
1229 } 1386 }
1230 1387
1231 void IncrementCodeGeneratedBytes(bool is_crankshafted, int size) { 1388 void IncrementCodeGeneratedBytes(bool is_crankshafted, int size) {
(...skipping 495 matching lines...) Expand 10 before | Expand all | Expand 10 after
1727 GarbageCollector collector, 1884 GarbageCollector collector,
1728 const char* gc_reason, 1885 const char* gc_reason,
1729 const char* collector_reason, 1886 const char* collector_reason,
1730 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); 1887 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags);
1731 1888
1732 // Performs garbage collection 1889 // Performs garbage collection
1733 // Returns whether there is a chance another major GC could 1890 // Returns whether there is a chance another major GC could
1734 // collect more garbage. 1891 // collect more garbage.
1735 bool PerformGarbageCollection( 1892 bool PerformGarbageCollection(
1736 GarbageCollector collector, 1893 GarbageCollector collector,
1737 GCTracer* tracer,
1738 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags); 1894 const GCCallbackFlags gc_callback_flags = kNoGCCallbackFlags);
1739 1895
1740 inline void UpdateOldSpaceLimits(); 1896 inline void UpdateOldSpaceLimits();
1741 1897
1742 // Selects the proper allocation space depending on the given object 1898 // Selects the proper allocation space depending on the given object
1743 // size, pretenuring decision, and preferred old-space. 1899 // size, pretenuring decision, and preferred old-space.
1744 static AllocationSpace SelectSpace(int object_size, 1900 static AllocationSpace SelectSpace(int object_size,
1745 AllocationSpace preferred_old_space, 1901 AllocationSpace preferred_old_space,
1746 PretenureFlag pretenure) { 1902 PretenureFlag pretenure) {
1747 ASSERT(preferred_old_space == OLD_POINTER_SPACE || 1903 ASSERT(preferred_old_space == OLD_POINTER_SPACE ||
(...skipping 205 matching lines...) Expand 10 before | Expand all | Expand 10 after
1953 static String* UpdateNewSpaceReferenceInExternalStringTableEntry( 2109 static String* UpdateNewSpaceReferenceInExternalStringTableEntry(
1954 Heap* heap, 2110 Heap* heap,
1955 Object** pointer); 2111 Object** pointer);
1956 2112
1957 Address DoScavenge(ObjectVisitor* scavenge_visitor, Address new_space_front); 2113 Address DoScavenge(ObjectVisitor* scavenge_visitor, Address new_space_front);
1958 static void ScavengeStoreBufferCallback(Heap* heap, 2114 static void ScavengeStoreBufferCallback(Heap* heap,
1959 MemoryChunk* page, 2115 MemoryChunk* page,
1960 StoreBufferEvent event); 2116 StoreBufferEvent event);
1961 2117
1962 // Performs a major collection in the whole heap. 2118 // Performs a major collection in the whole heap.
1963 void MarkCompact(GCTracer* tracer); 2119 void MarkCompact();
1964 2120
1965 // Code to be run before and after mark-compact. 2121 // Code to be run before and after mark-compact.
1966 void MarkCompactPrologue(); 2122 void MarkCompactPrologue();
1967 2123
1968 void ProcessNativeContexts(WeakObjectRetainer* retainer); 2124 void ProcessNativeContexts(WeakObjectRetainer* retainer);
1969 void ProcessArrayBuffers(WeakObjectRetainer* retainer); 2125 void ProcessArrayBuffers(WeakObjectRetainer* retainer);
1970 void ProcessAllocationSites(WeakObjectRetainer* retainer); 2126 void ProcessAllocationSites(WeakObjectRetainer* retainer);
1971 2127
1972 // Deopts all code that contains allocation instruction which are tenured or 2128 // Deopts all code that contains allocation instruction which are tenured or
1973 // not tenured. Moreover it clears the pretenuring allocation site statistics. 2129 // not tenured. Moreover it clears the pretenuring allocation site statistics.
(...skipping 10 matching lines...) Expand all
1984 // Record statistics before and after garbage collection. 2140 // Record statistics before and after garbage collection.
1985 void ReportStatisticsBeforeGC(); 2141 void ReportStatisticsBeforeGC();
1986 void ReportStatisticsAfterGC(); 2142 void ReportStatisticsAfterGC();
1987 2143
1988 // Slow part of scavenge object. 2144 // Slow part of scavenge object.
1989 static void ScavengeObjectSlow(HeapObject** p, HeapObject* object); 2145 static void ScavengeObjectSlow(HeapObject** p, HeapObject* object);
1990 2146
1991 // Total RegExp code ever generated 2147 // Total RegExp code ever generated
1992 double total_regexp_code_generated_; 2148 double total_regexp_code_generated_;
1993 2149
1994 GCTracer* tracer_; 2150 GCTracer tracer_;
1995 2151
1996 // Creates and installs the full-sized number string cache. 2152 // Creates and installs the full-sized number string cache.
1997 int FullSizeNumberStringCacheLength(); 2153 int FullSizeNumberStringCacheLength();
1998 // Flush the number to string cache. 2154 // Flush the number to string cache.
1999 void FlushNumberStringCache(); 2155 void FlushNumberStringCache();
2000 2156
2001 // Sets used allocation sites entries to undefined. 2157 // Sets used allocation sites entries to undefined.
2002 void FlushAllocationSitesScratchpad(); 2158 void FlushAllocationSitesScratchpad();
2003 2159
2004 // Initializes the allocation sites scratchpad with undefined values. 2160 // Initializes the allocation sites scratchpad with undefined values.
(...skipping 497 matching lines...) Expand 10 before | Expand all | Expand 10 after
2502 }; 2658 };
2503 2659
2504 Key keys_[kLength]; 2660 Key keys_[kLength];
2505 int results_[kLength]; 2661 int results_[kLength];
2506 2662
2507 friend class Isolate; 2663 friend class Isolate;
2508 DISALLOW_COPY_AND_ASSIGN(DescriptorLookupCache); 2664 DISALLOW_COPY_AND_ASSIGN(DescriptorLookupCache);
2509 }; 2665 };
2510 2666
2511 2667
2512 // GCTracer collects and prints ONE line after each garbage collector
2513 // invocation IFF --trace_gc is used.
2514
2515 class GCTracer BASE_EMBEDDED {
2516 public:
2517 class Scope BASE_EMBEDDED {
2518 public:
2519 enum ScopeId {
2520 EXTERNAL,
2521 MC_MARK,
2522 MC_SWEEP,
2523 MC_SWEEP_NEWSPACE,
2524 MC_SWEEP_OLDSPACE,
2525 MC_SWEEP_CODE,
2526 MC_SWEEP_CELL,
2527 MC_SWEEP_MAP,
2528 MC_EVACUATE_PAGES,
2529 MC_UPDATE_NEW_TO_NEW_POINTERS,
2530 MC_UPDATE_ROOT_TO_NEW_POINTERS,
2531 MC_UPDATE_OLD_TO_NEW_POINTERS,
2532 MC_UPDATE_POINTERS_TO_EVACUATED,
2533 MC_UPDATE_POINTERS_BETWEEN_EVACUATED,
2534 MC_UPDATE_MISC_POINTERS,
2535 MC_WEAKCOLLECTION_PROCESS,
2536 MC_WEAKCOLLECTION_CLEAR,
2537 MC_FLUSH_CODE,
2538 kNumberOfScopes
2539 };
2540
2541 Scope(GCTracer* tracer, ScopeId scope)
2542 : tracer_(tracer),
2543 scope_(scope) {
2544 start_time_ = base::OS::TimeCurrentMillis();
2545 }
2546
2547 ~Scope() {
2548 ASSERT(scope_ < kNumberOfScopes); // scope_ is unsigned.
2549 tracer_->scopes_[scope_] += base::OS::TimeCurrentMillis() - start_time_;
2550 }
2551
2552 private:
2553 GCTracer* tracer_;
2554 ScopeId scope_;
2555 double start_time_;
2556 };
2557
2558 explicit GCTracer(Heap* heap,
2559 const char* gc_reason,
2560 const char* collector_reason);
2561 ~GCTracer();
2562
2563 // Sets the collector.
2564 void set_collector(GarbageCollector collector) { collector_ = collector; }
2565
2566 // Sets the GC count.
2567 void set_gc_count(unsigned int count) { gc_count_ = count; }
2568
2569 // Sets the full GC count.
2570 void set_full_gc_count(int count) { full_gc_count_ = count; }
2571
2572 void increment_nodes_died_in_new_space() {
2573 nodes_died_in_new_space_++;
2574 }
2575
2576 void increment_nodes_copied_in_new_space() {
2577 nodes_copied_in_new_space_++;
2578 }
2579
2580 void increment_nodes_promoted() {
2581 nodes_promoted_++;
2582 }
2583
2584 private:
2585 // Returns a string matching the collector.
2586 const char* CollectorString();
2587
2588 // Returns size of object in heap (in MB).
2589 inline double SizeOfHeapObjects();
2590
2591 // Timestamp set in the constructor.
2592 double start_time_;
2593
2594 // Size of objects in heap set in constructor.
2595 intptr_t start_object_size_;
2596
2597 // Size of memory allocated from OS set in constructor.
2598 intptr_t start_memory_size_;
2599
2600 // Type of collector.
2601 GarbageCollector collector_;
2602
2603 // A count (including this one, e.g. the first collection is 1) of the
2604 // number of garbage collections.
2605 unsigned int gc_count_;
2606
2607 // A count (including this one) of the number of full garbage collections.
2608 int full_gc_count_;
2609
2610 // Amounts of time spent in different scopes during GC.
2611 double scopes_[Scope::kNumberOfScopes];
2612
2613 // Total amount of space either wasted or contained in one of free lists
2614 // before the current GC.
2615 intptr_t in_free_list_or_wasted_before_gc_;
2616
2617 // Difference between space used in the heap at the beginning of the current
2618 // collection and the end of the previous collection.
2619 intptr_t allocated_since_last_gc_;
2620
2621 // Amount of time spent in mutator that is time elapsed between end of the
2622 // previous collection and the beginning of the current one.
2623 double spent_in_mutator_;
2624
2625 // Number of died nodes in the new space.
2626 int nodes_died_in_new_space_;
2627
2628 // Number of copied nodes to the new space.
2629 int nodes_copied_in_new_space_;
2630
2631 // Number of promoted nodes to the old space.
2632 int nodes_promoted_;
2633
2634 // Incremental marking steps counters.
2635 int steps_count_;
2636 double steps_took_;
2637 double longest_step_;
2638 int steps_count_since_last_gc_;
2639 double steps_took_since_last_gc_;
2640
2641 Heap* heap_;
2642
2643 const char* gc_reason_;
2644 const char* collector_reason_;
2645 };
2646
2647
2648 class RegExpResultsCache { 2668 class RegExpResultsCache {
2649 public: 2669 public:
2650 enum ResultsCacheType { REGEXP_MULTIPLE_INDICES, STRING_SPLIT_SUBSTRINGS }; 2670 enum ResultsCacheType { REGEXP_MULTIPLE_INDICES, STRING_SPLIT_SUBSTRINGS };
2651 2671
2652 // Attempt to retrieve a cached result. On failure, 0 is returned as a Smi. 2672 // Attempt to retrieve a cached result. On failure, 0 is returned as a Smi.
2653 // On success, the returned result is guaranteed to be a COW-array. 2673 // On success, the returned result is guaranteed to be a COW-array.
2654 static Object* Lookup(Heap* heap, 2674 static Object* Lookup(Heap* heap,
2655 String* key_string, 2675 String* key_string,
2656 Object* key_pattern, 2676 Object* key_pattern,
2657 ResultsCacheType type); 2677 ResultsCacheType type);
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
2780 DisallowHeapAllocation no_allocation; // i.e. no gc allowed. 2800 DisallowHeapAllocation no_allocation; // i.e. no gc allowed.
2781 2801
2782 private: 2802 private:
2783 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); 2803 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer);
2784 }; 2804 };
2785 #endif // DEBUG 2805 #endif // DEBUG
2786 2806
2787 } } // namespace v8::internal 2807 } } // namespace v8::internal
2788 2808
2789 #endif // V8_HEAP_H_ 2809 #endif // V8_HEAP_H_
OLDNEW
« no previous file with comments | « src/global-handles.cc ('k') | src/heap.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698