日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
JDK9對String字符串的新一輪優(yōu)化,不可不知

本文轉(zhuǎn)載自微信公眾號「程序新視界」,作者二師兄。轉(zhuǎn)載本文請聯(lián)系程序新視界公眾號。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站制作、做網(wǎng)站、河曲網(wǎng)絡(luò)推廣、小程序開發(fā)、河曲網(wǎng)絡(luò)營銷、河曲企業(yè)策劃、河曲品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供河曲建站搭建服務(wù),24小時服務(wù)熱線:18980820575,官方網(wǎng)址:www.cdcxhl.com

String類可以說是Java編程中使用最多的類了,如果能對String字符串的性能進行優(yōu)化,那么程序的性能必然能大幅提升。

這不JDK9就對String字符串進行了改進升級,在某些場景下可以讓String字符串內(nèi)存減少一半,進而減少JVM的GC次數(shù)。

String的底層存儲

在面試的時候我們通常會說String字符串有不可變的特性,每次都要創(chuàng)建新的字符串。那么,為什么String字符串是不可變的呢?

先來看一下String字符串的底層存儲結(jié)構(gòu):

 
 
 
  1. public final class String 
  2.     implements java.io.Serializable, Comparable, CharSequence { 
  3.      
  4.     private final char value[]; 
  5.  
  6.     public String() { 
  7.         this.value = "".value; 
  8.     } 
  9.  
  10.     public String(String original) { 
  11.         this.value = original.value; 
  12.         this.hash = original.hash; 
  13.     } 
  14.     // ... 
  15. }     

看到什么了?當我們new一個String對象時,對應(yīng)的字符串其實是以char數(shù)組的形式存儲在String對象內(nèi)部。而這個char數(shù)組是final的,也就是說不可變的。

這也就是為什么我們說String字符串擁有不可變的特性,當字符串改變了,char數(shù)組不可變,就只能創(chuàng)建一個新的對象,新的char數(shù)組了。

底層存儲的優(yōu)化

上面說的情況是JDK8及以前版本,到了JDK9,String中字符串的存儲不再用char數(shù)組了,改用byte數(shù)組。

 
 
 
  1. public final class String 
  2.     implements java.io.Serializable, Comparable, CharSequence { 
  3.  
  4.     @Stable 
  5.     private final byte[] value; 
  6.  
  7.     private final byte coder; 
  8.      
  9.     @Native static final byte LATIN1 = 0; 
  10.     @Native static final byte UTF16  = 1; 
  11.      
  12.     static final boolean COMPACT_STRINGS; 
  13.    
  14.     public String() { 
  15.         this.value = "".value; 
  16.         this.coder = "".coder; 
  17.     } 
  18.  
  19.     @HotSpotIntrinsicCandidate 
  20.     public String(String original) { 
  21.         this.value = original.value; 
  22.         this.coder = original.coder; 
  23.         this.hash = original.hash; 
  24.     } 
  25.      
  26.     // ... 

不僅將char數(shù)組改為byte數(shù)組,而且新增了一個coder的成員變量。

在程序中,絕大多數(shù)字符串只包含英文字母數(shù)字等字符,使用Latin-1編碼,一個字符占用一個byte。如果使用char,一個char要占用兩個byte,會占用雙倍的內(nèi)存空間。

但是,如果字符串中使用了中文等超出Latin-1表示范圍的字符,使用Latin-1就沒辦法表示了。這時JDK會使用UTF-16編碼,那么占用的空間和舊版(使用char[])是一樣的。

coder變量代表編碼的格式,目前String支持兩種編碼格式Latin-1和UTF-16。Latin-1需要用一個字節(jié)來存儲,而UTF-16需要使用2個字節(jié)或者4個字節(jié)來存儲。

據(jù)說這一改進方案是JDK的開發(fā)人員用大數(shù)據(jù)和人工能智能,調(diào)研了成千上萬的應(yīng)用程序的heapdump信息后,得出:大部分的String都是以Latin-1字符編碼來表示的,只需要一個字節(jié)存儲就夠了,兩個字節(jié)完全是浪費。

COMPACT_STRINGS屬性則是用來控制是否開啟String的compact功能。默認情況下是開啟的??梢允褂?XX:-CompactStrings參數(shù)來對此功能進行關(guān)閉。

改進的好處

改進的好處是非常明顯的,首先如果項目中使用Latin-1字符集居多,內(nèi)存的占用大幅度減少,同樣的硬件配置可以支撐更多的業(yè)務(wù)。

當內(nèi)存減少之后,進一步導(dǎo)致減少GC次數(shù),進而減少Stop-The-World的頻次,同樣會提升系統(tǒng)的性能。

小結(jié)

隨著JDK的迭代String字符串的內(nèi)存結(jié)構(gòu)及方法等也在不斷地進行演變。這是因為String字符串往往是JVM中占用內(nèi)存最多的類,通過對它的改造升級,對性能的提升會更加明顯。


網(wǎng)站名稱:JDK9對String字符串的新一輪優(yōu)化,不可不知
網(wǎng)站路徑:http://www.dlmjj.cn/article/dpicdjd.html