String效能最佳化

來源:互聯網
上載者:User

標籤:

 String 使用的最佳化建議

 

其他 String 使用的最佳化建議

以上我們描述了在我們的大量文本分析案例中調用 String 的 subString方法導致記憶體消耗的問題,下面再列舉一些其他將導致記憶體浪費的 String 的 API 的使用:

String 拼接的方法選擇

在拼接靜態字串時,盡量用 +,因為通常編譯器會對此做最佳化,如:

 String test = "this " + "is " + "a " + "test " + "string"

編譯器會把它視為:

 String test = "this is a test string"

在拼接動態字串時,盡量用 StringBuffer 或 StringBuilder的 append,這樣可以減少構造過多的臨時 String 對象。

String 構造的方法選擇

常見的建立一個 String 可以用賦值操作符"=" 或用 new 和相應的建構函式。初學者一定會想這兩種有何區別,舉例如下:

 String a1 = “Hello”;  String a2 = new String(“Hello”);

第一種方法建立字串時 JVM 會查看內部的緩衝池是否已有相同的字串存在:如果有,則不再使用建構函式構造一個新的字串,直接返回已有的字串執行個體;若不存在,則分配新的記憶體給新建立的字串。

第二種方法直接調用建構函式來建立字串,如果所建立的字串在字串緩衝池中不存在則調用建構函式建立全新的字串,如果所建立的字串在字串緩衝池中已有則再拷貝一份到 Java 堆中。

儘管這是一個簡單明顯的例子,然而在實際項目中編程者卻不那麼容易洞察因為這兩種方式的選擇而帶來的效能問題。

使用建構函式 string() 帶來的記憶體效能隱患和緩解

仍然以之前的從 csv 檔案中截取 String 為例,先前我們通過用 new String() 去除返回的 String 中附帶的原始 String 的方法最佳化了 subString導致的記憶體消耗問題。然而,當我們下意識地使用 newString去構造一個全新的字串而不是用賦值符來建立(重用)一個字串時,就導致了另一個潛在的效能問題,即:重複建立大量相同的字串。說到這裡,您也許會想到使用緩衝池的技術來解決這一問題,大概有如下兩種方法:

方法一,使用 String 的 intern()方法返回 JVM 對字串緩衝池裡相應已存在的字串引用,從而解決記憶體效能問題,但這個方法並不推薦!原因在於:首先,intern() 所使用的池會是 JVM 中一個全域的池,很多情況下我們的程式並不需要如此大範圍的緩衝;其次,intern() 所使用的是 JVM heap 中 PermGen 相應的地區,在 JVM 中 PermGen 是用來存放裝載類和建立類執行個體時用到的中繼資料。程式運行時所使用的記憶體絕大部分存放在 JVM heap 的其他地區,過多得使用 intern()將導致 PermGen 過度增長而最後返回 OutOfMemoryError,因為垃圾收集器不會對被緩衝的 String 做記憶體回收。所以我們建議使用第二種方式。

方法二,使用者自己構建緩衝,這種方式的優點是更加靈活。建立 HashMap,將需緩衝的 String 作為 key 和 value 存放入 HashMap。假設我們準備建立的字串為 key,將 Map cacheMap 作為緩衝池,那麼返回 key 的代碼如下:

 private String getCacheWord(String key) {      String tmp = cacheMap.get(key);      if(tmp != null) {             return tmp;      } else {              cacheMap.put(key, key);              return key;      }  }
 

回頁首

結束語

本文通過一個實際項目中遇到的因使用 String 而導致的效能問題講述了 String 在 JVM 中的儲存結構,String 的 API 使用可能造成的效能問題以及解決方案。相信這些建議能對處理大文本分析的朋友有所協助,同時希望文中提到的某些最佳化方法能被舉一反三的應用在其他有關 String 的效能最佳化的場合。

String效能最佳化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.