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

Side by Side Diff: src/heap/heap.cc

Issue 1284853003: Respect old generation limit in large object space allocations. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 4 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
« no previous file with comments | « no previous file | src/heap/spaces.h » ('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 #include "src/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/api.h" 8 #include "src/api.h"
9 #include "src/base/bits.h" 9 #include "src/base/bits.h"
10 #include "src/base/once.h" 10 #include "src/base/once.h"
(...skipping 1051 matching lines...) Expand 10 before | Expand all | Expand 10 after
1062 static const int kThreshold = 20; 1062 static const int kThreshold = 20;
1063 while (gc_performed && counter++ < kThreshold) { 1063 while (gc_performed && counter++ < kThreshold) {
1064 gc_performed = false; 1064 gc_performed = false;
1065 for (int space = NEW_SPACE; space < Serializer::kNumberOfSpaces; space++) { 1065 for (int space = NEW_SPACE; space < Serializer::kNumberOfSpaces; space++) {
1066 Reservation* reservation = &reservations[space]; 1066 Reservation* reservation = &reservations[space];
1067 DCHECK_LE(1, reservation->length()); 1067 DCHECK_LE(1, reservation->length());
1068 if (reservation->at(0).size == 0) continue; 1068 if (reservation->at(0).size == 0) continue;
1069 bool perform_gc = false; 1069 bool perform_gc = false;
1070 if (space == LO_SPACE) { 1070 if (space == LO_SPACE) {
1071 DCHECK_EQ(1, reservation->length()); 1071 DCHECK_EQ(1, reservation->length());
1072 perform_gc = !lo_space()->CanAllocateSize(reservation->at(0).size); 1072 perform_gc = !CanExpandOldGeneration(reservation->at(0).size);
1073 } else { 1073 } else {
1074 for (auto& chunk : *reservation) { 1074 for (auto& chunk : *reservation) {
1075 AllocationResult allocation; 1075 AllocationResult allocation;
1076 int size = chunk.size; 1076 int size = chunk.size;
1077 DCHECK_LE(size, MemoryAllocator::PageAreaSize( 1077 DCHECK_LE(size, MemoryAllocator::PageAreaSize(
1078 static_cast<AllocationSpace>(space))); 1078 static_cast<AllocationSpace>(space)));
1079 if (space == NEW_SPACE) { 1079 if (space == NEW_SPACE) {
1080 allocation = new_space()->AllocateRawUnaligned(size); 1080 allocation = new_space()->AllocateRawUnaligned(size);
1081 } else { 1081 } else {
1082 allocation = paged_space(space)->AllocateRawUnaligned(size); 1082 allocation = paged_space(space)->AllocateRawUnaligned(size);
(...skipping 4673 matching lines...) Expand 10 before | Expand all | Expand 10 after
5756 if (!isolate_->memory_allocator()->SetUp(MaxReserved(), MaxExecutableSize())) 5756 if (!isolate_->memory_allocator()->SetUp(MaxReserved(), MaxExecutableSize()))
5757 return false; 5757 return false;
5758 5758
5759 // Set up new space. 5759 // Set up new space.
5760 if (!new_space_.SetUp(reserved_semispace_size_, max_semi_space_size_)) { 5760 if (!new_space_.SetUp(reserved_semispace_size_, max_semi_space_size_)) {
5761 return false; 5761 return false;
5762 } 5762 }
5763 new_space_top_after_last_gc_ = new_space()->top(); 5763 new_space_top_after_last_gc_ = new_space()->top();
5764 5764
5765 // Initialize old space. 5765 // Initialize old space.
5766 old_space_ = 5766 old_space_ = new OldSpace(this, OLD_SPACE, NOT_EXECUTABLE);
5767 new OldSpace(this, max_old_generation_size_, OLD_SPACE, NOT_EXECUTABLE);
5768 if (old_space_ == NULL) return false; 5767 if (old_space_ == NULL) return false;
5769 if (!old_space_->SetUp()) return false; 5768 if (!old_space_->SetUp()) return false;
5770 5769
5771 if (!isolate_->code_range()->SetUp(code_range_size_)) return false; 5770 if (!isolate_->code_range()->SetUp(code_range_size_)) return false;
5772 5771
5773 // Initialize the code space, set its maximum capacity to the old 5772 // Initialize the code space, set its maximum capacity to the old
5774 // generation size. It needs executable memory. 5773 // generation size. It needs executable memory.
5775 code_space_ = 5774 code_space_ = new OldSpace(this, CODE_SPACE, EXECUTABLE);
5776 new OldSpace(this, max_old_generation_size_, CODE_SPACE, EXECUTABLE);
5777 if (code_space_ == NULL) return false; 5775 if (code_space_ == NULL) return false;
5778 if (!code_space_->SetUp()) return false; 5776 if (!code_space_->SetUp()) return false;
5779 5777
5780 // Initialize map space. 5778 // Initialize map space.
5781 map_space_ = new MapSpace(this, max_old_generation_size_, MAP_SPACE); 5779 map_space_ = new MapSpace(this, MAP_SPACE);
5782 if (map_space_ == NULL) return false; 5780 if (map_space_ == NULL) return false;
5783 if (!map_space_->SetUp()) return false; 5781 if (!map_space_->SetUp()) return false;
5784 5782
5785 // The large object code space may contain code or data. We set the memory 5783 // The large object code space may contain code or data. We set the memory
5786 // to be non-executable here for safety, but this means we need to enable it 5784 // to be non-executable here for safety, but this means we need to enable it
5787 // explicitly when allocating large code objects. 5785 // explicitly when allocating large code objects.
5788 lo_space_ = new LargeObjectSpace(this, max_old_generation_size_, LO_SPACE); 5786 lo_space_ = new LargeObjectSpace(this, LO_SPACE);
5789 if (lo_space_ == NULL) return false; 5787 if (lo_space_ == NULL) return false;
5790 if (!lo_space_->SetUp()) return false; 5788 if (!lo_space_->SetUp()) return false;
5791 5789
5792 // Set up the seed that is used to randomize the string hash function. 5790 // Set up the seed that is used to randomize the string hash function.
5793 DCHECK(hash_seed() == 0); 5791 DCHECK(hash_seed() == 0);
5794 if (FLAG_randomize_hashes) { 5792 if (FLAG_randomize_hashes) {
5795 if (FLAG_hash_seed == 0) { 5793 if (FLAG_hash_seed == 0) {
5796 int rnd = isolate()->random_number_generator()->NextInt(); 5794 int rnd = isolate()->random_number_generator()->NextInt();
5797 set_hash_seed(Smi::FromInt(rnd & Name::kHashBitMask)); 5795 set_hash_seed(Smi::FromInt(rnd & Name::kHashBitMask));
5798 } else { 5796 } else {
(...skipping 1103 matching lines...) Expand 10 before | Expand all | Expand 10 after
6902 *object_type = "CODE_TYPE"; \ 6900 *object_type = "CODE_TYPE"; \
6903 *object_sub_type = "CODE_AGE/" #name; \ 6901 *object_sub_type = "CODE_AGE/" #name; \
6904 return true; 6902 return true;
6905 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME) 6903 CODE_AGE_LIST_COMPLETE(COMPARE_AND_RETURN_NAME)
6906 #undef COMPARE_AND_RETURN_NAME 6904 #undef COMPARE_AND_RETURN_NAME
6907 } 6905 }
6908 return false; 6906 return false;
6909 } 6907 }
6910 } // namespace internal 6908 } // namespace internal
6911 } // namespace v8 6909 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/heap/spaces.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698