激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 編程技術 - 通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

2022-01-10 22:52神光的編程秘籍神說要有光zxg 編程技術

Chrome Devtools 提供了 Memory 工具用于分析內存,包括 Snapshot、TimeLine、Sample 三種工具。

通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

JS 的字符串是怎么分配內存的?

可能大家都知道,字符串存在字符串常量池中,被棧或堆上的變量引用。如果變量的值是字符串字面量,則在棧上的變量直接引用字符串常量池中的字符串;如果是字符串是 new String 創建的,則會在堆上創建 String 對象,指向字符串常量池中的字符串,棧上變量指向堆中的 String 對象。

通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

這個結論是對的么?

今天我們用 Chrome Devtools 的 Memory 工具證明下:

Memory 工具證明 String 的內存分配方式

我們準備這樣一段代碼:

  1. <!DOCTYPE html> 
  2. <html lang="en"
  3. <head> 
  4.     <meta charset="UTF-8"
  5. </head> 
  6. <body> 
  7.  
  8.     <script> 
  9.         const arr = []; 
  10.         setTimeout(() => { 
  11.             for(let  i = 0;i< 10000;i++) { 
  12.                 arr.push('guang'); 
  13.             } 
  14.         }, 3000); 
  15.  
  16.         const arr2 = []; 
  17.         setTimeout(() => { 
  18.             for(let  i = 0;i< 10000;i++) { 
  19.                 arr2.push(new String('guang')); 
  20.             } 
  21.         }, 5000); 
  22.     </script> 
  23. </body> 
  24. </html> 

3s 的時候創建了一個 10000 個元素的數組 arr,數組元素是字符串常量 "guang"。

5s 的時候創建了一個 10000 個元素的數組 arr2,數組元素是 new String("guang")。

按照理論來說,arr 中的元素是直接引用字符串常量池的字符串,arr2 中的則是引用堆上的 String 對象,String 對象再引用字符串常量池的字符串。

我們用 Memory 工具來驗證下。

Chrome Devtools 提供了 Memory 工具用于分析內存中的對象:

一共有三種內存分析工具:

  • Snapshot:某個時間點的堆內存快照
  • TimeLine:實時的按照時間線顯示的內存分配情況
  • Sampling:采樣的方式收集內存分配情況

通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

我們想要看到按照時間線的實時分配情況,所以用第二種工具:TimeLine。

加載頁面,點擊錄制,右邊就會實時展示內存分配情況:

通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

我們錄到 6s 點擊停止。

通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

可以看到有兩條豎線,分別代表了兩次內存分配。

點擊第一次內存分配,可以看到詳情:

通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

可以看到,這個時間點創建了 string 和 array 兩種對象:

"guang" 這個 string 的內存地址是 @169541。

通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

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

通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

這就驗證了字符串常量池的存在,以及字符串字面量直接指向常量池中的字符串。

通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

再來看下第二種內存分配方式:

通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

可以看到,創建了 String 的對象、array 變量(system 是 JS 引擎內部分配的一些對象,不用關心):

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

通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

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

通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

這再一次驗證了字符串常量池的存在,以及 String 對象是在堆上分配內存,然后指向字符串常量池的字符串。

通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

證明完畢,確實如前面的結論所說:字符串存儲在字符串常量池中,字符串字面量直接指向常量池的字符串地址,String 對象會先在堆上分配空間,然后指向字符串常量池的字符串地址。

我們從始至終只創建了一次 "guang" 這個字符串,字符串常量池的好處顯而易見了:

而且,還可以得出一個結論,創建 String 對象的方式內存開銷大很多,建議用字符串字面量的方式:

通過 Chrome Devtools 的 Memory 工具證明 string 的內存分配方式

從圖中可以直觀的對比出兩種方式的占用內存的差別。

文中的測試代碼上傳到了 github: https://github.com/QuarkGluonPlasma/chrome-devtools-exercise

總結

Chrome Devtools 提供了 Memory 工具用于分析內存,包括 Snapshot、TimeLine、Sample 三種工具,我們用其中的 TimeLine 工具實時分析了字符串的內存分配,證明了字符串常量池的存在,以及字符串字面量、new String 兩種創建字符串方式的內存上的差別。

建議盡量用字符串字面量,少用 new String 的方式創建字符串,在占據的內存大小上還是有差距的。

證明過程中,我們也可以直觀的感受到字符串常量池的巨大好處。

原文鏈接:https://mp.weixin.qq.com/s/VucSMXz8tnNf_LyrXZLHsg

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天堂成人国产精品一区 | 中文字幕激情 | 黄色免费视频观看 | 成人性视频欧美一区二区三区 | 免费毛片观看 | 色婷婷av一区二区三区久久 | 成人短视频在线播放 | 成熟女人特级毛片www免费 | 国产精品久久久久久婷婷天堂 | 国产成人高清在线 | 狠狠干网站 | 日韩字幕在线观看 | 亚洲第一页综合 | 国产精品视频海角社区88 | 在线播放h| 12av毛片 | 成人444kkkk在线观看 | 久久综合网址 | 久久久久久艹 | 国产精品久久久久久久久久大牛 | 免费香蕉成视频成人网 | 日韩欧美动作影片 | 国产精品成人免费一区久久羞羞 | 国产成人免费高清激情视频 | 一级黄色免费观看视频 | 欧美黄色一区 | 久久精品亚洲欧美日韩精品中文字幕 | 在线中文日韩 | 国产精品视频一区二区三区四区国 | 久久久久亚洲精品 | 男人的天堂视频网站 | 超污视频在线看 | 九九热久久免费视频 | 久久99精品久久久久久236 | 色欲香天天天综合网站 | 杏美月av| 一级毛片在线免费播放 | 看免费黄色大片 | 久久久精品视频网站 | 午夜精品毛片 | 91短视频在线观看免费最新 |