• 首页
  • 关于我们
  • 产品中心
  • 新闻资讯
  • 在线招聘
  • 联系我们
  • 新闻资讯

    你的位置:开云(中国)Kaiyun·官方网站 > 新闻资讯 > kaiyun官方网站 通过 Chrome Devtools 的 Memory 用具表现 string 的内存分拨形势

    kaiyun官方网站 通过 Chrome Devtools 的 Memory 用具表现 string 的内存分拨形势

    发布日期:2023-12-09 13:33    点击次数:77

    JS 的字符串是怎样分拨内存的?

    可能全球齐知说念,字符串存在字符串常量池中,被栈或堆上的变量援用。若是变量的值是字符串字面量,则在栈上的变量径直援用字符串常量池中的字符串;若是是字符串是 new String 创建的,则会在堆上创建 String 对象,指向字符串常量池中的字符串,栈上变量指向堆中的 String 对象。

    这个论断是对的么?

    今天咱们用 Chrome Devtools 的 Memory 用具表现下:

    Memory 用具表现 String 的内存分拨形势

    咱们准备这么一段代码:

    <!DOCTYPE kaiyun官方网站html> <html lang="en"> <head>     <meta charset="UTF-8"> </head> <body>      <script>         const arr = [];         setTimeout(() => {             for(let  i = 0;i< 10000;i++) {                 arr.push('guang');             }         }, 3000);          const arr2 = [];         setTimeout(() => {             for(let  i = 0;i< 10000;i++) {                 arr2.push(new String('guang'));             }         }, 5000);     </script> </body> </html> 

    3s 的时候创建了一个 10000 个元素的数组 arr,数组元素是字符串常量 "guang"。

    5s 的时候创建了一个 10000 个元素的数组 arr2,数组元素是 new String("guang")。

    按照表面来说,arr 中的元素是径直援用字符串常量池的字符串,arr2 中的则是援用堆上的 String 对象,String 对象再援用字符串常量池的字符串。

    咱们用 Memory 用具来考证下。

    Chrome Devtools 提供了 Memory 用具用于分析内存中的对象:

    一共有三种内存分析用具:

    Snapshot:某个本事点的堆内存快照 TimeLine:及时的按照本事线透露的内存分拨情况 Sampling:采样的形势网罗内存分拨情况

    咱们念念要看到按照本事线的及时刻拨情况,是以用第二种用具:TimeLine。

    加载页面,点击录制,右边就会及时展示内存分拨情况:

    咱们录到 6s 点击罢手。

    不错看到有两条竖线,划分代表了两次内存分拨。

    点击第一次内存分拨,不错看到笃定:

    不错看到,这个本事点创建了 string 和 array 两种对象:

    "guang" 这个 string 的内存地址是 @169541。

    Array 的元素指向的也齐是 @169541

    这就考证了字符串常量池的存在,以及字符串字面量径直指向常量池中的字符串。

    再来看劣等二种内存分拨形势:

    不错看到,创建了 String 的对象、array 变量(system 是 JS 引擎里面分拨的一些对象,无用着重):

    String 对象援用了字符串常量池中的 @169541 的字符串 "guang"

    而 Array 中的元素则是指向了不同的 String 对象的地址:

    这再一次考证了字符串常量池的存在,以及 String 对象是在堆上分拨内存,然后指向字符串常量池的字符串。

    表现收尾,确乎如前边的论断所说:字符串存储在字符串常量池中,字符串字面量径直指向常量池的字符串地址,String 对象会先在堆上分拨空间,然后指向字符串常量池的字符串地址。

    咱们从始至终只创建了一次 "guang" 这个字符串,字符串常量池的平正可想而知了:

    况兼,还不错得出一个论断,创建 String 对象的形势内存支拨大好多,提议用字符串字面量的形势:

    从图中不错直不雅的对比出两种形势的占用内存的离别。

    文中的测试代码上传到了 github: https://github.com/QuarkGluonPlasma/chrome-devtools-exercise

    转头

    Chrome Devtools 提供了 Memory 用具用于分析内存,包括 Snapshot、TimeLine、Sample 三种用具,咱们用其中的 TimeLine 用具及时刻析了字符串的内存分拨,表现了字符串常量池的存在,以及字符串字面量、new String 两种创建字符串形势的内存上的离别。

    提议尽量用字符串字面量,少用 new String 的形势创建字符串,在占据的内存大小上一经有差距的。

    表现进程中,咱们也不错直不雅的感受到字符串常量池的庞大平正。