| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 #ifndef V8_HEAP_SNAPSHOT_GENERATOR_H_ | 5 #ifndef V8_HEAP_SNAPSHOT_GENERATOR_H_ |
| 6 #define V8_HEAP_SNAPSHOT_GENERATOR_H_ | 6 #define V8_HEAP_SNAPSHOT_GENERATOR_H_ |
| 7 | 7 |
| 8 #include "src/profile-generator-inl.h" | 8 #include "src/profile-generator-inl.h" |
| 9 | 9 |
| 10 namespace v8 { | 10 namespace v8 { |
| (...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 Type type, | 93 Type type, |
| 94 const char* name, | 94 const char* name, |
| 95 SnapshotObjectId id, | 95 SnapshotObjectId id, |
| 96 size_t self_size, | 96 size_t self_size, |
| 97 unsigned trace_node_id); | 97 unsigned trace_node_id); |
| 98 | 98 |
| 99 HeapSnapshot* snapshot() { return snapshot_; } | 99 HeapSnapshot* snapshot() { return snapshot_; } |
| 100 Type type() { return static_cast<Type>(type_); } | 100 Type type() { return static_cast<Type>(type_); } |
| 101 const char* name() { return name_; } | 101 const char* name() { return name_; } |
| 102 void set_name(const char* name) { name_ = name; } | 102 void set_name(const char* name) { name_ = name; } |
| 103 inline SnapshotObjectId id() { return id_; } | 103 SnapshotObjectId id() { return id_; } |
| 104 size_t self_size() { return self_size_; } | 104 size_t self_size() { return self_size_; } |
| 105 unsigned trace_node_id() const { return trace_node_id_; } | 105 unsigned trace_node_id() const { return trace_node_id_; } |
| 106 INLINE(int index() const); | 106 INLINE(int index() const); |
| 107 int children_count() const { return children_count_; } | 107 int children_count() const { return children_count_; } |
| 108 INLINE(int set_children_index(int index)); | 108 INLINE(int set_children_index(int index)); |
| 109 void add_child(HeapGraphEdge* edge) { | 109 void add_child(HeapGraphEdge* edge) { |
| 110 children_arr()[children_count_++] = edge; | 110 children_arr()[children_count_++] = edge; |
| 111 } | 111 } |
| 112 Vector<HeapGraphEdge*> children() { | 112 Vector<HeapGraphEdge*> children() { |
| 113 return Vector<HeapGraphEdge*>(children_arr(), children_count_); } | 113 return Vector<HeapGraphEdge*>(children_arr(), children_count_); } |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 147 const char* title, | 147 const char* title, |
| 148 unsigned uid); | 148 unsigned uid); |
| 149 void Delete(); | 149 void Delete(); |
| 150 | 150 |
| 151 HeapProfiler* profiler() { return profiler_; } | 151 HeapProfiler* profiler() { return profiler_; } |
| 152 const char* title() { return title_; } | 152 const char* title() { return title_; } |
| 153 unsigned uid() { return uid_; } | 153 unsigned uid() { return uid_; } |
| 154 size_t RawSnapshotSize() const; | 154 size_t RawSnapshotSize() const; |
| 155 HeapEntry* root() { return &entries_[root_index_]; } | 155 HeapEntry* root() { return &entries_[root_index_]; } |
| 156 HeapEntry* gc_roots() { return &entries_[gc_roots_index_]; } | 156 HeapEntry* gc_roots() { return &entries_[gc_roots_index_]; } |
| 157 HeapEntry* natives_root() { return &entries_[natives_root_index_]; } | |
| 158 HeapEntry* gc_subroot(int index) { | 157 HeapEntry* gc_subroot(int index) { |
| 159 return &entries_[gc_subroot_indexes_[index]]; | 158 return &entries_[gc_subroot_indexes_[index]]; |
| 160 } | 159 } |
| 161 List<HeapEntry>& entries() { return entries_; } | 160 List<HeapEntry>& entries() { return entries_; } |
| 162 List<HeapGraphEdge>& edges() { return edges_; } | 161 List<HeapGraphEdge>& edges() { return edges_; } |
| 163 List<HeapGraphEdge*>& children() { return children_; } | 162 List<HeapGraphEdge*>& children() { return children_; } |
| 164 void RememberLastJSObjectId(); | 163 void RememberLastJSObjectId(); |
| 165 SnapshotObjectId max_snapshot_js_object_id() const { | 164 SnapshotObjectId max_snapshot_js_object_id() const { |
| 166 return max_snapshot_js_object_id_; | 165 return max_snapshot_js_object_id_; |
| 167 } | 166 } |
| 168 | 167 |
| 169 HeapEntry* AddEntry(HeapEntry::Type type, | 168 HeapEntry* AddEntry(HeapEntry::Type type, |
| 170 const char* name, | 169 const char* name, |
| 171 SnapshotObjectId id, | 170 SnapshotObjectId id, |
| 172 size_t size, | 171 size_t size, |
| 173 unsigned trace_node_id); | 172 unsigned trace_node_id); |
| 174 HeapEntry* AddRootEntry(); | 173 void AddSyntheticRootEntries(); |
| 175 HeapEntry* AddGcRootsEntry(); | |
| 176 HeapEntry* AddGcSubrootEntry(int tag); | |
| 177 HeapEntry* AddNativesRootEntry(); | |
| 178 HeapEntry* GetEntryById(SnapshotObjectId id); | 174 HeapEntry* GetEntryById(SnapshotObjectId id); |
| 179 List<HeapEntry*>* GetSortedEntriesList(); | 175 List<HeapEntry*>* GetSortedEntriesList(); |
| 180 void FillChildren(); | 176 void FillChildren(); |
| 181 | 177 |
| 182 void Print(int max_depth); | 178 void Print(int max_depth); |
| 183 void PrintEntriesSize(); | 179 void PrintEntriesSize(); |
| 184 | 180 |
| 185 private: | 181 private: |
| 182 HeapEntry* AddRootEntry(); |
| 183 HeapEntry* AddGcRootsEntry(); |
| 184 HeapEntry* AddGcSubrootEntry(int tag, SnapshotObjectId id); |
| 185 |
| 186 HeapProfiler* profiler_; | 186 HeapProfiler* profiler_; |
| 187 const char* title_; | 187 const char* title_; |
| 188 unsigned uid_; | 188 unsigned uid_; |
| 189 int root_index_; | 189 int root_index_; |
| 190 int gc_roots_index_; | 190 int gc_roots_index_; |
| 191 int natives_root_index_; | |
| 192 int gc_subroot_indexes_[VisitorSynchronization::kNumberOfSyncTags]; | 191 int gc_subroot_indexes_[VisitorSynchronization::kNumberOfSyncTags]; |
| 193 List<HeapEntry> entries_; | 192 List<HeapEntry> entries_; |
| 194 List<HeapGraphEdge> edges_; | 193 List<HeapGraphEdge> edges_; |
| 195 List<HeapGraphEdge*> children_; | 194 List<HeapGraphEdge*> children_; |
| 196 List<HeapEntry*> sorted_entries_; | 195 List<HeapEntry*> sorted_entries_; |
| 197 SnapshotObjectId max_snapshot_js_object_id_; | 196 SnapshotObjectId max_snapshot_js_object_id_; |
| 198 | 197 |
| 199 friend class HeapSnapshotTester; | 198 friend class HeapSnapshotTester; |
| 200 | 199 |
| 201 DISALLOW_COPY_AND_ASSIGN(HeapSnapshot); | 200 DISALLOW_COPY_AND_ASSIGN(HeapSnapshot); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 216 void UpdateObjectSize(Address addr, int size); | 215 void UpdateObjectSize(Address addr, int size); |
| 217 SnapshotObjectId last_assigned_id() const { | 216 SnapshotObjectId last_assigned_id() const { |
| 218 return next_id_ - kObjectIdStep; | 217 return next_id_ - kObjectIdStep; |
| 219 } | 218 } |
| 220 | 219 |
| 221 void StopHeapObjectsTracking(); | 220 void StopHeapObjectsTracking(); |
| 222 SnapshotObjectId PushHeapObjectsStats(OutputStream* stream); | 221 SnapshotObjectId PushHeapObjectsStats(OutputStream* stream); |
| 223 size_t GetUsedMemorySize() const; | 222 size_t GetUsedMemorySize() const; |
| 224 | 223 |
| 225 SnapshotObjectId GenerateId(v8::RetainedObjectInfo* info); | 224 SnapshotObjectId GenerateId(v8::RetainedObjectInfo* info); |
| 226 static inline SnapshotObjectId GetNthGcSubrootId(int delta); | |
| 227 | 225 |
| 228 static const int kObjectIdStep = 2; | 226 static const int kObjectIdStep = 2; |
| 229 static const SnapshotObjectId kInternalRootObjectId; | 227 static const SnapshotObjectId kInternalRootObjectId; |
| 230 static const SnapshotObjectId kGcRootsObjectId; | 228 static const SnapshotObjectId kGcRootsObjectId; |
| 231 static const SnapshotObjectId kNativesRootObjectId; | |
| 232 static const SnapshotObjectId kGcRootsFirstSubrootId; | 229 static const SnapshotObjectId kGcRootsFirstSubrootId; |
| 233 static const SnapshotObjectId kFirstAvailableObjectId; | 230 static const SnapshotObjectId kFirstAvailableObjectId; |
| 234 | 231 |
| 235 int FindUntrackedObjects(); | 232 int FindUntrackedObjects(); |
| 236 | 233 |
| 237 void UpdateHeapObjectsMap(); | 234 void UpdateHeapObjectsMap(); |
| 238 void RemoveDeadEntries(); | 235 void RemoveDeadEntries(); |
| 239 | 236 |
| 240 private: | 237 private: |
| 241 struct EntryInfo { | 238 struct EntryInfo { |
| (...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 341 void TagGlobalObjects(); | 338 void TagGlobalObjects(); |
| 342 void TagCodeObject(Code* code); | 339 void TagCodeObject(Code* code); |
| 343 void TagBuiltinCodeObject(Code* code, const char* name); | 340 void TagBuiltinCodeObject(Code* code, const char* name); |
| 344 HeapEntry* AddEntry(Address address, | 341 HeapEntry* AddEntry(Address address, |
| 345 HeapEntry::Type type, | 342 HeapEntry::Type type, |
| 346 const char* name, | 343 const char* name, |
| 347 size_t size); | 344 size_t size); |
| 348 | 345 |
| 349 static String* GetConstructorName(JSObject* object); | 346 static String* GetConstructorName(JSObject* object); |
| 350 | 347 |
| 351 static HeapObject* const kInternalRootObject; | |
| 352 | |
| 353 private: | 348 private: |
| 354 typedef bool (V8HeapExplorer::*ExtractReferencesMethod)(int entry, | 349 typedef bool (V8HeapExplorer::*ExtractReferencesMethod)(int entry, |
| 355 HeapObject* object); | 350 HeapObject* object); |
| 356 | 351 |
| 357 HeapEntry* AddEntry(HeapObject* object); | 352 HeapEntry* AddEntry(HeapObject* object); |
| 358 HeapEntry* AddEntry(HeapObject* object, | 353 HeapEntry* AddEntry(HeapObject* object, |
| 359 HeapEntry::Type type, | 354 HeapEntry::Type type, |
| 360 const char* name); | 355 const char* name); |
| 361 | 356 |
| 362 const char* GetSystemEntryName(HeapObject* object); | 357 const char* GetSystemEntryName(HeapObject* object); |
| (...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 void SetRootGcRootsReference(); | 438 void SetRootGcRootsReference(); |
| 444 void SetGcRootsReference(VisitorSynchronization::SyncTag tag); | 439 void SetGcRootsReference(VisitorSynchronization::SyncTag tag); |
| 445 void SetGcSubrootReference( | 440 void SetGcSubrootReference( |
| 446 VisitorSynchronization::SyncTag tag, bool is_weak, Object* child); | 441 VisitorSynchronization::SyncTag tag, bool is_weak, Object* child); |
| 447 const char* GetStrongGcSubrootName(Object* object); | 442 const char* GetStrongGcSubrootName(Object* object); |
| 448 void TagObject(Object* obj, const char* tag); | 443 void TagObject(Object* obj, const char* tag); |
| 449 void MarkAsWeakContainer(Object* object); | 444 void MarkAsWeakContainer(Object* object); |
| 450 | 445 |
| 451 HeapEntry* GetEntry(Object* obj); | 446 HeapEntry* GetEntry(Object* obj); |
| 452 | 447 |
| 453 static inline HeapObject* GetNthGcSubrootObject(int delta); | |
| 454 static inline int GetGcSubrootOrder(HeapObject* subroot); | |
| 455 | |
| 456 Heap* heap_; | 448 Heap* heap_; |
| 457 HeapSnapshot* snapshot_; | 449 HeapSnapshot* snapshot_; |
| 458 StringsStorage* names_; | 450 StringsStorage* names_; |
| 459 HeapObjectsMap* heap_object_map_; | 451 HeapObjectsMap* heap_object_map_; |
| 460 SnapshottingProgressReportingInterface* progress_; | 452 SnapshottingProgressReportingInterface* progress_; |
| 461 SnapshotFiller* filler_; | 453 SnapshotFiller* filler_; |
| 462 HeapObjectsSet objects_tags_; | 454 HeapObjectsSet objects_tags_; |
| 463 HeapObjectsSet strong_gc_subroot_names_; | 455 HeapObjectsSet strong_gc_subroot_names_; |
| 464 HeapObjectsSet user_roots_; | 456 HeapObjectsSet user_roots_; |
| 465 HeapObjectsSet weak_containers_; | 457 HeapObjectsSet weak_containers_; |
| 466 v8::HeapProfiler::ObjectNameResolver* global_object_name_resolver_; | 458 v8::HeapProfiler::ObjectNameResolver* global_object_name_resolver_; |
| 467 | 459 |
| 468 static HeapObject* const kGcRootsObject; | |
| 469 static HeapObject* const kFirstGcSubrootObject; | |
| 470 static HeapObject* const kLastGcSubrootObject; | |
| 471 | |
| 472 friend class IndexedReferencesExtractor; | 460 friend class IndexedReferencesExtractor; |
| 473 friend class GcSubrootsEnumerator; | |
| 474 friend class RootsReferencesExtractor; | 461 friend class RootsReferencesExtractor; |
| 475 | 462 |
| 476 DISALLOW_COPY_AND_ASSIGN(V8HeapExplorer); | 463 DISALLOW_COPY_AND_ASSIGN(V8HeapExplorer); |
| 477 }; | 464 }; |
| 478 | 465 |
| 479 | 466 |
| 480 class NativeGroupRetainedObjectInfo; | 467 class NativeGroupRetainedObjectInfo; |
| 481 | 468 |
| 482 | 469 |
| 483 // An implementation of retained native objects extractor. | 470 // An implementation of retained native objects extractor. |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 618 friend class HeapSnapshotJSONSerializerEnumerator; | 605 friend class HeapSnapshotJSONSerializerEnumerator; |
| 619 friend class HeapSnapshotJSONSerializerIterator; | 606 friend class HeapSnapshotJSONSerializerIterator; |
| 620 | 607 |
| 621 DISALLOW_COPY_AND_ASSIGN(HeapSnapshotJSONSerializer); | 608 DISALLOW_COPY_AND_ASSIGN(HeapSnapshotJSONSerializer); |
| 622 }; | 609 }; |
| 623 | 610 |
| 624 | 611 |
| 625 } } // namespace v8::internal | 612 } } // namespace v8::internal |
| 626 | 613 |
| 627 #endif // V8_HEAP_SNAPSHOT_GENERATOR_H_ | 614 #endif // V8_HEAP_SNAPSHOT_GENERATOR_H_ |
| OLD | NEW |