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 1007 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1018 inline Object* ToBoolean(bool condition); | 1018 inline Object* ToBoolean(bool condition); |
1019 | 1019 |
1020 // Code that should be run before and after each GC. Includes some | 1020 // Code that should be run before and after each GC. Includes some |
1021 // reporting/verification activities when compiled with DEBUG set. | 1021 // reporting/verification activities when compiled with DEBUG set. |
1022 void GarbageCollectionPrologue(); | 1022 void GarbageCollectionPrologue(); |
1023 void GarbageCollectionEpilogue(); | 1023 void GarbageCollectionEpilogue(); |
1024 | 1024 |
1025 // Performs garbage collection operation. | 1025 // Performs garbage collection operation. |
1026 // Returns whether there is a chance that another major GC could | 1026 // Returns whether there is a chance that another major GC could |
1027 // collect more garbage. | 1027 // collect more garbage. |
1028 bool CollectGarbage(AllocationSpace space, GarbageCollector collector); | 1028 bool CollectGarbage(AllocationSpace space, |
| 1029 GarbageCollector collector, |
| 1030 const char* gc_reason, |
| 1031 const char* collector_reason); |
1029 | 1032 |
1030 // Performs garbage collection operation. | 1033 // Performs garbage collection operation. |
1031 // Returns whether there is a chance that another major GC could | 1034 // Returns whether there is a chance that another major GC could |
1032 // collect more garbage. | 1035 // collect more garbage. |
1033 inline bool CollectGarbage(AllocationSpace space); | 1036 inline bool CollectGarbage(AllocationSpace space, |
| 1037 const char* gc_reason = NULL); |
1034 | 1038 |
1035 static const int kNoGCFlags = 0; | 1039 static const int kNoGCFlags = 0; |
1036 static const int kMakeHeapIterableMask = 1; | 1040 static const int kMakeHeapIterableMask = 1; |
| 1041 static const int kReduceMemoryFootprintMask = 2; |
1037 | 1042 |
1038 // Performs a full garbage collection. If (flags & kMakeHeapIterableMask) is | 1043 // Performs a full garbage collection. If (flags & kMakeHeapIterableMask) is |
1039 // non-zero, then the slower precise sweeper is used, which leaves the heap | 1044 // non-zero, then the slower precise sweeper is used, which leaves the heap |
1040 // in a state where we can iterate over the heap visiting all objects. | 1045 // in a state where we can iterate over the heap visiting all objects. |
1041 void CollectAllGarbage(int flags); | 1046 void CollectAllGarbage(int flags, const char* gc_reason = NULL); |
1042 | 1047 |
1043 // Last hope GC, should try to squeeze as much as possible. | 1048 // Last hope GC, should try to squeeze as much as possible. |
1044 void CollectAllAvailableGarbage(); | 1049 void CollectAllAvailableGarbage(const char* gc_reason = NULL); |
1045 | 1050 |
1046 // Check whether the heap is currently iterable. | 1051 // Check whether the heap is currently iterable. |
1047 bool IsHeapIterable(); | 1052 bool IsHeapIterable(); |
1048 | 1053 |
1049 // Ensure that we have swept all spaces in such a way that we can iterate | 1054 // Ensure that we have swept all spaces in such a way that we can iterate |
1050 // over all objects. May cause a GC. | 1055 // over all objects. May cause a GC. |
1051 void EnsureHeapIsIterable(); | 1056 void EnsureHeapIsIterable(); |
1052 | 1057 |
1053 // Notify the heap that a context has been disposed. | 1058 // Notify the heap that a context has been disposed. |
1054 int NotifyContextDisposed() { return ++contexts_disposed_; } | 1059 int NotifyContextDisposed() { return ++contexts_disposed_; } |
(...skipping 679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1734 HeapObjectCallback gc_safe_size_of_old_object_; | 1739 HeapObjectCallback gc_safe_size_of_old_object_; |
1735 static int GcSafeSizeOfOldObject(HeapObject* object); | 1740 static int GcSafeSizeOfOldObject(HeapObject* object); |
1736 | 1741 |
1737 // Update the GC state. Called from the mark-compact collector. | 1742 // Update the GC state. Called from the mark-compact collector. |
1738 void MarkMapPointersAsEncoded(bool encoded) { | 1743 void MarkMapPointersAsEncoded(bool encoded) { |
1739 ASSERT(!encoded); | 1744 ASSERT(!encoded); |
1740 gc_safe_size_of_old_object_ = &GcSafeSizeOfOldObject; | 1745 gc_safe_size_of_old_object_ = &GcSafeSizeOfOldObject; |
1741 } | 1746 } |
1742 | 1747 |
1743 // Checks whether a global GC is necessary | 1748 // Checks whether a global GC is necessary |
1744 GarbageCollector SelectGarbageCollector(AllocationSpace space); | 1749 GarbageCollector SelectGarbageCollector(AllocationSpace space, |
| 1750 const char** reason); |
1745 | 1751 |
1746 // Performs garbage collection | 1752 // Performs garbage collection |
1747 // Returns whether there is a chance another major GC could | 1753 // Returns whether there is a chance another major GC could |
1748 // collect more garbage. | 1754 // collect more garbage. |
1749 bool PerformGarbageCollection(GarbageCollector collector, | 1755 bool PerformGarbageCollection(GarbageCollector collector, |
1750 GCTracer* tracer); | 1756 GCTracer* tracer); |
1751 | 1757 |
1752 | 1758 |
1753 inline void UpdateOldSpaceLimits(); | 1759 inline void UpdateOldSpaceLimits(); |
1754 | 1760 |
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2357 ASSERT(scope_ < kNumberOfScopes); // scope_ is unsigned. | 2363 ASSERT(scope_ < kNumberOfScopes); // scope_ is unsigned. |
2358 tracer_->scopes_[scope_] += OS::TimeCurrentMillis() - start_time_; | 2364 tracer_->scopes_[scope_] += OS::TimeCurrentMillis() - start_time_; |
2359 } | 2365 } |
2360 | 2366 |
2361 private: | 2367 private: |
2362 GCTracer* tracer_; | 2368 GCTracer* tracer_; |
2363 ScopeId scope_; | 2369 ScopeId scope_; |
2364 double start_time_; | 2370 double start_time_; |
2365 }; | 2371 }; |
2366 | 2372 |
2367 explicit GCTracer(Heap* heap); | 2373 explicit GCTracer(Heap* heap, |
| 2374 const char* gc_reason, |
| 2375 const char* collector_reason); |
2368 ~GCTracer(); | 2376 ~GCTracer(); |
2369 | 2377 |
2370 // Sets the collector. | 2378 // Sets the collector. |
2371 void set_collector(GarbageCollector collector) { collector_ = collector; } | 2379 void set_collector(GarbageCollector collector) { collector_ = collector; } |
2372 | 2380 |
2373 // Sets the GC count. | 2381 // Sets the GC count. |
2374 void set_gc_count(unsigned int count) { gc_count_ = count; } | 2382 void set_gc_count(unsigned int count) { gc_count_ = count; } |
2375 | 2383 |
2376 // Sets the full GC count. | 2384 // Sets the full GC count. |
2377 void set_full_gc_count(int count) { full_gc_count_ = count; } | 2385 void set_full_gc_count(int count) { full_gc_count_ = count; } |
2378 | 2386 |
2379 void increment_promoted_objects_size(int object_size) { | 2387 void increment_promoted_objects_size(int object_size) { |
2380 promoted_objects_size_ += object_size; | 2388 promoted_objects_size_ += object_size; |
2381 } | 2389 } |
2382 | 2390 |
2383 private: | 2391 private: |
2384 // Returns a string matching the collector. | 2392 // Returns a string matching the collector. |
2385 const char* CollectorString(); | 2393 const char* CollectorString(); |
2386 | 2394 |
2387 // Returns size of object in heap (in MB). | 2395 // Returns size of object in heap (in MB). |
2388 inline double SizeOfHeapObjects(); | 2396 inline double SizeOfHeapObjects(); |
2389 | 2397 |
2390 double start_time_; // Timestamp set in the constructor. | 2398 // Timestamp set in the constructor. |
2391 intptr_t start_size_; // Size of objects in heap set in constructor. | 2399 double start_time_; |
2392 GarbageCollector collector_; // Type of collector. | 2400 |
| 2401 // Size of objects in heap set in constructor. |
| 2402 intptr_t start_object_size_; |
| 2403 |
| 2404 // Size of memory allocated from OS set in constructor. |
| 2405 intptr_t start_memory_size_; |
| 2406 |
| 2407 // Type of collector. |
| 2408 GarbageCollector collector_; |
2393 | 2409 |
2394 // A count (including this one, e.g. the first collection is 1) of the | 2410 // A count (including this one, e.g. the first collection is 1) of the |
2395 // number of garbage collections. | 2411 // number of garbage collections. |
2396 unsigned int gc_count_; | 2412 unsigned int gc_count_; |
2397 | 2413 |
2398 // A count (including this one) of the number of full garbage collections. | 2414 // A count (including this one) of the number of full garbage collections. |
2399 int full_gc_count_; | 2415 int full_gc_count_; |
2400 | 2416 |
2401 // Amounts of time spent in different scopes during GC. | 2417 // Amounts of time spent in different scopes during GC. |
2402 double scopes_[Scope::kNumberOfScopes]; | 2418 double scopes_[Scope::kNumberOfScopes]; |
(...skipping 14 matching lines...) Expand all Loading... |
2417 intptr_t promoted_objects_size_; | 2433 intptr_t promoted_objects_size_; |
2418 | 2434 |
2419 // Incremental marking steps counters. | 2435 // Incremental marking steps counters. |
2420 int steps_count_; | 2436 int steps_count_; |
2421 double steps_took_; | 2437 double steps_took_; |
2422 double longest_step_; | 2438 double longest_step_; |
2423 int steps_count_since_last_gc_; | 2439 int steps_count_since_last_gc_; |
2424 double steps_took_since_last_gc_; | 2440 double steps_took_since_last_gc_; |
2425 | 2441 |
2426 Heap* heap_; | 2442 Heap* heap_; |
| 2443 |
| 2444 const char* gc_reason_; |
| 2445 const char* collector_reason_; |
2427 }; | 2446 }; |
2428 | 2447 |
2429 | 2448 |
2430 class StringSplitCache { | 2449 class StringSplitCache { |
2431 public: | 2450 public: |
2432 static Object* Lookup(FixedArray* cache, String* string, String* pattern); | 2451 static Object* Lookup(FixedArray* cache, String* string, String* pattern); |
2433 static void Enter(Heap* heap, | 2452 static void Enter(Heap* heap, |
2434 FixedArray* cache, | 2453 FixedArray* cache, |
2435 String* string, | 2454 String* string, |
2436 String* pattern, | 2455 String* pattern, |
(...skipping 192 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2629 AssertNoAllocation no_alloc; // i.e. no gc allowed. | 2648 AssertNoAllocation no_alloc; // i.e. no gc allowed. |
2630 | 2649 |
2631 private: | 2650 private: |
2632 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); | 2651 DISALLOW_IMPLICIT_CONSTRUCTORS(PathTracer); |
2633 }; | 2652 }; |
2634 #endif // DEBUG || LIVE_OBJECT_LIST | 2653 #endif // DEBUG || LIVE_OBJECT_LIST |
2635 | 2654 |
2636 } } // namespace v8::internal | 2655 } } // namespace v8::internal |
2637 | 2656 |
2638 #endif // V8_HEAP_H_ | 2657 #endif // V8_HEAP_H_ |
OLD | NEW |