亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Java > 正文

Java中字符串去重的特性介紹

2019-11-26 15:06:34
字體:
來源:轉載
供稿:網友

字符串在任何應用中都占用了大量的內存。尤其數包含獨立UTF-16字符的char[]數組對JVM內存的消耗貢獻最多――因為每個字符占用2位。

內存的30%被字符串消耗其實是很常見的,不僅是因為字符串是與我們互動的最好的格式,而且是由于流行的HTTP API使用了大量的字符串。使用Java 8 Update 20,我們現在可以接觸到一個新特性,叫做字符串去重,該特性需要G1垃圾回收器,該垃圾回收器默認是被關閉的。

字符串去重利用了字符串內部實際是char數組,并且是final的特性,所以JVM可以任意的操縱他們。


對于字符串去重,開發者考慮了大量的策略,但最終的實現采用了下面的方式:

無論何時垃圾回收器訪問了String對象,它會對char數組進行一個標記。它獲取char數組的hash value并把它和一個對數組的弱引用存在一起。只要垃圾回收器發現另一個字符串,而這個字符串和char數組具有相同的hash code,那么就會對兩者進行一個字符一個字符的比對。

如果他們恰好匹配,那么一個字符串就會被修改,指向第二個字符串的char數組。第一個char數組就不再被引用,也就可以被回收了。

這整個過程當然帶來了一些開銷,但是被很緊實的上限控制了。例如,如果一個字符未發現有重復,那么一段時間之內,它會不再被檢查。


那么該特性實際上是怎么工作的呢?首先,你需要剛剛發布的Java 8 Update 20,然后按照這個配置: -Xmx256m -XX:+UseG1GC 去運行下列的代碼:
 

public class LotsOfStrings {  private static final LinkedList<String> LOTS_OF_STRINGS = new LinkedList<>();  public static void main(String[] args) throws Exception {  int iteration = 0;  while (true) {   for (int i = 0; i < 100; i++) {    for (int j = 0; j < 1000; j++) {     LOTS_OF_STRINGS.add(new String("String " + j));    }   }   iteration++;   System.out.println("Survived Iteration: " + iteration);   Thread.sleep(100);  } }}

這段代碼會執行30個迭代之后報OutOfMemoryError。

現在,開啟字符串去重,使用如下配置去跑上述代碼:

-Xmx256m -XX:+UseG1GC -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics

此時它已經可以運行更長的時間,而且在50個迭代之后才終止。

JVM現在同樣打印出了它做了什么,讓我們一起看一下:

 

[GC concurrent-string-deduplication, 4658.2K->0.0B(4658.2K), avg 99.6%, 0.0165023 secs]  [Last Exec: 0.0165023 secs, Idle: 0.0953764 secs, Blocked: 0/0.0000000 secs]   [Inspected:     119538]     [Skipped:       0( 0.0%)]     [Hashed:     119538(100.0%)]     [Known:        0( 0.0%)]     [New:       119538(100.0%)  4658.2K]   [Deduplicated:    119538(100.0%)  4658.2K(100.0%)]     [Young:       372( 0.3%)   14.5K( 0.3%)]     [Old:       119166( 99.7%)  4643.8K( 99.7%)]  [Total Exec: 4/0.0802259 secs, Idle: 4/0.6491928 secs, Blocked: 0/0.0000000 secs]   [Inspected:     557503]     [Skipped:       0( 0.0%)]     [Hashed:     556191( 99.8%)]     [Known:       903( 0.2%)]     [New:       556600( 99.8%)   21.2M]   [Deduplicated:    554727( 99.7%)   21.1M( 99.6%)]     [Young:       1101( 0.2%)   43.0K( 0.2%)]     [Old:       553626( 99.8%)   21.1M( 99.8%)]  [Table]   [Memory Usage: 81.1K]   [Size: 2048, Min: 1024, Max: 16777216]   [Entries: 2776, Load: 135.5%, Cached: 0, Added: 2776, Removed: 0]   [Resize Count: 1, Shrink Threshold: 1365(66.7%), Grow Threshold: 4096(200.0%)]   [Rehash Count: 0, Rehash Threshold: 120, Hash Seed: 0x0]   [Age Threshold: 3]  [Queue]   [Dropped: 0]

為了方便,我們不需要自己去計算所有數據的加和,使用方便的總計就可以了。

上面的代碼段規定執行了字符串去重,花了16ms的時間,查看了約 120 k 字符串。


上面的特性是剛推出的,意味著可能并沒有被全面的審視。具體的數據在實際的應用中可能看起來有差別,尤其是那些應用中字符串被多次使用和傳遞,因此一些字符串可能被跳過或者早就有了hashcode(正如你可能知道的那樣,一個String的hash code是被懶加載的)。

在上述的案例中,所有的字符串都被去重了,在內存中移除了4.5MB的數據。

[Table]部分給出了有關內部跟蹤表的統計信息,[Queue]則列出了有多少對去重的請求由于負載被丟棄,這也是開銷減少機制中的一部分。

那么,字符串去重和字符串駐留相比又有什么差別呢?事實上,字符串去重和駐留看起來差不多,除了暫留的機制重用了整個字符串實例,而不僅僅是字符數組。


JDK Enhancement Proposal 192的創造者的爭論點在于開發者們常常不知道將駐留字符串放在哪里合適,或者是合適的地方被框架所隱藏.就像我寫的那樣,當碰到復制字符串(像國家名字)的時候,你需要一些常識.字符串去重,對于在同一個JVM中的應用程序的字符串復制也有好處,同樣包括像XML Schemas,urls以及jar名字等一般認為不會出現多次的字符串.

