v8-profiler.h revision 342c50ce1624b485728b9a4fc41d8bbf37eb46cf
1// Copyright 2010 the V8 project authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#ifndef V8_V8_PROFILER_H_ 6#define V8_V8_PROFILER_H_ 7 8#include <vector> 9#include "v8.h" // NOLINT(build/include) 10 11/** 12 * Profiler support for the V8 JavaScript engine. 13 */ 14namespace v8 { 15 16class HeapGraphNode; 17struct HeapStatsUpdate; 18 19typedef uint32_t SnapshotObjectId; 20 21 22struct CpuProfileDeoptFrame { 23 int script_id; 24 size_t position; 25}; 26 27} // namespace v8 28 29#ifdef V8_OS_WIN 30template class V8_EXPORT std::vector<v8::CpuProfileDeoptFrame>; 31#endif 32 33namespace v8 { 34 35struct V8_EXPORT CpuProfileDeoptInfo { 36 /** A pointer to a static string owned by v8. */ 37 const char* deopt_reason; 38 std::vector<CpuProfileDeoptFrame> stack; 39}; 40 41} // namespace v8 42 43#ifdef V8_OS_WIN 44template class V8_EXPORT std::vector<v8::CpuProfileDeoptInfo>; 45#endif 46 47namespace v8 { 48 49/** 50 * CpuProfileNode represents a node in a call graph. 51 */ 52class V8_EXPORT CpuProfileNode { 53 public: 54 struct LineTick { 55 /** The 1-based number of the source line where the function originates. */ 56 int line; 57 58 /** The count of samples associated with the source line. */ 59 unsigned int hit_count; 60 }; 61 62 /** Returns function name (empty string for anonymous functions.) */ 63 Local<String> GetFunctionName() const; 64 65 /** Returns id of the script where function is located. */ 66 int GetScriptId() const; 67 68 /** Returns resource name for script from where the function originates. */ 69 Local<String> GetScriptResourceName() const; 70 71 /** 72 * Returns the number, 1-based, of the line where the function originates. 73 * kNoLineNumberInfo if no line number information is available. 74 */ 75 int GetLineNumber() const; 76 77 /** 78 * Returns 1-based number of the column where the function originates. 79 * kNoColumnNumberInfo if no column number information is available. 80 */ 81 int GetColumnNumber() const; 82 83 /** 84 * Returns the number of the function's source lines that collect the samples. 85 */ 86 unsigned int GetHitLineCount() const; 87 88 /** Returns the set of source lines that collect the samples. 89 * The caller allocates buffer and responsible for releasing it. 90 * True if all available entries are copied, otherwise false. 91 * The function copies nothing if buffer is not large enough. 92 */ 93 bool GetLineTicks(LineTick* entries, unsigned int length) const; 94 95 /** Returns bailout reason for the function 96 * if the optimization was disabled for it. 97 */ 98 const char* GetBailoutReason() const; 99 100 /** 101 * Returns the count of samples where the function was currently executing. 102 */ 103 unsigned GetHitCount() const; 104 105 /** Returns function entry UID. */ 106 unsigned GetCallUid() const; 107 108 /** Returns id of the node. The id is unique within the tree */ 109 unsigned GetNodeId() const; 110 111 /** Returns child nodes count of the node. */ 112 int GetChildrenCount() const; 113 114 /** Retrieves a child node by index. */ 115 const CpuProfileNode* GetChild(int index) const; 116 117 /** Retrieves deopt infos for the node. */ 118 const std::vector<CpuProfileDeoptInfo>& GetDeoptInfos() const; 119 120 static const int kNoLineNumberInfo = Message::kNoLineNumberInfo; 121 static const int kNoColumnNumberInfo = Message::kNoColumnInfo; 122}; 123 124 125/** 126 * CpuProfile contains a CPU profile in a form of top-down call tree 127 * (from main() down to functions that do all the work). 128 */ 129class V8_EXPORT CpuProfile { 130 public: 131 /** Returns CPU profile title. */ 132 Local<String> GetTitle() const; 133 134 /** Returns the root node of the top down call tree. */ 135 const CpuProfileNode* GetTopDownRoot() const; 136 137 /** 138 * Returns number of samples recorded. The samples are not recorded unless 139 * |record_samples| parameter of CpuProfiler::StartCpuProfiling is true. 140 */ 141 int GetSamplesCount() const; 142 143 /** 144 * Returns profile node corresponding to the top frame the sample at 145 * the given index. 146 */ 147 const CpuProfileNode* GetSample(int index) const; 148 149 /** 150 * Returns the timestamp of the sample. The timestamp is the number of 151 * microseconds since some unspecified starting point. 152 * The point is equal to the starting point used by GetStartTime. 153 */ 154 int64_t GetSampleTimestamp(int index) const; 155 156 /** 157 * Returns time when the profile recording was started (in microseconds) 158 * since some unspecified starting point. 159 */ 160 int64_t GetStartTime() const; 161 162 /** 163 * Returns time when the profile recording was stopped (in microseconds) 164 * since some unspecified starting point. 165 * The point is equal to the starting point used by GetStartTime. 166 */ 167 int64_t GetEndTime() const; 168 169 /** 170 * Deletes the profile and removes it from CpuProfiler's list. 171 * All pointers to nodes previously returned become invalid. 172 */ 173 void Delete(); 174}; 175 176 177/** 178 * Interface for controlling CPU profiling. Instance of the 179 * profiler can be retrieved using v8::Isolate::GetCpuProfiler. 180 */ 181class V8_EXPORT CpuProfiler { 182 public: 183 /** 184 * Changes default CPU profiler sampling interval to the specified number 185 * of microseconds. Default interval is 1000us. This method must be called 186 * when there are no profiles being recorded. 187 */ 188 void SetSamplingInterval(int us); 189 190 /** 191 * Starts collecting CPU profile. Title may be an empty string. It 192 * is allowed to have several profiles being collected at 193 * once. Attempts to start collecting several profiles with the same 194 * title are silently ignored. While collecting a profile, functions 195 * from all security contexts are included in it. The token-based 196 * filtering is only performed when querying for a profile. 197 * 198 * |record_samples| parameter controls whether individual samples should 199 * be recorded in addition to the aggregated tree. 200 */ 201 void StartProfiling(Local<String> title, bool record_samples = false); 202 203 /** 204 * Stops collecting CPU profile with a given title and returns it. 205 * If the title given is empty, finishes the last profile started. 206 */ 207 CpuProfile* StopProfiling(Local<String> title); 208 209 /** 210 * Force collection of a sample. Must be called on the VM thread. 211 * Recording the forced sample does not contribute to the aggregated 212 * profile statistics. 213 */ 214 void CollectSample(); 215 216 /** 217 * Tells the profiler whether the embedder is idle. 218 */ 219 void SetIdle(bool is_idle); 220 221 private: 222 CpuProfiler(); 223 ~CpuProfiler(); 224 CpuProfiler(const CpuProfiler&); 225 CpuProfiler& operator=(const CpuProfiler&); 226}; 227 228 229/** 230 * HeapSnapshotEdge represents a directed connection between heap 231 * graph nodes: from retainers to retained nodes. 232 */ 233class V8_EXPORT HeapGraphEdge { 234 public: 235 enum Type { 236 kContextVariable = 0, // A variable from a function context. 237 kElement = 1, // An element of an array. 238 kProperty = 2, // A named object property. 239 kInternal = 3, // A link that can't be accessed from JS, 240 // thus, its name isn't a real property name 241 // (e.g. parts of a ConsString). 242 kHidden = 4, // A link that is needed for proper sizes 243 // calculation, but may be hidden from user. 244 kShortcut = 5, // A link that must not be followed during 245 // sizes calculation. 246 kWeak = 6 // A weak reference (ignored by the GC). 247 }; 248 249 /** Returns edge type (see HeapGraphEdge::Type). */ 250 Type GetType() const; 251 252 /** 253 * Returns edge name. This can be a variable name, an element index, or 254 * a property name. 255 */ 256 Local<Value> GetName() const; 257 258 /** Returns origin node. */ 259 const HeapGraphNode* GetFromNode() const; 260 261 /** Returns destination node. */ 262 const HeapGraphNode* GetToNode() const; 263}; 264 265 266/** 267 * HeapGraphNode represents a node in a heap graph. 268 */ 269class V8_EXPORT HeapGraphNode { 270 public: 271 enum Type { 272 kHidden = 0, // Hidden node, may be filtered when shown to user. 273 kArray = 1, // An array of elements. 274 kString = 2, // A string. 275 kObject = 3, // A JS object (except for arrays and strings). 276 kCode = 4, // Compiled code. 277 kClosure = 5, // Function closure. 278 kRegExp = 6, // RegExp. 279 kHeapNumber = 7, // Number stored in the heap. 280 kNative = 8, // Native object (not from V8 heap). 281 kSynthetic = 9, // Synthetic object, usualy used for grouping 282 // snapshot items together. 283 kConsString = 10, // Concatenated string. A pair of pointers to strings. 284 kSlicedString = 11, // Sliced string. A fragment of another string. 285 kSymbol = 12, // A Symbol (ES6). 286 kSimdValue = 13 // A SIMD value stored in the heap (Proposed ES7). 287 }; 288 289 /** Returns node type (see HeapGraphNode::Type). */ 290 Type GetType() const; 291 292 /** 293 * Returns node name. Depending on node's type this can be the name 294 * of the constructor (for objects), the name of the function (for 295 * closures), string value, or an empty string (for compiled code). 296 */ 297 Local<String> GetName() const; 298 299 /** 300 * Returns node id. For the same heap object, the id remains the same 301 * across all snapshots. 302 */ 303 SnapshotObjectId GetId() const; 304 305 /** Returns node's own size, in bytes. */ 306 size_t GetShallowSize() const; 307 308 /** Returns child nodes count of the node. */ 309 int GetChildrenCount() const; 310 311 /** Retrieves a child by index. */ 312 const HeapGraphEdge* GetChild(int index) const; 313}; 314 315 316/** 317 * An interface for exporting data from V8, using "push" model. 318 */ 319class V8_EXPORT OutputStream { // NOLINT 320 public: 321 enum WriteResult { 322 kContinue = 0, 323 kAbort = 1 324 }; 325 virtual ~OutputStream() {} 326 /** Notify about the end of stream. */ 327 virtual void EndOfStream() = 0; 328 /** Get preferred output chunk size. Called only once. */ 329 virtual int GetChunkSize() { return 1024; } 330 /** 331 * Writes the next chunk of snapshot data into the stream. Writing 332 * can be stopped by returning kAbort as function result. EndOfStream 333 * will not be called in case writing was aborted. 334 */ 335 virtual WriteResult WriteAsciiChunk(char* data, int size) = 0; 336 /** 337 * Writes the next chunk of heap stats data into the stream. Writing 338 * can be stopped by returning kAbort as function result. EndOfStream 339 * will not be called in case writing was aborted. 340 */ 341 virtual WriteResult WriteHeapStatsChunk(HeapStatsUpdate* data, int count) { 342 return kAbort; 343 } 344}; 345 346 347/** 348 * HeapSnapshots record the state of the JS heap at some moment. 349 */ 350class V8_EXPORT HeapSnapshot { 351 public: 352 enum SerializationFormat { 353 kJSON = 0 // See format description near 'Serialize' method. 354 }; 355 356 /** Returns the root node of the heap graph. */ 357 const HeapGraphNode* GetRoot() const; 358 359 /** Returns a node by its id. */ 360 const HeapGraphNode* GetNodeById(SnapshotObjectId id) const; 361 362 /** Returns total nodes count in the snapshot. */ 363 int GetNodesCount() const; 364 365 /** Returns a node by index. */ 366 const HeapGraphNode* GetNode(int index) const; 367 368 /** Returns a max seen JS object Id. */ 369 SnapshotObjectId GetMaxSnapshotJSObjectId() const; 370 371 /** 372 * Deletes the snapshot and removes it from HeapProfiler's list. 373 * All pointers to nodes, edges and paths previously returned become 374 * invalid. 375 */ 376 void Delete(); 377 378 /** 379 * Prepare a serialized representation of the snapshot. The result 380 * is written into the stream provided in chunks of specified size. 381 * The total length of the serialized snapshot is unknown in 382 * advance, it can be roughly equal to JS heap size (that means, 383 * it can be really big - tens of megabytes). 384 * 385 * For the JSON format, heap contents are represented as an object 386 * with the following structure: 387 * 388 * { 389 * snapshot: { 390 * title: "...", 391 * uid: nnn, 392 * meta: { meta-info }, 393 * node_count: nnn, 394 * edge_count: nnn 395 * }, 396 * nodes: [nodes array], 397 * edges: [edges array], 398 * strings: [strings array] 399 * } 400 * 401 * Nodes reference strings, other nodes, and edges by their indexes 402 * in corresponding arrays. 403 */ 404 void Serialize(OutputStream* stream, 405 SerializationFormat format = kJSON) const; 406}; 407 408 409/** 410 * An interface for reporting progress and controlling long-running 411 * activities. 412 */ 413class V8_EXPORT ActivityControl { // NOLINT 414 public: 415 enum ControlOption { 416 kContinue = 0, 417 kAbort = 1 418 }; 419 virtual ~ActivityControl() {} 420 /** 421 * Notify about current progress. The activity can be stopped by 422 * returning kAbort as the callback result. 423 */ 424 virtual ControlOption ReportProgressValue(int done, int total) = 0; 425}; 426 427 428/** 429 * AllocationProfile is a sampled profile of allocations done by the program. 430 * This is structured as a call-graph. 431 */ 432class V8_EXPORT AllocationProfile { 433 public: 434 struct Allocation { 435 /** 436 * Size of the sampled allocation object. 437 */ 438 size_t size; 439 440 /** 441 * The number of objects of such size that were sampled. 442 */ 443 unsigned int count; 444 }; 445 446 /** 447 * Represents a node in the call-graph. 448 */ 449 struct Node { 450 /** 451 * Name of the function. May be empty for anonymous functions or if the 452 * script corresponding to this function has been unloaded. 453 */ 454 Local<String> name; 455 456 /** 457 * Name of the script containing the function. May be empty if the script 458 * name is not available, or if the script has been unloaded. 459 */ 460 Local<String> script_name; 461 462 /** 463 * id of the script where the function is located. May be equal to 464 * v8::UnboundScript::kNoScriptId in cases where the script doesn't exist. 465 */ 466 int script_id; 467 468 /** 469 * Start position of the function in the script. 470 */ 471 int start_position; 472 473 /** 474 * 1-indexed line number where the function starts. May be 475 * kNoLineNumberInfo if no line number information is available. 476 */ 477 int line_number; 478 479 /** 480 * 1-indexed column number where the function starts. May be 481 * kNoColumnNumberInfo if no line number information is available. 482 */ 483 int column_number; 484 485 /** 486 * List of callees called from this node for which we have sampled 487 * allocations. The lifetime of the children is scoped to the containing 488 * AllocationProfile. 489 */ 490 std::vector<Node*> children; 491 492 /** 493 * List of self allocations done by this node in the call-graph. 494 */ 495 std::vector<Allocation> allocations; 496 }; 497 498 /** 499 * Returns the root node of the call-graph. The root node corresponds to an 500 * empty JS call-stack. The lifetime of the returned Node* is scoped to the 501 * containing AllocationProfile. 502 */ 503 virtual Node* GetRootNode() = 0; 504 505 virtual ~AllocationProfile() {} 506 507 static const int kNoLineNumberInfo = Message::kNoLineNumberInfo; 508 static const int kNoColumnNumberInfo = Message::kNoColumnInfo; 509}; 510 511 512/** 513 * Interface for controlling heap profiling. Instance of the 514 * profiler can be retrieved using v8::Isolate::GetHeapProfiler. 515 */ 516class V8_EXPORT HeapProfiler { 517 public: 518 /** 519 * Callback function invoked for obtaining RetainedObjectInfo for 520 * the given JavaScript wrapper object. It is prohibited to enter V8 521 * while the callback is running: only getters on the handle and 522 * GetPointerFromInternalField on the objects are allowed. 523 */ 524 typedef RetainedObjectInfo* (*WrapperInfoCallback)(uint16_t class_id, 525 Local<Value> wrapper); 526 527 /** Returns the number of snapshots taken. */ 528 int GetSnapshotCount(); 529 530 /** Returns a snapshot by index. */ 531 const HeapSnapshot* GetHeapSnapshot(int index); 532 533 /** 534 * Returns SnapshotObjectId for a heap object referenced by |value| if 535 * it has been seen by the heap profiler, kUnknownObjectId otherwise. 536 */ 537 SnapshotObjectId GetObjectId(Local<Value> value); 538 539 /** 540 * Returns heap object with given SnapshotObjectId if the object is alive, 541 * otherwise empty handle is returned. 542 */ 543 Local<Value> FindObjectById(SnapshotObjectId id); 544 545 /** 546 * Clears internal map from SnapshotObjectId to heap object. The new objects 547 * will not be added into it unless a heap snapshot is taken or heap object 548 * tracking is kicked off. 549 */ 550 void ClearObjectIds(); 551 552 /** 553 * A constant for invalid SnapshotObjectId. GetSnapshotObjectId will return 554 * it in case heap profiler cannot find id for the object passed as 555 * parameter. HeapSnapshot::GetNodeById will always return NULL for such id. 556 */ 557 static const SnapshotObjectId kUnknownObjectId = 0; 558 559 /** 560 * Callback interface for retrieving user friendly names of global objects. 561 */ 562 class ObjectNameResolver { 563 public: 564 /** 565 * Returns name to be used in the heap snapshot for given node. Returned 566 * string must stay alive until snapshot collection is completed. 567 */ 568 virtual const char* GetName(Local<Object> object) = 0; 569 570 protected: 571 virtual ~ObjectNameResolver() {} 572 }; 573 574 /** 575 * Takes a heap snapshot and returns it. 576 */ 577 const HeapSnapshot* TakeHeapSnapshot( 578 ActivityControl* control = NULL, 579 ObjectNameResolver* global_object_name_resolver = NULL); 580 581 /** 582 * Starts tracking of heap objects population statistics. After calling 583 * this method, all heap objects relocations done by the garbage collector 584 * are being registered. 585 * 586 * |track_allocations| parameter controls whether stack trace of each 587 * allocation in the heap will be recorded and reported as part of 588 * HeapSnapshot. 589 */ 590 void StartTrackingHeapObjects(bool track_allocations = false); 591 592 /** 593 * Adds a new time interval entry to the aggregated statistics array. The 594 * time interval entry contains information on the current heap objects 595 * population size. The method also updates aggregated statistics and 596 * reports updates for all previous time intervals via the OutputStream 597 * object. Updates on each time interval are provided as a stream of the 598 * HeapStatsUpdate structure instances. 599 * If |timestamp_us| is supplied, timestamp of the new entry will be written 600 * into it. The return value of the function is the last seen heap object Id. 601 * 602 * StartTrackingHeapObjects must be called before the first call to this 603 * method. 604 */ 605 SnapshotObjectId GetHeapStats(OutputStream* stream, 606 int64_t* timestamp_us = NULL); 607 608 /** 609 * Stops tracking of heap objects population statistics, cleans up all 610 * collected data. StartHeapObjectsTracking must be called again prior to 611 * calling GetHeapStats next time. 612 */ 613 void StopTrackingHeapObjects(); 614 615 /** 616 * Starts gathering a sampling heap profile. A sampling heap profile is 617 * similar to tcmalloc's heap profiler and Go's mprof. It samples object 618 * allocations and builds an online 'sampling' heap profile. At any point in 619 * time, this profile is expected to be a representative sample of objects 620 * currently live in the system. Each sampled allocation includes the stack 621 * trace at the time of allocation, which makes this really useful for memory 622 * leak detection. 623 * 624 * This mechanism is intended to be cheap enough that it can be used in 625 * production with minimal performance overhead. 626 * 627 * Allocations are sampled using a randomized Poisson process. On average, one 628 * allocation will be sampled every |sample_interval| bytes allocated. The 629 * |stack_depth| parameter controls the maximum number of stack frames to be 630 * captured on each allocation. 631 * 632 * NOTE: This is a proof-of-concept at this point. Right now we only sample 633 * newspace allocations. Support for paged space allocation (e.g. pre-tenured 634 * objects, large objects, code objects, etc.) and native allocations 635 * doesn't exist yet, but is anticipated in the future. 636 * 637 * Objects allocated before the sampling is started will not be included in 638 * the profile. 639 * 640 * Returns false if a sampling heap profiler is already running. 641 */ 642 bool StartSamplingHeapProfiler(uint64_t sample_interval = 512 * 1024, 643 int stack_depth = 16); 644 645 /** 646 * Stops the sampling heap profile and discards the current profile. 647 */ 648 void StopSamplingHeapProfiler(); 649 650 /** 651 * Returns the sampled profile of allocations allocated (and still live) since 652 * StartSamplingHeapProfiler was called. The ownership of the pointer is 653 * transfered to the caller. Returns nullptr if sampling heap profiler is not 654 * active. 655 */ 656 AllocationProfile* GetAllocationProfile(); 657 658 /** 659 * Deletes all snapshots taken. All previously returned pointers to 660 * snapshots and their contents become invalid after this call. 661 */ 662 void DeleteAllHeapSnapshots(); 663 664 /** Binds a callback to embedder's class ID. */ 665 void SetWrapperClassInfoProvider( 666 uint16_t class_id, 667 WrapperInfoCallback callback); 668 669 /** 670 * Default value of persistent handle class ID. Must not be used to 671 * define a class. Can be used to reset a class of a persistent 672 * handle. 673 */ 674 static const uint16_t kPersistentHandleNoClassId = 0; 675 676 /** Returns memory used for profiler internal data and snapshots. */ 677 size_t GetProfilerMemorySize(); 678 679 /** 680 * Sets a RetainedObjectInfo for an object group (see V8::SetObjectGroupId). 681 */ 682 void SetRetainedObjectInfo(UniqueId id, RetainedObjectInfo* info); 683 684 private: 685 HeapProfiler(); 686 ~HeapProfiler(); 687 HeapProfiler(const HeapProfiler&); 688 HeapProfiler& operator=(const HeapProfiler&); 689}; 690 691 692/** 693 * Interface for providing information about embedder's objects 694 * held by global handles. This information is reported in two ways: 695 * 696 * 1. When calling AddObjectGroup, an embedder may pass 697 * RetainedObjectInfo instance describing the group. To collect 698 * this information while taking a heap snapshot, V8 calls GC 699 * prologue and epilogue callbacks. 700 * 701 * 2. When a heap snapshot is collected, V8 additionally 702 * requests RetainedObjectInfos for persistent handles that 703 * were not previously reported via AddObjectGroup. 704 * 705 * Thus, if an embedder wants to provide information about native 706 * objects for heap snapshots, he can do it in a GC prologue 707 * handler, and / or by assigning wrapper class ids in the following way: 708 * 709 * 1. Bind a callback to class id by calling SetWrapperClassInfoProvider. 710 * 2. Call SetWrapperClassId on certain persistent handles. 711 * 712 * V8 takes ownership of RetainedObjectInfo instances passed to it and 713 * keeps them alive only during snapshot collection. Afterwards, they 714 * are freed by calling the Dispose class function. 715 */ 716class V8_EXPORT RetainedObjectInfo { // NOLINT 717 public: 718 /** Called by V8 when it no longer needs an instance. */ 719 virtual void Dispose() = 0; 720 721 /** Returns whether two instances are equivalent. */ 722 virtual bool IsEquivalent(RetainedObjectInfo* other) = 0; 723 724 /** 725 * Returns hash value for the instance. Equivalent instances 726 * must have the same hash value. 727 */ 728 virtual intptr_t GetHash() = 0; 729 730 /** 731 * Returns human-readable label. It must be a null-terminated UTF-8 732 * encoded string. V8 copies its contents during a call to GetLabel. 733 */ 734 virtual const char* GetLabel() = 0; 735 736 /** 737 * Returns human-readable group label. It must be a null-terminated UTF-8 738 * encoded string. V8 copies its contents during a call to GetGroupLabel. 739 * Heap snapshot generator will collect all the group names, create 740 * top level entries with these names and attach the objects to the 741 * corresponding top level group objects. There is a default 742 * implementation which is required because embedders don't have their 743 * own implementation yet. 744 */ 745 virtual const char* GetGroupLabel() { return GetLabel(); } 746 747 /** 748 * Returns element count in case if a global handle retains 749 * a subgraph by holding one of its nodes. 750 */ 751 virtual intptr_t GetElementCount() { return -1; } 752 753 /** Returns embedder's object size in bytes. */ 754 virtual intptr_t GetSizeInBytes() { return -1; } 755 756 protected: 757 RetainedObjectInfo() {} 758 virtual ~RetainedObjectInfo() {} 759 760 private: 761 RetainedObjectInfo(const RetainedObjectInfo&); 762 RetainedObjectInfo& operator=(const RetainedObjectInfo&); 763}; 764 765 766/** 767 * A struct for exporting HeapStats data from V8, using "push" model. 768 * See HeapProfiler::GetHeapStats. 769 */ 770struct HeapStatsUpdate { 771 HeapStatsUpdate(uint32_t index, uint32_t count, uint32_t size) 772 : index(index), count(count), size(size) { } 773 uint32_t index; // Index of the time interval that was changed. 774 uint32_t count; // New value of count field for the interval with this index. 775 uint32_t size; // New value of size field for the interval with this index. 776}; 777 778 779} // namespace v8 780 781 782#endif // V8_V8_PROFILER_H_ 783