OLD | NEW |
---|---|
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 466 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
477 || type_ == kShortcut); | 477 || type_ == kShortcut); |
478 return name_; | 478 return name_; |
479 } | 479 } |
480 INLINE(HeapEntry* from() const); | 480 INLINE(HeapEntry* from() const); |
481 HeapEntry* to() const { return to_entry_; } | 481 HeapEntry* to() const { return to_entry_; } |
482 | 482 |
483 private: | 483 private: |
484 INLINE(HeapSnapshot* snapshot() const); | 484 INLINE(HeapSnapshot* snapshot() const); |
485 | 485 |
486 unsigned type_ : 3; | 486 unsigned type_ : 3; |
487 int from_index_ : 29; | 487 int from_index_ : 29; |
alexeif
2012/05/22 16:47:03
Looks like we can kill from_index_ now. Isn't it?
| |
488 union { | 488 union { |
489 // During entries population |to_index_| is used for storing the index, | 489 // During entries population |to_index_| is used for storing the index, |
490 // afterwards it is replaced with a pointer to the entry. | 490 // afterwards it is replaced with a pointer to the entry. |
491 int to_index_; | 491 int to_index_; |
492 HeapEntry* to_entry_; | 492 HeapEntry* to_entry_; |
493 }; | 493 }; |
494 union { | 494 union { |
495 int index_; | 495 int index_; |
496 const char* name_; | 496 const char* name_; |
497 }; | 497 }; |
(...skipping 24 matching lines...) Expand all Loading... | |
522 const char* name, | 522 const char* name, |
523 SnapshotObjectId id, | 523 SnapshotObjectId id, |
524 int self_size); | 524 int self_size); |
525 | 525 |
526 HeapSnapshot* snapshot() { return snapshot_; } | 526 HeapSnapshot* snapshot() { return snapshot_; } |
527 Type type() { return static_cast<Type>(type_); } | 527 Type type() { return static_cast<Type>(type_); } |
528 const char* name() { return name_; } | 528 const char* name() { return name_; } |
529 void set_name(const char* name) { name_ = name; } | 529 void set_name(const char* name) { name_ = name; } |
530 inline SnapshotObjectId id() { return id_; } | 530 inline SnapshotObjectId id() { return id_; } |
531 int self_size() { return self_size_; } | 531 int self_size() { return self_size_; } |
532 int retained_size() { return retained_size_; } | |
533 void add_retained_size(int size) { retained_size_ += size; } | |
534 void set_retained_size(int size) { retained_size_ = size; } | |
535 INLINE(int index() const); | 532 INLINE(int index() const); |
536 int postorder_index() { return postorder_index_; } | |
537 void set_postorder_index(int value) { postorder_index_ = value; } | |
538 int children_count() const { return children_count_; } | 533 int children_count() const { return children_count_; } |
539 INLINE(int set_children_index(int index)); | 534 INLINE(int set_children_index(int index)); |
540 INLINE(int set_retainers_index(int index)); | |
541 void add_child(HeapGraphEdge* edge) { | 535 void add_child(HeapGraphEdge* edge) { |
542 children_arr()[children_count_++] = edge; | 536 children_arr()[children_count_++] = edge; |
543 } | 537 } |
544 void add_retainer(HeapGraphEdge* edge) { | |
545 retainers_arr()[retainers_count_++] = edge; | |
546 } | |
547 Vector<HeapGraphEdge*> children() { | 538 Vector<HeapGraphEdge*> children() { |
548 return Vector<HeapGraphEdge*>(children_arr(), children_count_); } | 539 return Vector<HeapGraphEdge*>(children_arr(), children_count_); } |
549 Vector<HeapGraphEdge*> retainers() { | |
550 return Vector<HeapGraphEdge*>(retainers_arr(), retainers_count_); } | |
551 INLINE(HeapEntry* dominator() const); | |
552 void set_dominator(HeapEntry* entry) { | |
553 ASSERT(entry != NULL); | |
554 dominator_ = entry->index(); | |
555 } | |
556 void clear_paint() { painted_ = false; } | |
557 bool painted() { return painted_; } | |
558 void paint() { painted_ = true; } | |
559 bool user_reachable() { return user_reachable_; } | |
560 void set_user_reachable() { user_reachable_ = true; } | |
561 | 540 |
562 void SetIndexedReference( | 541 void SetIndexedReference( |
563 HeapGraphEdge::Type type, int index, HeapEntry* entry); | 542 HeapGraphEdge::Type type, int index, HeapEntry* entry); |
564 void SetNamedReference( | 543 void SetNamedReference( |
565 HeapGraphEdge::Type type, const char* name, HeapEntry* entry); | 544 HeapGraphEdge::Type type, const char* name, HeapEntry* entry); |
566 | 545 |
567 void Print( | 546 void Print( |
568 const char* prefix, const char* edge_name, int max_depth, int indent); | 547 const char* prefix, const char* edge_name, int max_depth, int indent); |
569 | 548 |
570 Handle<HeapObject> GetHeapObject(); | 549 Handle<HeapObject> GetHeapObject(); |
571 | 550 |
572 private: | 551 private: |
573 INLINE(HeapGraphEdge** children_arr()); | 552 INLINE(HeapGraphEdge** children_arr()); |
574 INLINE(HeapGraphEdge** retainers_arr()); | |
575 const char* TypeAsString(); | 553 const char* TypeAsString(); |
576 | 554 |
577 unsigned painted_: 1; | 555 unsigned type_; |
alexeif
2012/05/22 16:47:03
make it a bit field with e.g. children_count_. Thi
| |
578 unsigned user_reachable_: 1; | |
579 int dominator_: 30; | |
580 unsigned type_: 4; | |
581 int retainers_count_: 28; | |
582 int retainers_index_; | |
583 int children_count_; | 556 int children_count_; |
584 int children_index_; | 557 int children_index_; |
585 int self_size_; | 558 int self_size_; |
586 union { | |
587 int postorder_index_; // Used during dominator tree building. | |
588 int retained_size_; // At that moment, there is no retained size yet. | |
589 }; | |
590 SnapshotObjectId id_; | 559 SnapshotObjectId id_; |
591 HeapSnapshot* snapshot_; | 560 HeapSnapshot* snapshot_; |
592 const char* name_; | 561 const char* name_; |
593 }; | 562 }; |
594 | 563 |
595 | 564 |
596 class HeapSnapshotsCollection; | 565 class HeapSnapshotsCollection; |
597 | 566 |
598 // HeapSnapshot represents a single heap snapshot. It is stored in | 567 // HeapSnapshot represents a single heap snapshot. It is stored in |
599 // HeapSnapshotsCollection, which is also a factory for | 568 // HeapSnapshotsCollection, which is also a factory for |
(...skipping 19 matching lines...) Expand all Loading... | |
619 size_t RawSnapshotSize() const; | 588 size_t RawSnapshotSize() const; |
620 HeapEntry* root() { return &entries_[root_index_]; } | 589 HeapEntry* root() { return &entries_[root_index_]; } |
621 HeapEntry* gc_roots() { return &entries_[gc_roots_index_]; } | 590 HeapEntry* gc_roots() { return &entries_[gc_roots_index_]; } |
622 HeapEntry* natives_root() { return &entries_[natives_root_index_]; } | 591 HeapEntry* natives_root() { return &entries_[natives_root_index_]; } |
623 HeapEntry* gc_subroot(int index) { | 592 HeapEntry* gc_subroot(int index) { |
624 return &entries_[gc_subroot_indexes_[index]]; | 593 return &entries_[gc_subroot_indexes_[index]]; |
625 } | 594 } |
626 List<HeapEntry>& entries() { return entries_; } | 595 List<HeapEntry>& entries() { return entries_; } |
627 List<HeapGraphEdge>& edges() { return edges_; } | 596 List<HeapGraphEdge>& edges() { return edges_; } |
628 List<HeapGraphEdge*>& children() { return children_; } | 597 List<HeapGraphEdge*>& children() { return children_; } |
629 List<HeapGraphEdge*>& retainers() { return retainers_; } | |
630 void RememberLastJSObjectId(); | 598 void RememberLastJSObjectId(); |
631 SnapshotObjectId max_snapshot_js_object_id() const { | 599 SnapshotObjectId max_snapshot_js_object_id() const { |
632 return max_snapshot_js_object_id_; | 600 return max_snapshot_js_object_id_; |
633 } | 601 } |
634 | 602 |
635 HeapEntry* AddEntry(HeapEntry::Type type, | 603 HeapEntry* AddEntry(HeapEntry::Type type, |
636 const char* name, | 604 const char* name, |
637 SnapshotObjectId id, | 605 SnapshotObjectId id, |
638 int size); | 606 int size); |
639 HeapEntry* AddRootEntry(); | 607 HeapEntry* AddRootEntry(); |
640 HeapEntry* AddGcRootsEntry(); | 608 HeapEntry* AddGcRootsEntry(); |
641 HeapEntry* AddGcSubrootEntry(int tag); | 609 HeapEntry* AddGcSubrootEntry(int tag); |
642 HeapEntry* AddNativesRootEntry(); | 610 HeapEntry* AddNativesRootEntry(); |
643 void ClearPaint(); | |
644 HeapEntry* GetEntryById(SnapshotObjectId id); | 611 HeapEntry* GetEntryById(SnapshotObjectId id); |
645 List<HeapEntry*>* GetSortedEntriesList(); | 612 List<HeapEntry*>* GetSortedEntriesList(); |
646 void SetDominatorsToSelf(); | 613 void FillChildren(); |
647 void FillChildrenAndRetainers(); | |
648 | 614 |
649 void Print(int max_depth); | 615 void Print(int max_depth); |
650 void PrintEntriesSize(); | 616 void PrintEntriesSize(); |
651 | 617 |
652 private: | 618 private: |
653 HeapSnapshotsCollection* collection_; | 619 HeapSnapshotsCollection* collection_; |
654 Type type_; | 620 Type type_; |
655 const char* title_; | 621 const char* title_; |
656 unsigned uid_; | 622 unsigned uid_; |
657 int root_index_; | 623 int root_index_; |
658 int gc_roots_index_; | 624 int gc_roots_index_; |
659 int natives_root_index_; | 625 int natives_root_index_; |
660 int gc_subroot_indexes_[VisitorSynchronization::kNumberOfSyncTags]; | 626 int gc_subroot_indexes_[VisitorSynchronization::kNumberOfSyncTags]; |
661 List<HeapEntry> entries_; | 627 List<HeapEntry> entries_; |
662 List<HeapGraphEdge> edges_; | 628 List<HeapGraphEdge> edges_; |
663 List<HeapGraphEdge*> children_; | 629 List<HeapGraphEdge*> children_; |
664 List<HeapGraphEdge*> retainers_; | |
665 List<HeapEntry*> sorted_entries_; | 630 List<HeapEntry*> sorted_entries_; |
666 SnapshotObjectId max_snapshot_js_object_id_; | 631 SnapshotObjectId max_snapshot_js_object_id_; |
667 | 632 |
668 friend class HeapSnapshotTester; | 633 friend class HeapSnapshotTester; |
669 | 634 |
670 DISALLOW_COPY_AND_ASSIGN(HeapSnapshot); | 635 DISALLOW_COPY_AND_ASSIGN(HeapSnapshot); |
671 }; | 636 }; |
672 | 637 |
673 | 638 |
674 class HeapObjectsMap { | 639 class HeapObjectsMap { |
(...skipping 379 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1054 }; | 1019 }; |
1055 | 1020 |
1056 | 1021 |
1057 class HeapSnapshotGenerator : public SnapshottingProgressReportingInterface { | 1022 class HeapSnapshotGenerator : public SnapshottingProgressReportingInterface { |
1058 public: | 1023 public: |
1059 HeapSnapshotGenerator(HeapSnapshot* snapshot, | 1024 HeapSnapshotGenerator(HeapSnapshot* snapshot, |
1060 v8::ActivityControl* control); | 1025 v8::ActivityControl* control); |
1061 bool GenerateSnapshot(); | 1026 bool GenerateSnapshot(); |
1062 | 1027 |
1063 private: | 1028 private: |
1064 bool BuildDominatorTree(const Vector<HeapEntry*>& entries, | |
1065 Vector<int>* dominators); | |
1066 bool CalculateRetainedSizes(); | |
1067 bool FillReferences(); | 1029 bool FillReferences(); |
1068 void FillPostorderIndexes(Vector<HeapEntry*>* entries); | |
1069 bool IsUserGlobalReference(const HeapGraphEdge* edge); | |
1070 void MarkUserReachableObjects(); | |
1071 void ProgressStep(); | 1030 void ProgressStep(); |
1072 bool ProgressReport(bool force = false); | 1031 bool ProgressReport(bool force = false); |
1073 bool SetEntriesDominators(); | |
1074 void SetProgressTotal(int iterations_count); | 1032 void SetProgressTotal(int iterations_count); |
1075 | 1033 |
1076 HeapSnapshot* snapshot_; | 1034 HeapSnapshot* snapshot_; |
1077 v8::ActivityControl* control_; | 1035 v8::ActivityControl* control_; |
1078 V8HeapExplorer v8_heap_explorer_; | 1036 V8HeapExplorer v8_heap_explorer_; |
1079 NativeObjectsExplorer dom_explorer_; | 1037 NativeObjectsExplorer dom_explorer_; |
1080 // Mapping from HeapThing pointers to HeapEntry* pointers. | 1038 // Mapping from HeapThing pointers to HeapEntry* pointers. |
1081 HeapEntriesMap entries_; | 1039 HeapEntriesMap entries_; |
1082 // Used during snapshot generation. | 1040 // Used during snapshot generation. |
1083 int progress_counter_; | 1041 int progress_counter_; |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
1134 | 1092 |
1135 friend class HeapSnapshotJSONSerializerEnumerator; | 1093 friend class HeapSnapshotJSONSerializerEnumerator; |
1136 friend class HeapSnapshotJSONSerializerIterator; | 1094 friend class HeapSnapshotJSONSerializerIterator; |
1137 | 1095 |
1138 DISALLOW_COPY_AND_ASSIGN(HeapSnapshotJSONSerializer); | 1096 DISALLOW_COPY_AND_ASSIGN(HeapSnapshotJSONSerializer); |
1139 }; | 1097 }; |
1140 | 1098 |
1141 } } // namespace v8::internal | 1099 } } // namespace v8::internal |
1142 | 1100 |
1143 #endif // V8_PROFILE_GENERATOR_H_ | 1101 #endif // V8_PROFILE_GENERATOR_H_ |
OLD | NEW |