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

Unified Diff: src/heap/spaces.h

Issue 1379833002: [heap] Properly account for wasted bytes. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Move code comments to declaration site of fields Created 5 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/heap/mark-compact.cc ('k') | src/heap/spaces.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/heap/spaces.h
diff --git a/src/heap/spaces.h b/src/heap/spaces.h
index 222380856bfe7286b50a63eee2e37544a1f7e512..4055d443ce7e9f81191bc1db505039338d9fc21a 100644
--- a/src/heap/spaces.h
+++ b/src/heap/spaces.h
@@ -1420,19 +1420,11 @@ class AllocationInfo {
// An abstraction of the accounting statistics of a page-structured space.
-// The 'capacity' of a space is the number of object-area bytes (i.e., not
-// including page bookkeeping structures) currently in the space. The 'size'
-// of a space is the number of allocated bytes, the 'waste' in the space is
-// the number of bytes that are not allocated and not available to
-// allocation without reorganizing the space via a GC (e.g. small blocks due
-// to internal fragmentation, top of page areas in map space), and the bytes
-// 'available' is the number of unallocated bytes that are not waste. The
-// capacity is the sum of size, waste, and available.
//
// The stats are only set by functions that ensure they stay balanced. These
-// functions increase or decrease one of the non-capacity stats in
-// conjunction with capacity, or else they always balance increases and
-// decreases to the non-capacity stats.
+// functions increase or decrease one of the non-capacity stats in conjunction
+// with capacity, or else they always balance increases and decreases to the
+// non-capacity stats.
class AllocationStats BASE_EMBEDDED {
public:
AllocationStats() { Clear(); }
@@ -1442,26 +1434,20 @@ class AllocationStats BASE_EMBEDDED {
capacity_ = 0;
max_capacity_ = 0;
size_ = 0;
- waste_ = 0;
}
- void ClearSizeWaste() {
- size_ = capacity_;
- waste_ = 0;
- }
+ void ClearSize() { size_ = capacity_; }
- // Reset the allocation statistics (i.e., available = capacity with no
- // wasted or allocated bytes).
+ // Reset the allocation statistics (i.e., available = capacity with no wasted
+ // or allocated bytes).
void Reset() {
size_ = 0;
- waste_ = 0;
}
// Accessors for the allocation statistics.
intptr_t Capacity() { return capacity_; }
intptr_t MaxCapacity() { return max_capacity_; }
intptr_t Size() { return size_; }
- intptr_t Waste() { return waste_; }
// Grow the space by adding available bytes. They are initially marked as
// being in use (part of the size), but will normally be immediately freed,
@@ -1496,17 +1482,10 @@ class AllocationStats BASE_EMBEDDED {
DCHECK(size_ >= 0);
}
- // Waste free bytes (available -> waste).
- void WasteBytes(int size_in_bytes) {
- DCHECK(size_in_bytes >= 0);
- waste_ += size_in_bytes;
- }
-
// Merge {other} into {this}.
void Merge(const AllocationStats& other) {
capacity_ += other.capacity_;
size_ += other.size_;
- waste_ += other.waste_;
if (other.max_capacity_ > max_capacity_) {
max_capacity_ = other.max_capacity_;
}
@@ -1520,10 +1499,15 @@ class AllocationStats BASE_EMBEDDED {
void IncreaseCapacity(intptr_t size_in_bytes) { capacity_ += size_in_bytes; }
private:
+ // |capacity_|: The number of object-area bytes (i.e., not including page
+ // bookkeeping structures) currently in the space.
intptr_t capacity_;
+
+ // |max_capacity_|: The maximum capacity ever observed.
intptr_t max_capacity_;
+
+ // |size_|: The number of allocated bytes.
intptr_t size_;
- intptr_t waste_;
};
@@ -1566,8 +1550,6 @@ class FreeListCategory {
int available() const { return available_; }
void set_available(int available) { available_ = available; }
- base::Mutex* mutex() { return &mutex_; }
-
bool IsEmpty() { return top() == 0; }
#ifdef DEBUG
@@ -1581,8 +1563,6 @@ class FreeListCategory {
// top_ points to the top FreeSpace* in the free list category.
base::AtomicWord top_;
FreeSpace* end_;
- base::Mutex mutex_;
-
// Total available bytes in all blocks of this free list category.
int available_;
@@ -1617,11 +1597,13 @@ class FreeList {
public:
explicit FreeList(PagedSpace* owner);
- intptr_t Concatenate(FreeList* free_list);
+ intptr_t Concatenate(FreeList* other);
// Clear the free list.
void Reset();
+ void ResetStats() { wasted_bytes_ = 0; }
+
// Return the number of bytes available on the free list.
intptr_t available() {
return small_list_.available() + medium_list_.available() +
@@ -1652,9 +1634,8 @@ class FreeList {
}
// Allocate a block of size 'size_in_bytes' from the free list. The block
- // is unitialized. A failure is returned if no block is available. The
- // number of bytes lost to fragmentation is returned in the output parameter
- // 'wasted_bytes'. The size should be a non-zero multiple of the word size.
+ // is unitialized. A failure is returned if no block is available.
+ // The size should be a non-zero multiple of the word size.
MUST_USE_RESULT HeapObject* Allocate(int size_in_bytes);
bool IsEmpty() {
@@ -1680,6 +1661,8 @@ class FreeList {
FreeListCategory* huge_list() { return &huge_list_; }
PagedSpace* owner() { return owner_; }
+ intptr_t wasted_bytes() { return wasted_bytes_; }
+ base::Mutex* mutex() { return &mutex_; }
private:
// The size range of blocks, in bytes.
@@ -1698,6 +1681,8 @@ class FreeList {
PagedSpace* owner_;
Heap* heap_;
+ base::Mutex mutex_;
+ intptr_t wasted_bytes_;
FreeListCategory small_list_;
FreeListCategory medium_list_;
FreeListCategory large_list_;
@@ -1808,7 +1793,8 @@ class PagedSpace : public Space {
// discovered during the sweeping they are subtracted from the size and added
// to the available and wasted totals.
void ClearStats() {
- accounting_stats_.ClearSizeWaste();
+ accounting_stats_.ClearSize();
+ free_list_.ResetStats();
ResetFreeListStatistics();
}
@@ -1834,9 +1820,8 @@ class PagedSpace : public Space {
intptr_t SizeOfObjects() override;
// Wasted bytes in this space. These are just the bytes that were thrown away
- // due to being too small to use for allocation. They do not include the
- // free bytes that were not found at all due to lazy sweeping.
- virtual intptr_t Waste() { return accounting_stats_.Waste(); }
+ // due to being too small to use for allocation.
+ virtual intptr_t Waste() { return free_list_.wasted_bytes(); }
// Returns the allocation pointer in this space.
Address top() { return allocation_info_.top(); }
@@ -1875,7 +1860,6 @@ class PagedSpace : public Space {
int Free(Address start, int size_in_bytes) {
int wasted = free_list_.Free(start, size_in_bytes);
accounting_stats_.DeallocateBytes(size_in_bytes);
- accounting_stats_.WasteBytes(wasted);
return size_in_bytes - wasted;
}
« no previous file with comments | « src/heap/mark-compact.cc ('k') | src/heap/spaces.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698