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

Side by Side Diff: src/heap.cc

Issue 24269003: Add methods to enable configuration of ResourceConstraints based on limits derived at runtime. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 3 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
« src/heap.h ('K') | « src/heap.h ('k') | no next file » | 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 // 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 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
58 #endif 58 #endif
59 #if V8_TARGET_ARCH_MIPS && !V8_INTERPRETED_REGEXP 59 #if V8_TARGET_ARCH_MIPS && !V8_INTERPRETED_REGEXP
60 #include "regexp-macro-assembler.h" 60 #include "regexp-macro-assembler.h"
61 #include "mips/regexp-macro-assembler-mips.h" 61 #include "mips/regexp-macro-assembler-mips.h"
62 #endif 62 #endif
63 63
64 namespace v8 { 64 namespace v8 {
65 namespace internal { 65 namespace internal {
66 66
67 67
68 // semispace_size_ should be a power of 2 and old_generation_size_ should be
69 // a multiple of Page::kPageSize.
70 #if V8_TARGET_ARCH_X64
71 #define LUMP_OF_MEMORY (2 * MB)
72 #else
73 #define LUMP_OF_MEMORY MB
74 #endif
75 #if defined(ANDROID) || V8_TARGET_ARCH_MIPS
Hannes Payer (out of office) 2013/09/19 14:50:57 I never liked the ifdef here. Now it's time to get
rmcilroy 2013/09/19 15:01:34 I don't like this ifdef particularly either, but I
Hannes Payer (out of office) 2013/09/19 16:25:28 Well, what I mean is that we should have these ifd
rmcilroy 2013/09/19 19:46:11 There are more V8 embedders than just d8 and chrom
76 #define DEFAULT_SEMISPACE_MAX_SIZE (4 * Max(LUMP_OF_MEMORY, Page::kPageSize))
77 #define DEFAULT_OLD_GENERATION_MAX_SIZE (192*MB)
78 #define DEFAULT_EXECUTABLE_MAX_SIZE (192*MB)
79 #else
80 #define DEFAULT_SEMISPACE_MAX_SIZE (8 * Max(LUMP_OF_MEMORY, Page::kPageSize))
81 #define DEFAULT_OLD_GENERATION_MAX_SIZE (700ul * LUMP_OF_MEMORY)
82 #define DEFAULT_EXECUTABLE_MAX_SIZE (256l * LUMP_OF_MEMORY)
83 #endif
84
85
68 Heap::Heap() 86 Heap::Heap()
69 : isolate_(NULL), 87 : isolate_(NULL),
70 // semispace_size_ should be a power of 2 and old_generation_size_ should be
71 // a multiple of Page::kPageSize.
72 #if V8_TARGET_ARCH_X64 88 #if V8_TARGET_ARCH_X64
73 #define LUMP_OF_MEMORY (2 * MB)
74 code_range_size_(512*MB), 89 code_range_size_(512*MB),
75 #else 90 #else
76 #define LUMP_OF_MEMORY MB
77 code_range_size_(0), 91 code_range_size_(0),
78 #endif 92 #endif
79 #if defined(ANDROID) || V8_TARGET_ARCH_MIPS 93 reserved_semispace_size_(DEFAULT_SEMISPACE_MAX_SIZE),
Hannes Payer (out of office) 2013/09/19 14:50:57 Here we could set the values to proper default val
rmcilroy 2013/09/19 15:01:34 I'm not sure what you mean here?
Hannes Payer (out of office) 2013/09/19 16:25:28 What I meant is to set the values to reserved_semi
rmcilroy 2013/09/19 19:46:11 Maybe we could just set these all to zero initiall
80 reserved_semispace_size_(4 * Max(LUMP_OF_MEMORY, Page::kPageSize)), 94 max_semispace_size_(DEFAULT_SEMISPACE_MAX_SIZE),
81 max_semispace_size_(4 * Max(LUMP_OF_MEMORY, Page::kPageSize)),
82 initial_semispace_size_(Page::kPageSize), 95 initial_semispace_size_(Page::kPageSize),
83 max_old_generation_size_(192*MB), 96 max_old_generation_size_(DEFAULT_OLD_GENERATION_MAX_SIZE),
84 max_executable_size_(max_old_generation_size_), 97 max_executable_size_(DEFAULT_EXECUTABLE_MAX_SIZE),
85 #else
86 reserved_semispace_size_(8 * Max(LUMP_OF_MEMORY, Page::kPageSize)),
87 max_semispace_size_(8 * Max(LUMP_OF_MEMORY, Page::kPageSize)),
88 initial_semispace_size_(Page::kPageSize),
89 max_old_generation_size_(700ul * LUMP_OF_MEMORY),
90 max_executable_size_(256l * LUMP_OF_MEMORY),
91 #endif
92
93 // Variables set based on semispace_size_ and old_generation_size_ in 98 // Variables set based on semispace_size_ and old_generation_size_ in
94 // ConfigureHeap (survived_since_last_expansion_, external_allocation_limit_) 99 // ConfigureHeap (survived_since_last_expansion_, external_allocation_limit_)
95 // Will be 4 * reserved_semispace_size_ to ensure that young 100 // Will be 4 * reserved_semispace_size_ to ensure that young
96 // generation can be aligned to its size. 101 // generation can be aligned to its size.
97 survived_since_last_expansion_(0), 102 survived_since_last_expansion_(0),
98 sweep_generation_(0), 103 sweep_generation_(0),
99 always_allocate_scope_depth_(0), 104 always_allocate_scope_depth_(0),
100 linear_allocation_scope_depth_(0), 105 linear_allocation_scope_depth_(0),
101 contexts_disposed_(0), 106 contexts_disposed_(0),
102 global_ic_age_(0), 107 global_ic_age_(0),
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 last_idle_notification_gc_count_init_(false), 159 last_idle_notification_gc_count_init_(false),
155 mark_sweeps_since_idle_round_started_(0), 160 mark_sweeps_since_idle_round_started_(0),
156 gc_count_at_last_idle_gc_(0), 161 gc_count_at_last_idle_gc_(0),
157 scavenges_since_last_idle_round_(kIdleScavengeThreshold), 162 scavenges_since_last_idle_round_(kIdleScavengeThreshold),
158 gcs_since_last_deopt_(0), 163 gcs_since_last_deopt_(0),
159 #ifdef VERIFY_HEAP 164 #ifdef VERIFY_HEAP
160 no_weak_embedded_maps_verification_scope_depth_(0), 165 no_weak_embedded_maps_verification_scope_depth_(0),
161 #endif 166 #endif
162 promotion_queue_(this), 167 promotion_queue_(this),
163 configured_(false), 168 configured_(false),
169 limits_changed_from_defaults_(false),
164 chunks_queued_for_free_(NULL), 170 chunks_queued_for_free_(NULL),
165 relocation_mutex_(NULL) { 171 relocation_mutex_(NULL) {
166 // Allow build-time customization of the max semispace size. Building 172 // Allow build-time customization of the max semispace size. Building
167 // V8 with snapshots and a non-default max semispace size is much 173 // V8 with snapshots and a non-default max semispace size is much
168 // easier if you can define it as part of the build environment. 174 // easier if you can define it as part of the build environment.
169 #if defined(V8_MAX_SEMISPACE_SIZE) 175 #if defined(V8_MAX_SEMISPACE_SIZE)
170 max_semispace_size_ = reserved_semispace_size_ = V8_MAX_SEMISPACE_SIZE; 176 max_semispace_size_ = reserved_semispace_size_ = V8_MAX_SEMISPACE_SIZE;
171 #endif 177 #endif
Hannes Payer (out of office) 2013/09/19 14:50:57 Can you bring back this newline?
172
173 intptr_t max_virtual = OS::MaxVirtualMemory(); 178 intptr_t max_virtual = OS::MaxVirtualMemory();
174 179
175 if (max_virtual > 0) { 180 if (max_virtual > 0) {
176 if (code_range_size_ > 0) { 181 if (code_range_size_ > 0) {
177 // Reserve no more than 1/8 of the memory for the code range. 182 // Reserve no more than 1/8 of the memory for the code range.
178 code_range_size_ = Min(code_range_size_, max_virtual >> 3); 183 code_range_size_ = Min(code_range_size_, max_virtual >> 3);
179 } 184 }
180 } 185 }
181 186
182 memset(roots_, 0, sizeof(roots_[0]) * kRootListLength); 187 memset(roots_, 0, sizeof(roots_[0]) * kRootListLength);
(...skipping 6483 matching lines...) Expand 10 before | Expand all | Expand 10 after
6666 6671
6667 6672
6668 // TODO(1236194): Since the heap size is configurable on the command line 6673 // TODO(1236194): Since the heap size is configurable on the command line
6669 // and through the API, we should gracefully handle the case that the heap 6674 // and through the API, we should gracefully handle the case that the heap
6670 // size is not big enough to fit all the initial objects. 6675 // size is not big enough to fit all the initial objects.
6671 bool Heap::ConfigureHeap(int max_semispace_size, 6676 bool Heap::ConfigureHeap(int max_semispace_size,
6672 intptr_t max_old_gen_size, 6677 intptr_t max_old_gen_size,
6673 intptr_t max_executable_size) { 6678 intptr_t max_executable_size) {
6674 if (HasBeenSetUp()) return false; 6679 if (HasBeenSetUp()) return false;
6675 6680
6681 if (isolate_->is_memory_constrained() && !limits_changed_from_defaults_) {
6682 // Update the default values if this is a memory constrained device.
6683 // TODO(rmcilroy): Ideally these should be set correctly in the constructor
6684 // based on this flag, but the flag isn't setup correctly at that point.
6685 max_semispace_size_ = DEFAULT_SEMISPACE_MAX_SIZE / 4;
6686 reserved_semispace_size_ = DEFAULT_SEMISPACE_MAX_SIZE / 4;
6687 max_old_generation_size_ = DEFAULT_OLD_GENERATION_MAX_SIZE / 2;
6688 max_executable_size_ = DEFAULT_EXECUTABLE_MAX_SIZE / 2;
Hannes Payer (out of office) 2013/09/19 14:50:57 The embedder would just set the right values, no m
rmcilroy 2013/09/19 15:01:34 The embedder doesn't need to set these values (if
Hannes Payer (out of office) 2013/09/19 16:25:28 But SetResourceConstraints could just set it to th
rmcilroy 2013/09/19 19:46:11 Do you mean the embedder could just pass the corre
6689 }
6690
6676 if (FLAG_stress_compaction) { 6691 if (FLAG_stress_compaction) {
6677 // This will cause more frequent GCs when stressing. 6692 // This will cause more frequent GCs when stressing.
6678 max_semispace_size_ = Page::kPageSize; 6693 max_semispace_size_ = Page::kPageSize;
6679 } 6694 }
6680 6695
6681 if (max_semispace_size > 0) { 6696 if (max_semispace_size > 0) {
6682 if (max_semispace_size < Page::kPageSize) { 6697 if (max_semispace_size < Page::kPageSize) {
6683 max_semispace_size = Page::kPageSize; 6698 max_semispace_size = Page::kPageSize;
6684 if (FLAG_trace_gc) { 6699 if (FLAG_trace_gc) {
6685 PrintPID("Max semispace size cannot be less than %dkbytes\n", 6700 PrintPID("Max semispace size cannot be less than %dkbytes\n",
(...skipping 20 matching lines...) Expand all
6706 // If we are not using snapshots we reserve space for the actual 6721 // If we are not using snapshots we reserve space for the actual
6707 // max semispace size. 6722 // max semispace size.
6708 reserved_semispace_size_ = max_semispace_size_; 6723 reserved_semispace_size_ = max_semispace_size_;
6709 } 6724 }
6710 6725
6711 if (max_old_gen_size > 0) max_old_generation_size_ = max_old_gen_size; 6726 if (max_old_gen_size > 0) max_old_generation_size_ = max_old_gen_size;
6712 if (max_executable_size > 0) { 6727 if (max_executable_size > 0) {
6713 max_executable_size_ = RoundUp(max_executable_size, Page::kPageSize); 6728 max_executable_size_ = RoundUp(max_executable_size, Page::kPageSize);
6714 } 6729 }
6715 6730
6731 if (max_semispace_size > 0 || max_old_gen_size > 0 ||
6732 max_executable_size_ > 0) {
6733 // Did we change anything from their defaults.
6734 limits_changed_from_defaults_ = true;
6735 }
6736
6716 // The max executable size must be less than or equal to the max old 6737 // The max executable size must be less than or equal to the max old
6717 // generation size. 6738 // generation size.
6718 if (max_executable_size_ > max_old_generation_size_) { 6739 if (max_executable_size_ > max_old_generation_size_) {
6719 max_executable_size_ = max_old_generation_size_; 6740 max_executable_size_ = max_old_generation_size_;
6720 } 6741 }
6721 6742
6722 // The new space size must be a power of two to support single-bit testing 6743 // The new space size must be a power of two to support single-bit testing
6723 // for containment. 6744 // for containment.
6724 max_semispace_size_ = RoundUpToPowerOf2(max_semispace_size_); 6745 max_semispace_size_ = RoundUpToPowerOf2(max_semispace_size_);
6725 reserved_semispace_size_ = RoundUpToPowerOf2(reserved_semispace_size_); 6746 reserved_semispace_size_ = RoundUpToPowerOf2(reserved_semispace_size_);
(...skipping 1359 matching lines...) Expand 10 before | Expand all | Expand 10 after
8085 if (FLAG_concurrent_recompilation) { 8106 if (FLAG_concurrent_recompilation) {
8086 heap_->relocation_mutex_->Lock(); 8107 heap_->relocation_mutex_->Lock();
8087 #ifdef DEBUG 8108 #ifdef DEBUG
8088 heap_->relocation_mutex_locked_by_optimizer_thread_ = 8109 heap_->relocation_mutex_locked_by_optimizer_thread_ =
8089 heap_->isolate()->optimizing_compiler_thread()->IsOptimizerThread(); 8110 heap_->isolate()->optimizing_compiler_thread()->IsOptimizerThread();
8090 #endif // DEBUG 8111 #endif // DEBUG
8091 } 8112 }
8092 } 8113 }
8093 8114
8094 } } // namespace v8::internal 8115 } } // namespace v8::internal
OLDNEW
« src/heap.h ('K') | « src/heap.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698