Skip to content

Commit

Permalink
Implement heap profiler memory usage reporting.
Browse files Browse the repository at this point in the history
  • Loading branch information
alexeif@chromium.org committed Jun 13, 2012
1 parent 4011b30 commit 0c2570d
Show file tree
Hide file tree
Showing 6 changed files with 63 additions and 1 deletion.
3 changes: 3 additions & 0 deletions include/v8-profiler.h
Expand Up @@ -482,6 +482,9 @@ class V8EXPORT HeapProfiler {

/** Returns the number of currently existing persistent handles. */
static int GetPersistentHandleCount();

/** Returns memory used for profiler internal data and snapshots. */
static size_t GetMemorySizeUsedByProfiler();
};


Expand Down
5 changes: 5 additions & 0 deletions src/api.cc
Expand Up @@ -6270,6 +6270,11 @@ int HeapProfiler::GetPersistentHandleCount() {
}


size_t HeapProfiler::GetMemorySizeUsedByProfiler() {
return i::HeapProfiler::GetMemorySizeUsedByProfiler();
}


v8::Testing::StressType internal::Testing::stress_type_ =
v8::Testing::kStressTypeOpt;

Expand Down
8 changes: 8 additions & 0 deletions src/heap-profiler.cc
Expand Up @@ -168,6 +168,14 @@ void HeapProfiler::StopHeapObjectsTrackingImpl() {
}


size_t HeapProfiler::GetMemorySizeUsedByProfiler() {
HeapProfiler* profiler = Isolate::Current()->heap_profiler();
ASSERT(profiler != NULL);
size_t size = profiler->snapshots_->GetUsedMemorySize();
return size;
}


int HeapProfiler::GetSnapshotsCount() {
HeapProfiler* profiler = Isolate::Current()->heap_profiler();
ASSERT(profiler != NULL);
Expand Down
2 changes: 2 additions & 0 deletions src/heap-profiler.h
Expand Up @@ -49,6 +49,8 @@ class HeapProfiler {
static void SetUp();
static void TearDown();

static size_t GetMemorySizeUsedByProfiler();

static HeapSnapshot* TakeSnapshot(const char* name,
int type,
v8::ActivityControl* control);
Expand Down
43 changes: 42 additions & 1 deletion src/profile-generator.cc
Expand Up @@ -169,6 +169,15 @@ const char* StringsStorage::GetName(int index) {
}


size_t StringsStorage::GetUsedMemorySize() const {
size_t size = sizeof(*this);
size += sizeof(HashMap::Entry) * names_.capacity();
for (HashMap::Entry* p = names_.Start(); p != NULL; p = names_.Next(p)) {
size += strlen(reinterpret_cast<const char*>(p->value)) + 1;
}
return size;
}

const char* const CodeEntry::kEmptyNamePrefix = "";


Expand Down Expand Up @@ -1083,12 +1092,16 @@ template <size_t ptr_size> struct SnapshotSizeConstants;
template <> struct SnapshotSizeConstants<4> {
static const int kExpectedHeapGraphEdgeSize = 12;
static const int kExpectedHeapEntrySize = 24;
static const int kExpectedHeapSnapshotsCollectionSize = 96;
static const int kExpectedHeapSnapshotSize = 136;
static const size_t kMaxSerializableSnapshotRawSize = 256 * MB;
};

template <> struct SnapshotSizeConstants<8> {
static const int kExpectedHeapGraphEdgeSize = 24;
static const int kExpectedHeapEntrySize = 32;
static const int kExpectedHeapSnapshotsCollectionSize = 144;
static const int kExpectedHeapSnapshotSize = 168;
static const uint64_t kMaxSerializableSnapshotRawSize =
static_cast<uint64_t>(6000) * MB;
};
Expand Down Expand Up @@ -1243,12 +1256,15 @@ void HeapSnapshot::Print(int max_depth) {

template<typename T, class P>
static size_t GetMemoryUsedByList(const List<T, P>& list) {
return list.capacity() * sizeof(T);
return list.length() * sizeof(T) + sizeof(list);
}


size_t HeapSnapshot::RawSnapshotSize() const {
STATIC_CHECK(sizeof(*this) ==
SnapshotSizeConstants<kPointerSize>::kExpectedHeapSnapshotSize);
return
sizeof(*this) +
GetMemoryUsedByList(entries_) +
GetMemoryUsedByList(edges_) +
GetMemoryUsedByList(children_) +
Expand Down Expand Up @@ -1446,6 +1462,15 @@ SnapshotObjectId HeapObjectsMap::GenerateId(v8::RetainedObjectInfo* info) {
}


size_t HeapObjectsMap::GetUsedMemorySize() const {
return
sizeof(*this) +
sizeof(HashMap::Entry) * entries_map_.capacity() +
GetMemoryUsedByList(entries_) +
GetMemoryUsedByList(time_intervals_);
}


HeapSnapshotsCollection::HeapSnapshotsCollection()
: is_tracking_objects_(false),
snapshots_uids_(HeapSnapshotsMatch),
Expand Down Expand Up @@ -1525,6 +1550,22 @@ Handle<HeapObject> HeapSnapshotsCollection::FindHeapObjectById(
}


size_t HeapSnapshotsCollection::GetUsedMemorySize() const {
STATIC_CHECK(
sizeof(*this) == SnapshotSizeConstants<kPointerSize>::
kExpectedHeapSnapshotsCollectionSize);
size_t size = sizeof(*this);
size += names_.GetUsedMemorySize();
size += ids_.GetUsedMemorySize();
size += sizeof(HashMap::Entry) * snapshots_uids_.capacity();
size += GetMemoryUsedByList(snapshots_);
for (int i = 0; i < snapshots_.length(); ++i) {
size += snapshots_[i]->RawSnapshotSize();
}
return size;
}


HeapEntriesMap::HeapEntriesMap()
: entries_(HeapThingsMatch) {
}
Expand Down
3 changes: 3 additions & 0 deletions src/profile-generator.h
Expand Up @@ -72,6 +72,7 @@ class StringsStorage {
const char* GetName(int index);
inline const char* GetFunctionName(String* name);
inline const char* GetFunctionName(const char* name);
size_t GetUsedMemorySize() const;

private:
static const int kMaxNameSize = 1024;
Expand Down Expand Up @@ -650,6 +651,7 @@ class HeapObjectsMap {

void StopHeapObjectsTracking();
SnapshotObjectId PushHeapObjectsStats(OutputStream* stream);
size_t GetUsedMemorySize() const;

static SnapshotObjectId GenerateId(v8::RetainedObjectInfo* info);
static inline SnapshotObjectId GetNthGcSubrootId(int delta);
Expand Down Expand Up @@ -734,6 +736,7 @@ class HeapSnapshotsCollection {
SnapshotObjectId last_assigned_id() const {
return ids_.last_assigned_id();
}
size_t GetUsedMemorySize() const;

private:
INLINE(static bool HeapSnapshotsMatch(void* key1, void* key2)) {
Expand Down

0 comments on commit 0c2570d

Please sign in to comment.