| OLD | NEW |
| 1 // Copyright 2006-2008 the V8 project authors. All rights reserved. | 1 // Copyright 2006-2008 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 963 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 974 // Helper function that governs the promotion policy from new space to | 974 // Helper function that governs the promotion policy from new space to |
| 975 // old. If the object's old address lies below the new space's age | 975 // old. If the object's old address lies below the new space's age |
| 976 // mark or if we've already filled the bottom 1/16th of the to space, | 976 // mark or if we've already filled the bottom 1/16th of the to space, |
| 977 // we try to promote this object. | 977 // we try to promote this object. |
| 978 static inline bool ShouldBePromoted(Address old_address, int object_size); | 978 static inline bool ShouldBePromoted(Address old_address, int object_size); |
| 979 | 979 |
| 980 static int MaxObjectSizeInNewSpace() { return kMaxObjectSizeInNewSpace; } | 980 static int MaxObjectSizeInNewSpace() { return kMaxObjectSizeInNewSpace; } |
| 981 | 981 |
| 982 static void ClearJSFunctionResultCaches(); | 982 static void ClearJSFunctionResultCaches(); |
| 983 | 983 |
| 984 static GCTracer* tracer() { return tracer_; } |
| 985 |
| 984 private: | 986 private: |
| 985 static int reserved_semispace_size_; | 987 static int reserved_semispace_size_; |
| 986 static int max_semispace_size_; | 988 static int max_semispace_size_; |
| 987 static int initial_semispace_size_; | 989 static int initial_semispace_size_; |
| 988 static int max_old_generation_size_; | 990 static int max_old_generation_size_; |
| 989 static size_t code_range_size_; | 991 static size_t code_range_size_; |
| 990 | 992 |
| 991 // For keeping track of how much data has survived | 993 // For keeping track of how much data has survived |
| 992 // scavenge since last new space expansion. | 994 // scavenge since last new space expansion. |
| 993 static int survived_since_last_expansion_; | 995 static int survived_since_last_expansion_; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1013 static LargeObjectSpace* lo_space_; | 1015 static LargeObjectSpace* lo_space_; |
| 1014 static HeapState gc_state_; | 1016 static HeapState gc_state_; |
| 1015 | 1017 |
| 1016 // Returns the size of object residing in non new spaces. | 1018 // Returns the size of object residing in non new spaces. |
| 1017 static int PromotedSpaceSize(); | 1019 static int PromotedSpaceSize(); |
| 1018 | 1020 |
| 1019 // Returns the amount of external memory registered since last global gc. | 1021 // Returns the amount of external memory registered since last global gc. |
| 1020 static int PromotedExternalMemorySize(); | 1022 static int PromotedExternalMemorySize(); |
| 1021 | 1023 |
| 1022 static int mc_count_; // how many mark-compact collections happened | 1024 static int mc_count_; // how many mark-compact collections happened |
| 1025 static int ms_count_; // how many mark-sweep collections happened |
| 1023 static int gc_count_; // how many gc happened | 1026 static int gc_count_; // how many gc happened |
| 1024 | 1027 |
| 1025 // Total length of the strings we failed to flatten since the last GC. | 1028 // Total length of the strings we failed to flatten since the last GC. |
| 1026 static int unflattened_strings_length_; | 1029 static int unflattened_strings_length_; |
| 1027 | 1030 |
| 1028 #define ROOT_ACCESSOR(type, name, camel_name) \ | 1031 #define ROOT_ACCESSOR(type, name, camel_name) \ |
| 1029 static inline void set_##name(type* value) { \ | 1032 static inline void set_##name(type* value) { \ |
| 1030 roots_[k##camel_name##RootIndex] = value; \ | 1033 roots_[k##camel_name##RootIndex] = value; \ |
| 1031 } | 1034 } |
| 1032 ROOT_LIST(ROOT_ACCESSOR) | 1035 ROOT_LIST(ROOT_ACCESSOR) |
| (...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1216 // Initializes a function with a shared part and prototype. | 1219 // Initializes a function with a shared part and prototype. |
| 1217 // Returns the function. | 1220 // Returns the function. |
| 1218 // Note: this code was factored out of AllocateFunction such that | 1221 // Note: this code was factored out of AllocateFunction such that |
| 1219 // other parts of the VM could use it. Specifically, a function that creates | 1222 // other parts of the VM could use it. Specifically, a function that creates |
| 1220 // instances of type JS_FUNCTION_TYPE benefit from the use of this function. | 1223 // instances of type JS_FUNCTION_TYPE benefit from the use of this function. |
| 1221 // Please note this does not perform a garbage collection. | 1224 // Please note this does not perform a garbage collection. |
| 1222 static inline Object* InitializeFunction(JSFunction* function, | 1225 static inline Object* InitializeFunction(JSFunction* function, |
| 1223 SharedFunctionInfo* shared, | 1226 SharedFunctionInfo* shared, |
| 1224 Object* prototype); | 1227 Object* prototype); |
| 1225 | 1228 |
| 1229 static GCTracer* tracer_; |
| 1230 |
| 1226 | 1231 |
| 1227 // Initializes the number to string cache based on the max semispace size. | 1232 // Initializes the number to string cache based on the max semispace size. |
| 1228 static Object* InitializeNumberStringCache(); | 1233 static Object* InitializeNumberStringCache(); |
| 1229 // Flush the number to string cache. | 1234 // Flush the number to string cache. |
| 1230 static void FlushNumberStringCache(); | 1235 static void FlushNumberStringCache(); |
| 1231 | 1236 |
| 1232 static const int kInitialSymbolTableSize = 2048; | 1237 static const int kInitialSymbolTableSize = 2048; |
| 1233 static const int kInitialEvalCacheSize = 64; | 1238 static const int kInitialEvalCacheSize = 64; |
| 1234 | 1239 |
| 1235 friend class Factory; | 1240 friend class Factory; |
| (...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1622 ~DisableAssertNoAllocation() { } | 1627 ~DisableAssertNoAllocation() { } |
| 1623 }; | 1628 }; |
| 1624 | 1629 |
| 1625 #endif | 1630 #endif |
| 1626 | 1631 |
| 1627 // GCTracer collects and prints ONE line after each garbage collector | 1632 // GCTracer collects and prints ONE line after each garbage collector |
| 1628 // invocation IFF --trace_gc is used. | 1633 // invocation IFF --trace_gc is used. |
| 1629 | 1634 |
| 1630 class GCTracer BASE_EMBEDDED { | 1635 class GCTracer BASE_EMBEDDED { |
| 1631 public: | 1636 public: |
| 1632 // Time spent while in the external scope counts towards the | 1637 class Scope BASE_EMBEDDED { |
| 1633 // external time in the tracer and will be reported separately. | |
| 1634 class ExternalScope BASE_EMBEDDED { | |
| 1635 public: | 1638 public: |
| 1636 explicit ExternalScope(GCTracer* tracer) : tracer_(tracer) { | 1639 enum ScopeId { |
| 1640 EXTERNAL, |
| 1641 MC_MARK, |
| 1642 MC_SWEEP, |
| 1643 MC_COMPACT, |
| 1644 kNumberOfScopes |
| 1645 }; |
| 1646 |
| 1647 Scope(GCTracer* tracer, ScopeId scope) |
| 1648 : tracer_(tracer), |
| 1649 scope_(scope) { |
| 1637 start_time_ = OS::TimeCurrentMillis(); | 1650 start_time_ = OS::TimeCurrentMillis(); |
| 1638 } | 1651 } |
| 1639 ~ExternalScope() { | 1652 |
| 1640 tracer_->external_time_ += OS::TimeCurrentMillis() - start_time_; | 1653 ~Scope() { |
| 1654 ASSERT((0 <= scope_) && (scope_ < kNumberOfScopes)); |
| 1655 tracer_->scopes_[scope_] += OS::TimeCurrentMillis() - start_time_; |
| 1641 } | 1656 } |
| 1642 | 1657 |
| 1643 private: | 1658 private: |
| 1644 GCTracer* tracer_; | 1659 GCTracer* tracer_; |
| 1660 ScopeId scope_; |
| 1645 double start_time_; | 1661 double start_time_; |
| 1646 }; | 1662 }; |
| 1647 | 1663 |
| 1648 GCTracer(); | 1664 GCTracer(); |
| 1649 ~GCTracer(); | 1665 ~GCTracer(); |
| 1650 | 1666 |
| 1651 // Sets the collector. | 1667 // Sets the collector. |
| 1652 void set_collector(GarbageCollector collector) { collector_ = collector; } | 1668 void set_collector(GarbageCollector collector) { collector_ = collector; } |
| 1653 | 1669 |
| 1654 // Sets the GC count. | 1670 // Sets the GC count. |
| 1655 void set_gc_count(int count) { gc_count_ = count; } | 1671 void set_gc_count(int count) { gc_count_ = count; } |
| 1656 | 1672 |
| 1657 // Sets the full GC count. | 1673 // Sets the full GC count. |
| 1658 void set_full_gc_count(int count) { full_gc_count_ = count; } | 1674 void set_full_gc_count(int count) { full_gc_count_ = count; } |
| 1659 | 1675 |
| 1660 // Sets the flag that this is a compacting full GC. | 1676 // Sets the flag that this is a compacting full GC. |
| 1661 void set_is_compacting() { is_compacting_ = true; } | 1677 void set_is_compacting() { is_compacting_ = true; } |
| 1662 bool is_compacting() const { return is_compacting_; } | 1678 bool is_compacting() const { return is_compacting_; } |
| 1663 | 1679 |
| 1664 // Increment and decrement the count of marked objects. | 1680 // Increment and decrement the count of marked objects. |
| 1665 void increment_marked_count() { ++marked_count_; } | 1681 void increment_marked_count() { ++marked_count_; } |
| 1666 void decrement_marked_count() { --marked_count_; } | 1682 void decrement_marked_count() { --marked_count_; } |
| 1667 | 1683 |
| 1668 int marked_count() { return marked_count_; } | 1684 int marked_count() { return marked_count_; } |
| 1669 | 1685 |
| 1686 void increment_promoted_objects_size(int object_size) { |
| 1687 promoted_objects_size_ += object_size; |
| 1688 } |
| 1689 |
| 1690 // Returns maximum GC pause. |
| 1691 static int get_max_gc_pause() { return max_gc_pause_; } |
| 1692 |
| 1693 // Returns maximum size of objects alive after GC. |
| 1694 static int get_max_alive_after_gc() { return max_alive_after_gc_; } |
| 1695 |
| 1696 // Returns minimal interval between two subsequent collections. |
| 1697 static int get_min_in_mutator() { return min_in_mutator_; } |
| 1698 |
| 1670 private: | 1699 private: |
| 1671 // Returns a string matching the collector. | 1700 // Returns a string matching the collector. |
| 1672 const char* CollectorString(); | 1701 const char* CollectorString(); |
| 1673 | 1702 |
| 1674 // Returns size of object in heap (in MB). | 1703 // Returns size of object in heap (in MB). |
| 1675 double SizeOfHeapObjects() { | 1704 double SizeOfHeapObjects() { |
| 1676 return (static_cast<double>(Heap::SizeOfObjects())) / MB; | 1705 return (static_cast<double>(Heap::SizeOfObjects())) / MB; |
| 1677 } | 1706 } |
| 1678 | 1707 |
| 1679 double start_time_; // Timestamp set in the constructor. | 1708 double start_time_; // Timestamp set in the constructor. |
| 1680 double start_size_; // Size of objects in heap set in constructor. | 1709 int start_size_; // Size of objects in heap set in constructor. |
| 1681 GarbageCollector collector_; // Type of collector. | 1710 GarbageCollector collector_; // Type of collector. |
| 1682 | 1711 |
| 1683 // Keep track of the amount of time spent in external callbacks. | |
| 1684 double external_time_; | |
| 1685 | |
| 1686 // A count (including this one, eg, the first collection is 1) of the | 1712 // A count (including this one, eg, the first collection is 1) of the |
| 1687 // number of garbage collections. | 1713 // number of garbage collections. |
| 1688 int gc_count_; | 1714 int gc_count_; |
| 1689 | 1715 |
| 1690 // A count (including this one) of the number of full garbage collections. | 1716 // A count (including this one) of the number of full garbage collections. |
| 1691 int full_gc_count_; | 1717 int full_gc_count_; |
| 1692 | 1718 |
| 1693 // True if the current GC is a compacting full collection, false | 1719 // True if the current GC is a compacting full collection, false |
| 1694 // otherwise. | 1720 // otherwise. |
| 1695 bool is_compacting_; | 1721 bool is_compacting_; |
| 1696 | 1722 |
| 1697 // True if the *previous* full GC cwas a compacting collection (will be | 1723 // True if the *previous* full GC cwas a compacting collection (will be |
| 1698 // false if there has not been a previous full GC). | 1724 // false if there has not been a previous full GC). |
| 1699 bool previous_has_compacted_; | 1725 bool previous_has_compacted_; |
| 1700 | 1726 |
| 1701 // On a full GC, a count of the number of marked objects. Incremented | 1727 // On a full GC, a count of the number of marked objects. Incremented |
| 1702 // when an object is marked and decremented when an object's mark bit is | 1728 // when an object is marked and decremented when an object's mark bit is |
| 1703 // cleared. Will be zero on a scavenge collection. | 1729 // cleared. Will be zero on a scavenge collection. |
| 1704 int marked_count_; | 1730 int marked_count_; |
| 1705 | 1731 |
| 1706 // The count from the end of the previous full GC. Will be zero if there | 1732 // The count from the end of the previous full GC. Will be zero if there |
| 1707 // was no previous full GC. | 1733 // was no previous full GC. |
| 1708 int previous_marked_count_; | 1734 int previous_marked_count_; |
| 1735 |
| 1736 // Amounts of time spent in different scopes during GC. |
| 1737 double scopes_[Scope::kNumberOfScopes]; |
| 1738 |
| 1739 // Total amount of space either wasted or contained in one of free lists |
| 1740 // before the current GC. |
| 1741 int in_free_list_or_wasted_before_gc_; |
| 1742 |
| 1743 // Difference between space used in the heap at the beginning of the current |
| 1744 // collection and the end of the previous collection. |
| 1745 int allocated_since_last_gc_; |
| 1746 |
| 1747 // Amount of time spent in mutator that is time elapsed between end of the |
| 1748 // previous collection and the beginning of the current one. |
| 1749 double spent_in_mutator_; |
| 1750 |
| 1751 // Size of objects promoted during the current collection. |
| 1752 int promoted_objects_size_; |
| 1753 |
| 1754 // Maximum GC pause. |
| 1755 static int max_gc_pause_; |
| 1756 |
| 1757 // Maximum size of objects alive after GC. |
| 1758 static int max_alive_after_gc_; |
| 1759 |
| 1760 // Minimal interval between two subsequent collections. |
| 1761 static int min_in_mutator_; |
| 1762 |
| 1763 // Size of objects alive after last GC. |
| 1764 static int alive_after_last_gc_; |
| 1765 |
| 1766 static double last_gc_end_timestamp_; |
| 1709 }; | 1767 }; |
| 1710 | 1768 |
| 1711 | 1769 |
| 1712 class TranscendentalCache { | 1770 class TranscendentalCache { |
| 1713 public: | 1771 public: |
| 1714 enum Type {ACOS, ASIN, ATAN, COS, EXP, LOG, SIN, TAN, kNumberOfCaches}; | 1772 enum Type {ACOS, ASIN, ATAN, COS, EXP, LOG, SIN, TAN, kNumberOfCaches}; |
| 1715 | 1773 |
| 1716 explicit TranscendentalCache(Type t); | 1774 explicit TranscendentalCache(Type t); |
| 1717 | 1775 |
| 1718 // Returns a heap number with f(input), where f is a math function specified | 1776 // Returns a heap number with f(input), where f is a math function specified |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1835 | 1893 |
| 1836 // To speed up scavenge collections new space string are kept | 1894 // To speed up scavenge collections new space string are kept |
| 1837 // separate from old space strings. | 1895 // separate from old space strings. |
| 1838 static List<Object*> new_space_strings_; | 1896 static List<Object*> new_space_strings_; |
| 1839 static List<Object*> old_space_strings_; | 1897 static List<Object*> old_space_strings_; |
| 1840 }; | 1898 }; |
| 1841 | 1899 |
| 1842 } } // namespace v8::internal | 1900 } } // namespace v8::internal |
| 1843 | 1901 |
| 1844 #endif // V8_HEAP_H_ | 1902 #endif // V8_HEAP_H_ |
| OLD | NEW |