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-&gt;D-&gt;F&gt;E,distance为4,从A-&gt;D-&gt;E,distance为3;从B-&gt;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-&gt;B-&gt;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