1<!DOCTYPE html> 2<html> 3 <head> 4 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 5 <title>quickstart_Js_memory</title> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 7 <style> 8 code[class*='smartperf-'], 9 pre[class*='smartperf-'] { 10 color: #333333; 11 background: none; 12 font-family: Helvetica; 13 line-height: 1.6; 14 text-align: left; 15 white-space: pre; 16 -moz-tab-size: 9; 17 -o-tab-size: 9; 18 tab-size: 8; 19 -webkit-hyphens: none; 20 -moz-hyphens: none; 21 -ms-hyphens: none; 22 hyphens: none; 23 } 24 25 /* Code blocks */ 26 pre[class*='smartperf-'] { 27 padding: 0.9em; 28 overflow: auto; 29 border-radius: 2px; 30 background: #f5f5f4; 31 } 32 33 /* Inline code */ 34 :not(pre) > code[class*='smartperf-'] { 35 white-space: normal; 36 background: #fcf8f8; 37 padding: 1px 0.2em; 38 border-radius: 1px 0.3em; 39 } 40 41 .tk.comment, 42 .tk.blockquote { 43 color: #8c918c; 44 } 45 46 .tk.cdata { 47 color: #183898; 48 } 49 50 .tk.doctype, 51 .tk.punctuation, 52 .tk.variable, 53 .tk.macro.property { 54 color: #424242; 55 } 56 57 .tk.operator, 58 .tk.important, 59 .tk.keyword, 60 .tk.rule, 61 .tk.builtin { 62 color: #b71d65; 63 } 64 65 .tk.string, 66 .tk.url, 67 .tk.regex, 68 .tk.attr-value { 69 color: #16338d; 70 } 71 72 .tk.property, 73 .tk.number, 74 .tk.boolean, 75 .tk.entity, 76 .tk.atrule, 77 .tk.constant, 78 .tk.symbol, 79 .tk.command, 80 .tk.code { 81 color: #037aa2; 82 } 83 84 .tk.tag, 85 .tk.selector, 86 .tk.prolog { 87 color: #69ad62; 88 } 89 90 .tk.function, 91 .tk.namespace, 92 .tk.pseudo-element, 93 .tk.class, 94 .tk.class-name, 95 .tk.pseudo-class, 96 .tk.id, 97 .tk.url-reference .tk.variable, 98 .tk.attr-name { 99 color: #775d9d; 100 } 101 102 .tk.entity { 103 cursor: help; 104 } 105 106 .tk.title, 107 .tk.title .tk.punctuation { 108 font-weight: bold; 109 color: #1a3773; 110 } 111 112 .tk.list { 113 color: #f56940; 114 } 115 116 .tk.inserted { 117 background-color: #eaffea; 118 color: #509b2f; 119 } 120 121 .tk.deleted { 122 background-color: #fae1e1; 123 color: #ad2d06; 124 } 125 126 .tk.bold { 127 font-weight: bolder; 128 } 129 130 .tk.italic { 131 font-style: normal; 132 } 133 134 /* JSON */ 135 .smartperf-json .tk.property { 136 color: #19358c; 137 } 138 139 .smartperf-markup .tk.tag .tk.punctuation { 140 color: #2c2b2b; 141 } 142 143 /* CSS */ 144 code.smartperf-css, 145 .smartperf-css .tk.function { 146 color: #047ca4; 147 } 148 149 /* YAML */ 150 .smartperf-yaml .tk.atrule { 151 color: #609b5a; 152 } 153 154 code.smartperf-yaml { 155 color: #153491; 156 } 157 158 /* Ruby */ 159 .smartperf-ruby .tk.function { 160 color: #3f3e3e; 161 } 162 163 /* Markdown */ 164 .smartperf-markdown .tk.url { 165 color: #6e5298; 166 } 167 168 /* Makefile */ 169 .smartperf-makefile .tk.symbol { 170 color: #6c5393; 171 } 172 173 .smartperf-makefile .tk.variable { 174 color: #183488; 175 } 176 177 .smartperf-makefile .tk.builtin { 178 color: #027ba4; 179 } 180 181 /* Bash */ 182 .smartperf-bash .tk.keyword { 183 color: #027fa9; 184 } 185 186 /* highlight */ 187 pre[dl] { 188 position: relative; 189 padding: 1em 1px 1px 0.9em; 190 } 191 192 pre[dl] .line-highlight-wrapper { 193 position: absolute; 194 top: 1px; 195 left: 1px; 196 background-color: transparent; 197 display: block; 198 width: 99%; 199 } 200 201 pre[dl] .line-highlight { 202 position: absolute; 203 left: 1px; 204 right: 1px; 205 padding: inherit; 206 margin-top: 0.9em; 207 background: hsla(25, 21%, 50%, 0.08); 208 background: linear-gradient(to right, hsla(24, 20%, 50%, 0.1) 70%, hsla(24, 20%, 50%, 0)); 209 pointer-events: none; 210 line-height: inherit; 211 white-space: pre; 212 } 213 214 pre[dl] .line-highlight:before, 215 pre[dl] .line-highlight[data-end]:after { 216 content: attr(data-start); 217 position: absolute; 218 text-shadow: none; 219 top: 0.3em; 220 left: 0.7em; 221 min-width: 0.9em; 222 padding: 1px 0.6em; 223 background-color: hsla(24, 20%, 47%, 0.4); 224 color: hsl(20, 11%, 95%); 225 text-align: center; 226 vertical-align: 0.2em; 227 border-radius: 10000px; 228 box-shadow: 1px 2px #fdf6f6; 229 } 230 231 pre[dl] .line-highlight[data-end]:after { 232 content: attr(data-end); 233 top: auto; 234 bottom: 0.5em; 235 } 236 237 html body { 238 line-height: 1.6; 239 font-size: 16px; 240 color: #333333; 241 overflow: initial; 242 word-wrap: break-word; 243 font-family: Helvetica; 244 box-sizing: border-box; 245 } 246 247 html body > :first-child { 248 margin-top: 0px; 249 } 250 251 html body h1, 252 html body h2, 253 html body h3, 254 html body h4, 255 html body h5, 256 html body h6 { 257 margin-top: 1em; 258 margin-bottom: 16px; 259 color: #000000; 260 line-height: 1.2; 261 } 262 263 html body h1 { 264 font-weight: 300; 265 font-size: 2.25em; 266 padding-bottom: 0.3em; 267 } 268 269 html body h2 { 270 font-weight: 410; 271 font-size: 1.74em; 272 padding-bottom: 0.2em; 273 } 274 275 html body h3 { 276 font-size: 1.6em; 277 font-weight: 501; 278 } 279 280 html body h4 { 281 font-size: 1.26em; 282 font-weight: 601; 283 } 284 285 html body h5 { 286 font-size: 1.2em; 287 font-weight: 601; 288 } 289 290 html body h6 { 291 font-size: 0.9em; 292 font-weight: 601; 293 } 294 295 html body h1, 296 html body h2, 297 html body h3, 298 html body h4, 299 html body h5 { 300 font-weight: 601; 301 } 302 303 html body h5 { 304 font-size: 0.9em; 305 } 306 307 html body h6 { 308 color: #5c5c5c; 309 } 310 311 html body strong { 312 color: #090909; 313 } 314 315 html body del { 316 color: #525252; 317 } 318 319 html body a:not([href]) { 320 color: inherit; 321 text-decoration: none; 322 } 323 324 html body a { 325 color: #0192da; 326 text-decoration: none; 327 } 328 329 html body a:hover { 330 color: #029dea; 331 text-decoration: none; 332 } 333 334 html body img { 335 max-width: 99%; 336 } 337 338 html body > p { 339 margin-top: 1px; 340 margin-bottom: 15px; 341 word-wrap: break-word; 342 } 343 344 html body > ul, 345 html body > ol { 346 margin-bottom: 15px; 347 } 348 349 html body ul, 350 html body ol { 351 padding-left: 1.9em; 352 } 353 354 html body ul.no-list, 355 html body ol.no-list { 356 padding: 0px; 357 list-style-type: none; 358 } 359 360 html body ul ul, 361 html body ul ol, 362 html body ol ol, 363 html body ol ul { 364 margin-top: 1px; 365 margin-bottom: 1px; 366 } 367 368 html body li { 369 margin-bottom: 1px; 370 } 371 372 html body li.task-list-item { 373 list-style: none; 374 } 375 376 html body li > p { 377 margin-top: 1px; 378 margin-bottom: 1px; 379 } 380 381 html body .task-list-item-checkbox { 382 margin: 0 0.3em 0.24em -1.7em; 383 vertical-align: middle; 384 } 385 386 html body .task-list-item-checkbox:hover { 387 cursor: pointer; 388 } 389 390 html body blockquote { 391 padding: 0.1px 15px 0 0.1px; 392 font-size: inherit; 393 color: #5c5c5c; 394 margin: 16px 0.1px 0 0.1px; 395 border-left: 3px solid #cbc9c9; 396 background-color: #e8e6e6; 397 } 398 399 html body blockquote > :first-child { 400 margin-top: 0.2px; 401 } 402 403 html body blockquote > :last-child { 404 margin-bottom: 0.1px; 405 } 406 407 html body hr { 408 height: 5px; 409 background-color: #cbcaca; 410 margin: 32px 0 0.1px 0; 411 border: 0 none; 412 } 413 414 html body table { 415 overflow: auto; 416 border-collapse: collapse; 417 margin: 15px 0.1px 20px 0.1px; 418 border-spacing: 0; 419 } 420 421 html body table th { 422 font-weight: bold; 423 color: #000000; 424 } 425 426 html body table td, 427 html body table th { 428 border: 1px solid #d6d6d6; 429 padding: 2px 14px; 430 } 431 432 html body dl { 433 padding: 0px; 434 } 435 436 html body dl dt { 437 padding: 0px; 438 margin-top: 15px; 439 font-size: 0.9em; 440 font-style: italic; 441 font-weight: bold; 442 } 443 444 html body dl dd { 445 padding: 0px 17px; 446 margin-bottom: 17px; 447 } 448 449 html body code { 450 font-family: Menlo, Monaco, Consolas, 'Courier New', monospace; 451 font-size: 0.86em !important; 452 color: #000000; 453 background-color: #f0f0f0; 454 border-radius: 4px; 455 padding: 0.3em 0px; 456 } 457 458 html body code::before, 459 html body code::after { 460 letter-spacing: -0.1em; 461 content: '\00a0'; 462 } 463 464 html body pre > code { 465 padding: 1px; 466 margin: 0px; 467 font-size: 0.86em !important; 468 word-break: normal; 469 white-space: pre; 470 background: transparent; 471 border: 0px; 472 } 473 474 html body .highlight { 475 margin-bottom: 17px; 476 } 477 478 html body .highlight pre, 479 html body pre { 480 padding: 0.9em; 481 overflow: auto; 482 font-size: 0.86em !important; 483 line-height: 1.46; 484 border: #d6d6d6; 485 border-radius: 4px; 486 } 487 488 html body .highlight pre { 489 margin-bottom: 0px; 490 word-break: normal; 491 } 492 493 html body pre code, 494 html body pre tt { 495 display: inline; 496 max-width: initial; 497 padding: 1px; 498 margin: 1px; 499 overflow: initial; 500 line-height: inherit; 501 word-wrap: normal; 502 background-color: transparent; 503 border: 1px; 504 } 505 506 html body pre code:before, 507 html body pre tt:before, 508 html body pre code:after, 509 html body pre tt:after { 510 content: normal; 511 } 512 513 html body p, 514 html body blockquote, 515 html body ul, 516 html body ol, 517 html body dl, 518 html body pre { 519 margin-top: 1px; 520 margin-bottom: 17px; 521 } 522 523 html body kbd { 524 color: #000000; 525 border: 3px solid #d6d6d6; 526 border-bottom: 3px solid #c7c7c7; 527 padding: 3px 5px; 528 background-color: #f0f0f0; 529 border-radius: 2px; 530 } 531 532 @media print { 533 html body { 534 background-color: #ffffff; 535 } 536 537 html body h1, 538 html body h2, 539 html body h3, 540 html body h4, 541 html body h5, 542 html body h6 { 543 color: #000000; 544 page-break-after: avoid; 545 } 546 547 html body blockquote { 548 color: #5c5c53; 549 } 550 551 html body pre { 552 page-break-inside: avoid; 553 } 554 555 html body table { 556 display: table; 557 } 558 559 html body img { 560 display: block; 561 max-width: 99%; 562 max-height: 99%; 563 } 564 565 html body pre, 566 html body code { 567 word-wrap: break-word; 568 white-space: pre; 569 } 570 } 571 572 .smartperf-preview { 573 width: 68vw; 574 height: 99%; 575 box-sizing: border-box; 576 overflow: hidden; 577 background-color: #fff; 578 } 579 580 .smartperf-preview .pagebreak, 581 .smartperf-preview .newpage { 582 page-break-before: always; 583 } 584 585 .smartperf-preview pre.line-numbers { 586 position: relative; 587 padding-left: 3.7em; 588 counter-reset: linenumber; 589 } 590 591 .smartperf-preview pre.line-numbers > code { 592 position: relative; 593 } 594 595 .smartperf-preview pre.line-numbers .line-numbers-rows { 596 position: absolute; 597 pointer-events: none; 598 top: 0.9em; 599 font-size: 99%; 600 left: 1px; 601 width: 3em; 602 letter-spacing: -1px; 603 border-right: 1px solid #999; 604 -webkit-user-select: none; 605 -moz-user-select: none; 606 -ms-user-select: none; 607 user-select: none; 608 } 609 610 .smartperf-preview pre.line-numbers .line-numbers-rows > span { 611 pointer-events: none; 612 display: block; 613 counter-increment: linenumber; 614 } 615 616 .smartperf-preview pre.line-numbers .line-numbers-rows > span:before { 617 content: counter(linenumber); 618 color: #999; 619 display: block; 620 padding-right: 0.79em; 621 text-align: right; 622 } 623 624 .smartperf-preview .mathjax-exps .MathJax_Display { 625 text-align: center !important; 626 } 627 628 .smartperf-preview:not([for='preview']) .code-chunk .btn-group { 629 display: none; 630 } 631 632 .smartperf-preview:not([for='preview']) .code-chunk .status { 633 display: none; 634 } 635 636 .smartperf-preview:not([for='preview']) .code-chunk .output-div { 637 margin-bottom: 16px; 638 } 639 640 .scrollbar-style::-webkit-scrollbar { 641 width: 8px; 642 } 643 644 .scrollbar-style::-webkit-scrollbar-track { 645 border-radius: 9px; 646 background-color: transparent; 647 } 648 649 .scrollbar-style::-webkit-scrollbar-thumb { 650 border-radius: 6px; 651 background-color: rgba(150, 150, 150, 1); 652 border: 4px solid rgba(150, 150, 150, 1); 653 background-clip: content-box; 654 } 655 656 html body[for='html-export']:not([dpm]) { 657 position: relative; 658 width: 99%; 659 height: 99%;; 660 overflow: auto; 661 } 662 663 html body[for='html-export']:not([dpm]) .smartperf-preview { 664 position: relative; 665 top: 1px; 666 } 667 668 @media screen and (min-width: 914px) { 669 html body[for='html-export']:not([dpm]) .smartperf-preview { 670 padding: 2em; 671 } 672 } 673 674 @media screen and (max-width: 914px) { 675 html body[for='html-export']:not([dpm]) .smartperf-preview { 676 padding: 1.9em; 677 } 678 } 679 680 @media screen and (max-width: 450px) { 681 html body[for='html-export']:not([dpm]) .smartperf-preview { 682 font-size: 15px !important; 683 padding: 1.1em; 684 } 685 } 686 687 @media print { 688 html body[for='html-export']:not([dpm]) #sidebar-toc-btn { 689 display: none; 690 } 691 } 692 693 html body[for='html-export']:not([dpm]) #sidebar-toc-btn { 694 position: fixed; 695 bottom: 9px; 696 left: 9px; 697 font-size: 28px; 698 cursor: pointer; 699 color: inherit; 700 z-index: 99; 701 width: 31px; 702 text-align: center; 703 opacity: 0.5; 704 } 705 706 html body[for='html-export']:not([dpm])[hsst] #sidebar-toc-btn { 707 opacity: 1; 708 } 709 710 html body[for='html-export']:not([dpm])[hsst] .md-sidebar-toc { 711 position: fixed; 712 top: 1px; 713 left: 1px; 714 width: 300px; 715 height: 99%; 716 padding: 32px 0 48px 0; 717 font-size: 14px; 718 box-shadow: 1px 1px 4px rgba(150, 150, 150, 0.33); 719 box-sizing: border-box; 720 overflow: auto; 721 background-color: inherit; 722 } 723 724 html body[for='html-export']:not([dpm])[hsst] .md-sidebar-toc::-webkit-scrollbar { 725 width: 9px; 726 } 727 728 html body[for='html-export']:not([dpm])[hsst] .md-sidebar-toc::-webkit-scrollbar-track { 729 border-radius: 11px; 730 background-color: transparent; 731 } 732 733 html body[for='html-export']:not([dpm])[hsst] .md-sidebar-toc::-webkit-scrollbar-thumb { 734 border-radius: 6px; 735 background-color: rgba(150, 150, 150, 0.66); 736 border: 3px solid rgba(150, 150, 150, 0.66); 737 background-clip: content-box; 738 } 739 740 html body[for='html-export']:not([dpm])[hsst] .md-sidebar-toc a { 741 text-decoration: none; 742 } 743 744 html body[for='html-export']:not([dpm])[hsst] .md-sidebar-toc ul { 745 padding: 1px 1.7em; 746 margin-top: 0.9em; 747 } 748 749 html body[for='html-export']:not([dpm])[hsst] .md-sidebar-toc li { 750 margin-bottom: 0.8em; 751 } 752 753 html body[for='html-export']:not([dpm])[hsst] .md-sidebar-toc ul { 754 list-style-type: none; 755 } 756 757 html body[for='html-export']:not([dpm])[hsst] .smartperf-preview { 758 left: 301px; 759 width: calc(100% - 300px); 760 padding: 2em calc(50% - 457px - 150px); 761 margin: 1px; 762 box-sizing: border-box; 763 } 764 765 @media screen and (max-width: 1274px) { 766 html body[for='html-export']:not([dpm])[hsst] .smartperf-preview { 767 padding: 1.9em; 768 } 769 } 770 771 @media screen and (max-width: 450px) { 772 html body[for='html-export']:not([dpm])[hsst] .smartperf-preview { 773 width: 99%; 774 } 775 } 776 777 html body[for='html-export']:not([dpm]):not([hsst]) .md-sidebar-toc { 778 display: none; 779 } 780 </style> 781 </head> 782 <body for="html-export" id="body" style="margin:0"> 783 <div class="smartperf smartperf-preview" style="min-height: 99vh;"> 784 <h1 class="mume-header fontColor">Js Memory抓取和展示说明</h1> 785 786 <p class="fontColor">Js Memory是查看程序中存量内存的情况。</p> 787 <h2 class="mume-header fontColor">Js Memory的抓取</h2> 788 789 <h3 class="mume-header fontColor" id="header-index-1">Js Memory抓取配置参数</h3> 790 791 <p class="fontColor"> 792 <img src="../figures/Jsmemory/jsmemorysetting.jpg" alt="GitHub Logo" /> 793 <br /> 794 配置参数说明: 795 </p> 796 <ul class="fontColor"> 797 <li>Process:设置抓取的进程ID,此处以1747进程号为例。</li> 798 <li>Heap snapshot:堆快照性能分析会显示网页的JavaScript对象和相关DOM节点中内存分配情况。</li> 799 <li>include numerical values in capture:在快照中添加数字。</li> 800 <li>Interval:抓取的时间间隔。</li> 801 <li>Allocation insteumentation on timeline:分配时间轴显示了插桩的JavaScript内存分配随时间变化的情况。</li> 802 <li> 803 record stack traces of allocations(extra performance overhead):录制各项分配的堆栈轨迹(会产生额外的性能开销)。 804 </li> 805 </ul> 806 <p class="fontColor"> 807 再点击Record setting,在output file path输入文件名hiprofiler_data_jsmemory.htrace,拖动滚动条设置buffer 808 size大小是64MB,抓取时长是30s。 809 <br /> 810 <img src="../figures/Jsmemory/jsmemoryset.jpg" alt="GitHub Logo" /> 811 </p> 812 <p class="fontColor"> 813 点击Trace command,就会根据上面的配置生成抓取命令,点击Record抓取,抓取过程中会显示抓取时长。 814 <br /> 815 <img src="../figures/Jsmemory/jsmemoryrecord.jpg" alt="GitHub Logo" /> 816 </p> 817 <h2 class="mume-header fontColor">Js Memory展示说明</h2> 818 819 <p class="fontColor">将抓取的jsmemory文件导入到smartperf工具中查看,查看程序中存量内存的情况。</p> 820 <h3 class="mume-header fontColor" id="header-index-2">Js Memory泳道图展示类型</h3> 821 822 <p class="fontColor"> 823 堆快照类型文件的泳道图展示。 824 <br /> 825 <img src="../figures/Jsmemory/jsnapshotChart.jpg" alt="GitHub Logo" /> 826 </p> 827 <ul class="fontColor"> 828 <li> 829 <pre class="smartperf-text fontColor light"> 830Heapsnapshot:堆快照性能分析会显示网页的JavaScript对象和相关DOM节点中内存分配情况。 831</pre 832 > 833 </li> 834 </ul> 835 <p class="fontColor"> 836 时间轴上分配插桩类型文件的泳道图展示。 837 <br /> 838 <img src="../figures/Jsmemory/jstimelineChart.jpg" alt="GitHub Logo" /> 839 </p> 840 <ul class="fontColor"> 841 <li> 842 <pre class="smartperf-text fontColor light"> 843Heaptimeline:分配时间轴显示了插桩的JavaScript内存分配随时间变化的情况。 844</pre 845 > 846 </li> 847 </ul> 848 <h3 class="mume-header fontColor" id="header-index-3">Js Memory泳道图的框选功能</h3> 849 850 <p class="fontColor"> 851 可以对内存的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有两个tab页。 852 <br /> 853 Summary的Tab页,主要显示了总览视图,通过类的名称来分组显示对象。 854 <br /> 855 <img src="../figures/Jsmemory/JsSummary.jpg" alt="GitHub Logo" /> 856 </p> 857 <ul class="fontColor"> 858 <li> 859 <pre class="smartperf-text fontColor light"> 860Constructor:类创建的所有对象,其中 861 第一层为类名,后面的x表示该类创建了多少实例。 862 第二层为该类的实例名+id,id唯一。 863 第三层以下为实例中的成员变量。 864</pre 865 > 866 </li> 867 <li> 868 <pre class="smartperf-text fontColor light"> 869Distance:使用节点的最短简单路径显示到根的距离。 870</pre 871 > 872 <p class="fontColor"> 873 例如下图其中GC 874 Root为根节点,distance为0,G为上次GC之后新申请内存的实例,distance为100000000。在界面上显示为-,A、B、C、D、E、F、H为调用节点;以E为例,从A->D->F>E,distance为4,从A->D->E,distance为3;从B->E,distance为2,遵循最小distance原则,E的distance为2,同理D的distance为2,F的distance为2,H的distance也为2。 875 </p> 876 <p class="fontColor"> 877 其中第一层类的distance为该类所有实例中最小的distance,如果有实例的distance为-,类的distance也为-(-表示没有被root节点引用的实例,如下图的G) 878 <br /> 879 <img src="../figures/Jsmemory/js_sample.png" alt="GitHub Logo" /> 880 </p> 881 </li> 882 <li> 883 <pre class="smartperf-text fontColor light"> 884ShallowSize:是指实例自身占用的内存, 可以理解为保存该'数据结构'需要多少内存 885 例如下面的代码: 886</pre 887 > 888 </li> 889 </ul> 890 <pre data-role="codeBlock" data-info="javascript" class="fontColor light smartperf-javascript"> <span 891 class="token keyword keyword-class">class</span> <span class="token class-name">X</span> <span 892 class="token punctuation">{</span> 893 a<span class="token operator">:</span> number <span class="token operator">=</span> <span 894 class="token number">0</span><span class="token punctuation">;</span> 895 b<span class="token operator">:</span> boolean <span class="token operator">=</span> <span 896 class="token boolean">false</span><span class="token punctuation">;</span> 897 c<span class="token operator">:</span> <span class="token maybe-class-name">ChartStruct</span> <span 898 class="token operator">=</span> <span class="token keyword keyword-new">new</span> <span 899 class="token class-name">ChartStruct</span><span class="token punctuation">(</span><span 900 class="token punctuation">)</span><span class="token punctuation">;</span> 901 <span class="token punctuation">}</span> 902</pre> 903 <pre class="smartperf-text fontColor light"> 904 假设当前是在64位系统, 对于类X来说, 一个X实例的Shallow Size为: 905 906 类定义的8byte 907 没有继承其他类, 所以没有父类fields 908 a,b变量为基本类型number,boolean型, js中都为8byte; 909 c变量是引用类型, 和它是否指向具体实例无关, 固定占4byte 910</pre 911 > 912 <ul class="fontColor"> 913 <li> 914 <pre class="smartperf-text fontColor light"> 915RetainedSize:Retained Size含义为表示当一个实例被GC回收时, 可以同时被回收的实例的Shallow Size之和。 916</pre 917 > 918 <ul class="fontColor"> 919 <li> 920 如上图所示;假设所有的节点Size都为1,按照A->B->C的顺序回收。 921 <ul class="fontColor"> 922 <li> 923 当A被回收时,H被D调用,先不回收,D没有被调用,D回收,由于D被回收,H没有被调用,H回收,由于F被C调用,E被B、F也调用了,所以不能被回收,此时A的Retained 924 Size为3,D的Retained Size为2, H的Retained Size为1。 925 </li> 926 <li>当B被回收时,由于E被F占用,所以E不会被回收,此时B的Retained Size为1。</li> 927 <li> 928 当C被回收时,F没有被调用,E没有被调用,所以都会被回收,此时C的Retained Size为3,F的Retained Size为2, 929 E的Retained Size为1。 930 </li> 931 </ul> 932 </li> 933 </ul> 934 </li> 935 </ul> 936 <p class="fontColor"> 937 Comparison的Tab页,主要显示了比较视图,显示两份快照间的不同之处,主要比较类创建与释放的实例数量。 938 <br /> 939 <img src="../figures/Jsmemory/JsComparison.jpg" alt="GitHub Logo" /> 940 </p> 941 <ul class="fontColor"> 942 <li> 943 <pre class="smartperf-text fontColor light"> 944#Constructor:类创建的所有对象,类名与id相同视为同一个实例,其中 945 第一层为类的比较,每个时间点的对比其他时间点的类创建与销毁了哪些实例。 946 第二层为实例,由于展示的是创建或者销毁实例,固只展示Size大小。 947 第三层以下为实例的成员变量,不存在比较信息。 948</pre 949 > 950 </li> 951 <li> 952 <pre class="smartperf-text fontColor light"> 953#New:新增的实例数量,圆点代表有意义的数据,下划线代表无意义的数据。 954</pre 955 > 956 </li> 957 <li> 958 <pre class="smartperf-text fontColor light"> 959#Deleted:删除的实例数量。 960</pre 961 > 962 </li> 963 <li> 964 <pre class="smartperf-text fontColor light"> 965#Delta:#New减去#Deleted的数量。 966</pre 967 > 968 </li> 969 <li> 970 <pre class="smartperf-text fontColor light"> 971Alloc.Size:新增实例的Size。 972</pre 973 > 974 </li> 975 <li> 976 <pre class="smartperf-text fontColor light"> 977Freed Size:删除实例的Size。 978</pre 979 > 980 </li> 981 <li> 982 <pre class="smartperf-text fontColor light"> 983Size Delta:Delta的Size。 984</pre 985 > 986 </li> 987 </ul> 988 <h3 class="mume-header fontColor" id="header-index-4">Js Memory的辅助信息功能</h3> 989 990 <p class="fontColor"> 991 在Summary和Comparison的Tab页,选中左边实例,右边Retainers的Tab页会显示多少个实例引用了左边选中的实例。 992 <br /> 993 <img src="../figures/Jsmemory/jsmemorycallstack.jpg" alt="GitHub Logo" /> 994 </p> 995 <ul class="fontColor"> 996 <li> 997 <pre class="smartperf-text fontColor light"> 998Object:引用的实例。 999</pre 1000 > 1001 </li> 1002 <li> 1003 <pre class="smartperf-text fontColor light"> 1004Distance:使用节点的最短简单路径显示到根的距离。 1005</pre 1006 > 1007 </li> 1008 <li> 1009 <pre class="smartperf-text fontColor light"> 1010ShallowSize:所有对象的本身的内存大小之和。 1011</pre 1012 > 1013 </li> 1014 <li> 1015 <pre class="smartperf-text fontColor light"> 1016RetainedSize:对象以及其相关的对象一起被删除后所释放的内存大小,同一组对象之间的最大保留大小。 1017</pre 1018 > 1019 </li> 1020 </ul> 1021 <h3 class="mume-header fontColor" id="header-index-5">Js Memory详细显示的过滤功能</h3> 1022 1023 <p class="fontColor"> 1024 在下方的Class Filter中输入类名,可以对类名进行过滤,如下图输入array,会过滤出类名是array的相关数据。 1025 <br /> 1026 <img src="../figures/Jsmemory/Jsmemoryfilter.jpg" alt="GitHub Logo" /> 1027 </p> 1028 </div> 1029 1030 <script> 1031 window.onload = () => { 1032 let isDark = getURLParameter('dark'); 1033 let targetId = getURLParameter('targetId'); 1034 let isBack = getURLParameter('isBack'); 1035 if (isDark === 'true') { 1036 document.getElementById('body').setAttribute('style', 'background-color:#272C34;'); 1037 let header = document.getElementsByClassName('fontColor'); 1038 for (let i = 0; i < header.length; i++) { 1039 header[i].style.color = '#fff'; 1040 } 1041 let lightBackGround = document.getElementsByClassName('light'); 1042 for (let i = 0; i < lightBackGround.length; i++) { 1043 lightBackGround[i].style.backgroundColor = '#32373F'; 1044 } 1045 } 1046 function getURLParameter(name) { 1047 return (new URL(document.location)).searchParams.get(name); 1048 } 1049 1050 if ( targetId !== null ) { 1051 let targetElement = document.getElementById(targetId); 1052 targetElement.scrollIntoView({ behavior: 'smooth' }); 1053 } 1054 }; 1055 </script> 1056 </body> 1057</html> 1058