成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JDK9對(duì)String字符串的新一輪優(yōu)化,不可不知

開發(fā) 后端
隨著JDK的迭代String字符串的內(nèi)存結(jié)構(gòu)及方法等也在不斷地進(jìn)行演變。這是因?yàn)镾tring字符串往往是JVM中占用內(nèi)存最多的類,通過對(duì)它的改造升級(jí),對(duì)性能的提升會(huì)更加明顯。

 [[386182]]

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

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

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

String的底層存儲(chǔ)

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

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

 

  1. public final class String 
  2.     implements java.io.Serializable, Comparable<String>, 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. }     

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

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

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

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

  1. public final class String 
  2.     implements java.io.Serializable, Comparable<String>, 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ù)組,而且新增了一個(gè)coder的成員變量。

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

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

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

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

COMPACT_STRINGS屬性則是用來控制是否開啟String的compact功能。默認(rèn)情況下是開啟的。可以使用-XX:-CompactStrings參數(shù)來對(duì)此功能進(jìn)行關(guān)閉。

改進(jìn)的好處

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

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

小結(jié)

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

 

責(zé)任編輯:武曉燕 來源: 程序新視界
相關(guān)推薦

2010-06-11 14:46:38

可路由協(xié)議

2020-04-16 14:16:26

網(wǎng)絡(luò)攻擊APT34惡意軟件

2020-11-30 13:12:04

Linux文本命令

2015-01-15 09:34:28

2015-07-13 15:55:26

互聯(lián)網(wǎng)

2009-07-15 09:19:45

2010-10-27 10:39:44

求職

2014-06-20 14:35:48

浪潮數(shù)據(jù)

2019-08-18 23:10:14

數(shù)據(jù)科學(xué)算法數(shù)學(xué)

2021-01-27 09:45:17

負(fù)載均衡

2015-07-30 17:30:43

Linux命令

2020-01-17 06:12:10

物聯(lián)網(wǎng)IOT技術(shù)

2024-03-21 08:57:39

語言軟件開發(fā)

2020-11-11 21:27:55

緩沖文件調(diào)用

2010-04-16 17:09:18

Oracle查看鎖

2025-01-03 17:10:54

2018-06-12 11:05:33

2019-12-02 14:14:20

緩沖系統(tǒng)調(diào)用函數(shù)

2014-06-09 13:21:27

2013-01-15 14:13:05

UbuntuAndroid
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久综合九色综合欧美狠狠 | 伊人无码高清 | 日韩精品在线一区 | 亚洲精品久久国产高清情趣图文 | 少妇久久久 | 91激情视频 | 亚洲 欧美 日韩 精品 | 国产精品精品3d动漫 | 在线观看黄色大片 | 亚洲高清在线 | 国产一级片精品 | 中文字幕av色 | 国产精品入口麻豆www | 亚洲一区二区三区在线 | 97久久国产| 狠狠久 | 日韩2020狼一二三 | 中文字幕在线观看视频一区 | 精品欧美一区二区三区久久久 | 精品一区二区三区在线观看 | 日韩三级电影在线看 | 日韩中文字幕 | 亚洲天堂av网 | 欧美日韩高清 | 久久机热 | 欧洲视频一区二区 | 九九视频网| 成人一区二区三区在线观看 | 久久99视频 | 精品美女久久久久久免费 | 精品国产高清一区二区三区 | 亚洲国产精品99久久久久久久久 | 亚洲国产精品人人爽夜夜爽 | 一级黄色片日本 | 精品美女在线观看视频在线观看 | 99影视 | 国产目拍亚洲精品99久久精品 | 天天综合91 | 视频一区二区在线观看 | 暴草美女 | 美女亚洲一区 |