當字符串駐留發生在應用程序線程中的時候,垃圾回收異步并發處理時,字符串去重也不會增加運行時的消耗.這也解釋了,為什么我們會在上面的代碼中發現Thread.sleep().如果沒有sleep會給GC增加太多的壓力,這樣字符串去重根本就不會發生.但是,這只是示例代碼才會出現的問題.實際的應用程序,常常會在運行字符串去重的時候使用幾毫秒的時間.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品成人国产乱一区| 美日韩在线视频| 91香蕉电影院| 欧美激情视频一区二区三区不卡| 成人精品一区二区三区电影免费| 国产美女久久精品香蕉69| 国产日韩在线看| 国产一区二区三区视频免费| 色综合导航网站| 国产精品直播网红| 日韩专区在线播放| 国产精品91在线观看| 91禁外国网站| 国产精品久久av| 在线观看精品自拍私拍| 欧美在线国产精品| 日韩欧美国产免费播放| 91av视频在线| 成人免费网站在线| 国产精品揄拍一区二区| 91精品国产成人| 韩国视频理论视频久久| 日韩最新av在线| 夜夜嗨av色一区二区不卡| 日韩中文字幕精品视频| 国产成人精品av| 91免费国产网站| 欧美在线视频观看免费网站| 亚洲自拍av在线| 456亚洲影院| 欧美主播福利视频| 国产日韩欧美一二三区| 久久久久日韩精品久久久男男| 亚洲自拍中文字幕| 国产精品久久999| 日韩电影中文 亚洲精品乱码| 96pao国产成视频永久免费| 国产精品激情自拍| 亚洲美女喷白浆| 国产综合福利在线| 国模吧一区二区| 国产综合福利在线| 亚洲一级免费视频| 成人欧美一区二区三区黑人孕妇| 中文字幕亚洲欧美一区二区三区| 国产免费观看久久黄| 精品久久在线播放| 欧美性猛交xxxx乱大交| 日韩av在线看| 国产mv免费观看入口亚洲| 亚洲三级免费看| 91九色国产社区在线观看| 久久国产加勒比精品无码| 国产日韩欧美视频| 亚洲色图激情小说| 日韩av手机在线观看| 午夜免费在线观看精品视频| 久久99国产综合精品女同| 成人黄色中文字幕| 国产成人精品免费视频| 精品动漫一区二区| 亚洲色图五月天| 国产精品自拍网| 亚洲欧美国产精品久久久久久久| 精品国产一区久久久| 亚洲人成啪啪网站| 成人网欧美在线视频| 久久精品国产精品| 国产精品福利网| 久久久久久尹人网香蕉| 欧美久久精品午夜青青大伊人| 国产精品女主播| 久久精品国产欧美激情| 8090理伦午夜在线电影| 亚洲电影免费观看高清完整版| 欧美孕妇毛茸茸xxxx| 欧美日韩性生活视频| 日韩中文字幕欧美| 欧美亚洲在线视频| 精品夜色国产国偷在线| 亚洲欧美综合v| 欧美黑人国产人伦爽爽爽| 日韩成人中文字幕在线观看| 日产精品久久久一区二区福利| 亚洲成人免费网站| 国产一区二区三区在线观看视频| 亚洲美女视频网| 国产欧美日韩亚洲精品| 欧美亚洲免费电影| 欧美激情欧美激情| 日韩av片电影专区| 国产成人福利夜色影视| 国产精品91免费在线| 91伊人影院在线播放| 久久91亚洲精品中文字幕| 亚洲女人天堂av| 成人欧美一区二区三区黑人孕妇| 久久香蕉国产线看观看av| 懂色aⅴ精品一区二区三区蜜月| 精品福利在线看| 国产精品中文久久久久久久| 亚洲老头同性xxxxx| 日韩在线观看免费全| 日韩欧美精品中文字幕| 欧美亚洲国产另类| 国产精品精品视频| 久久频这里精品99香蕉| 777精品视频| 8050国产精品久久久久久| 久热精品视频在线观看一区| 久久久免费观看视频| 成人久久18免费网站图片| 亚洲在线免费看| 亚洲欧美激情一区| 亚洲欧美精品中文字幕在线| 精品美女永久免费视频| 精品国产精品三级精品av网址| 国产香蕉精品视频一区二区三区| 狠狠躁夜夜躁久久躁别揉| 日韩电影大全免费观看2023年上| 亚洲一区二区三区sesese| 亚洲第一精品夜夜躁人人爽| 亚洲一区二区在线| 91午夜理伦私人影院| 日韩乱码在线视频| 91精品视频免费看| 国语自产偷拍精品视频偷| 久久久av亚洲男天堂| 久久91亚洲人成电影网站| 久久久久中文字幕| 在线播放国产一区中文字幕剧情欧美| 国产欧美精品日韩| 国产午夜精品全部视频在线播放| 欧美电影在线免费观看网站| 国产在线观看不卡| 国产精品私拍pans大尺度在线| 欧美在线观看视频| 欧美在线视频免费播放| 久久免费少妇高潮久久精品99| 欧洲成人在线视频| 亚洲欧美国产制服动漫| 欧美日韩国产成人在线观看| 97精品在线观看| 欧美成人免费小视频| 国产精品久久电影观看| 91免费看视频.| 欧美专区日韩视频| 欧美激情一区二区三区在线视频观看| 992tv成人免费影院| 日韩精品有码在线观看| 日韩欧美aⅴ综合网站发布| 欧美高清电影在线看| 亚洲人精品午夜在线观看| 91精品国产91久久久| 亚洲二区中文字幕| 日韩免费高清在线观看| 国产精品91在线观看| 少妇激情综合网| 亚洲天堂av图片| 国产精品色婷婷视频| 爱福利视频一区| 91香蕉嫩草神马影院在线观看| 久久久久久久91| 中文字幕视频一区二区在线有码|