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

Unified Diff: src/snapshot/snapshot-common.cc

Issue 2289493002: Revert of "[heap] Switch to 500k pages" (Closed)
Patch Set: Created 4 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/snapshot/snapshot.h ('k') | test/cctest/heap/heap-utils.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/snapshot/snapshot-common.cc
diff --git a/src/snapshot/snapshot-common.cc b/src/snapshot/snapshot-common.cc
index 959ac56fa98aa6a182062c76126f53e24c6bb193..fed45d16b6c3528d241284765bbeb8631c489617 100644
--- a/src/snapshot/snapshot-common.cc
+++ b/src/snapshot/snapshot-common.cc
@@ -31,6 +31,19 @@
return index < num_contexts;
}
+
+uint32_t Snapshot::SizeOfFirstPage(Isolate* isolate, AllocationSpace space) {
+ DCHECK(space >= FIRST_PAGED_SPACE && space <= LAST_PAGED_SPACE);
+ if (!isolate->snapshot_available()) {
+ return static_cast<uint32_t>(MemoryAllocator::PageAreaSize(space));
+ }
+ uint32_t size;
+ int offset = kFirstPageSizesOffset + (space - FIRST_PAGED_SPACE) * kInt32Size;
+ memcpy(&size, isolate->snapshot_blob()->data + offset, kInt32Size);
+ return size;
+}
+
+
bool Snapshot::Initialize(Isolate* isolate) {
if (!isolate->snapshot_available()) return false;
base::ElapsedTimer timer;
@@ -76,8 +89,25 @@
return Handle<Context>::cast(result);
}
-void ProfileDeserialization(const SnapshotData* startup_snapshot,
- const List<SnapshotData*>* context_snapshots) {
+void UpdateMaxRequirementPerPage(
+ uint32_t* requirements,
+ Vector<const SerializedData::Reservation> reservations) {
+ int space = 0;
+ uint32_t current_requirement = 0;
+ for (const auto& reservation : reservations) {
+ current_requirement += reservation.chunk_size();
+ if (reservation.is_last()) {
+ requirements[space] = std::max(requirements[space], current_requirement);
+ current_requirement = 0;
+ space++;
+ }
+ }
+ DCHECK_EQ(i::Serializer::kNumberOfSpaces, space);
+}
+
+void CalculateFirstPageSizes(const SnapshotData* startup_snapshot,
+ const List<SnapshotData*>* context_snapshots,
+ uint32_t* sizes_out) {
if (FLAG_profile_deserialization) {
int startup_total = 0;
PrintF("Deserialization will reserve:\n");
@@ -91,6 +121,36 @@
context_total += reservation.chunk_size();
}
PrintF("%10d bytes per context #%d\n", context_total, i);
+ }
+ }
+
+ uint32_t startup_requirements[i::Serializer::kNumberOfSpaces];
+ uint32_t context_requirements[i::Serializer::kNumberOfSpaces];
+ for (int space = 0; space < i::Serializer::kNumberOfSpaces; space++) {
+ startup_requirements[space] = 0;
+ context_requirements[space] = 0;
+ }
+
+ UpdateMaxRequirementPerPage(startup_requirements,
+ startup_snapshot->Reservations());
+ for (const auto& context_snapshot : *context_snapshots) {
+ UpdateMaxRequirementPerPage(context_requirements,
+ context_snapshot->Reservations());
+ }
+
+ for (int space = 0; space < i::Serializer::kNumberOfSpaces; space++) {
+ // If the space requirement for a page is less than a page size, we consider
+ // limiting the size of the first page in order to save memory on startup.
+ uint32_t required = startup_requirements[space] +
+ 2 * context_requirements[space] +
+ Page::kObjectStartOffset;
+ // Add a small allowance to the code space for small scripts.
+ if (space == CODE_SPACE) required += 32 * KB;
+
+ if (space >= FIRST_PAGED_SPACE && space <= LAST_PAGED_SPACE) {
+ uint32_t max_size =
+ MemoryAllocator::PageAreaSize(static_cast<AllocationSpace>(space));
+ sizes_out[space - FIRST_PAGED_SPACE] = std::min(required, max_size);
}
}
}
@@ -106,9 +166,13 @@
total_length += context_snapshot->RawData().length();
}
- ProfileDeserialization(startup_snapshot, context_snapshots);
+ uint32_t first_page_sizes[kNumPagedSpaces];
+ CalculateFirstPageSizes(startup_snapshot, context_snapshots,
+ first_page_sizes);
char* data = new char[total_length];
+ memcpy(data + kFirstPageSizesOffset, first_page_sizes,
+ kNumPagedSpaces * kInt32Size);
memcpy(data + kNumberOfContextsOffset, &num_contexts, kInt32Size);
int payload_offset = StartupSnapshotOffset(num_contexts);
int payload_length = startup_snapshot->RawData().length();
« no previous file with comments | « src/snapshot/snapshot.h ('k') | test/cctest/heap/heap-utils.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698