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

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

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

服務器之家 - 編程語言 - Java教程 - JDK9對String字符串的新一輪優化

JDK9對String字符串的新一輪優化

2021-08-25 10:41程序新視界 Java教程

這篇文章主要介紹了JDK9對String字符串的新一輪優化,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

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

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

String的底層存儲

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

先來看一下String字符串的底層存儲結構:

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

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

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

底層存儲的優化

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

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

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

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

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

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

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

COMPACT_STRINGS屬性則是用來控制是否開啟String的compact功能。默認情況下是開啟的。可以使用-XX:-CompactStrings參數來對此功能進行關閉。

改進的好處

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

當內存減少之后,進一步導致減少GC次數,進而減少Stop-The-World的頻次,同樣會提升系統的性能。

小結

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

到此這篇關于JDK9對String字符串的新一輪優化的文章就介紹到這了,更多相關JDK9對String字符串優化內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/wo541075754/article/details/114552087

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 福利免费视频 | 亚洲一区二区三区日本久久九 | 香蕉国产片| 欧美h版电影在线观看 | 久久久久久久久久久综合 | 97青青 | 国内精品视频饥渴少妇在线播放 | 一级国产免费 | 一级黄色片在线看 | 热99视频| 一级做人爱c黑人影片 | 国产精品欧美久久久久一区二区 | 国产精品免费观在线 | 国产亚洲精品网站 | 久久国产亚洲精品 | 极品国产91在线网站 | 曰韩毛片 | 污污的视频在线观看 | 成人免费毛片一 | 操你逼 | 日日草视频| 亚洲人成网站免费播放 | 国产午夜精品久久久久婷 | 成人精品免费看 | 国产99一区二区 | 把娇妻调教成暴露狂 | 草b视频在线观看 | 国产精品久久久久国产精品三级 | 久久视讯 | 青青国产在线视频 | 91在线视频播放 | 久草在线精品观看 | 亚洲一区在线不卡 | 国产人妖一区二区 | 日韩av影片在线观看 | 男男成人高潮片免费视频欧美 | 国产精品夜色视频一级区 | 久久线视频 | 国产一级一区二区三区 | 久久精品2019中文字幕 | 欧美xxxxx视频 |