日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Java 8 Update 20 的新特性 —— 字符串去重

瀏覽:29日期:2022-09-06 14:45:03

字符串在任何應用中都占用了大量的內存。尤其數包含獨立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]則列出了有多少對去重的請求由于負載被丟棄,這也是開銷減少機制中的一部分。

那么,字符串去重和字符串駐留相比又有什么差別呢?我博客上有一篇文章,名叫how great String Interning is for memory efficiency 。事實上,字符串去重和駐留看起來差不多,除了暫留的機制重用了整個字符串實例,而不僅僅是字符數組。

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

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

原文地址:https://blog.codecentric.de/en/2014/08/string-deduplication-new-feature-java-8-update-20-2/

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
欧美日韩四区| 不卡av一区二区| 亚州欧美在线| 日韩高清一区| 久久精品99久久久| 欧美激情视频一区二区三区免费 | 一区二区精品伦理...| 精品国产一区二区三区av片| 久久精品三级| 国产精品原创| 自拍日韩欧美| 午夜亚洲福利| 国产精品久久久久久久久久白浆 | 国产一区二区亚洲| 日韩免费一区| 亚洲精品网址| 一二三区精品| 国产精品一区2区3区| 久久av网站| www在线观看黄色| 波多野结衣一区| 日韩专区在线视频| 国产精品久久久久久久久久久久久久久| 麻豆免费精品视频| 亚洲综合在线电影| 国产一级一区二区| 国产欧美日本| 日韩欧美不卡| 蜜桃久久av一区| 免费看久久久| 精品中文字幕一区二区三区av| 国产综合婷婷| 日本少妇精品亚洲第一区| 国产精品久久久久久久久久齐齐| 国产videos久久| 日韩视频在线一区二区三区| 日本亚洲最大的色成网站www| 麻豆一区二区在线| 午夜电影亚洲| 国产精品网址| 性欧美xxxx免费岛国不卡电影| 亚洲区第一页| 精品国产乱码久久久久久樱花| 国产韩日影视精品| 久久国产人妖系列| 成人免费电影网址| 婷婷成人av| 在线天堂中文资源最新版| 激情久久婷婷| 日本欧美一区二区| 日韩不卡免费高清视频| 亚洲人成在线影院| 欧美成人a交片免费看| 亚洲精品在线二区| 欧美成人a交片免费看| 综合亚洲色图| 亚洲成人不卡| 国产亚洲精品美女久久久久久久久久| 美女一区网站| 欧美一区影院| 精品在线播放| 国产专区精品| 亚洲另类av| 国产精品福利在线观看播放| 免费成人在线观看| 播放一区二区| 久久超碰99| 天堂成人免费av电影一区 | 日韩综合小视频| 日本高清不卡一区二区三区视频| 日韩激情综合| 欧美另类专区| 国产理论在线| 日韩二区三区在线观看| 91九色精品国产一区二区| 精品伊人久久| 日本va欧美va欧美va精品| 日韩欧美另类一区二区| 国产欧美亚洲一区| 水蜜桃久久夜色精品一区的特点| caoporn视频在线| 国产日产精品_国产精品毛片| 欧美特黄视频| 久久高清免费| 国产拍在线视频| 欧美91在线| 国产视频网站一区二区三区| 另类国产ts人妖高潮视频| 91看片一区| 成人午夜毛片| 国产精品视频首页| 日韩欧美中文在线观看| 91久久久精品国产| 亚洲精品永久免费视频| 国产免费av国片精品草莓男男| 免费成人在线视频观看| 久久久久91| 最近高清中文在线字幕在线观看1| 国产精品久久久久9999高清| 日韩精品成人在线观看| 亚洲毛片视频| 亚洲毛片在线免费| 久久亚洲精品伦理| 国产精品呻吟| 国产精品日韩久久久| 日韩视频在线一区二区三区| 亚洲天堂黄色| 久久精品卡一| 久久九九99| 久久久一二三| 久久蜜桃资源一区二区老牛| 久久久一本精品| 999久久久亚洲| 一区二区三区视频免费观看| 久久精品亚洲人成影院 | 亚洲特色特黄| 欧美影院三区| 91精品二区| 久久一级电影| 欧美丝袜一区| 中文久久精品| 亚洲免费毛片| 日韩精品国产精品| 欧美日本一区| 国产精品久久久久久久免费软件| 国产欧美成人| 精品国产a一区二区三区v免费| 国产福利电影在线播放| 人在线成免费视频| 欧美亚洲国产精品久久| 一区在线免费| 综合欧美亚洲| 国产欧美午夜| 国产欧美激情| 精品一区二区三区的国产在线观看| 国产一区二区三区四区大秀| 国产精品成人一区二区不卡| 天堂√8在线中文| 韩国三级一区| 尤物网精品视频| 亚洲人成网77777色在线播放| 亚洲精品欧洲| 国产精品v日韩精品v欧美精品网站| 久久国产日韩欧美精品| 欧美精品第一区| 91亚洲国产高清| 影视先锋久久| 一本一道久久a久久| 亚洲精品观看| 国产欧美日韩视频在线 | 精品中文字幕一区二区三区av| 999在线观看精品免费不卡网站| 水蜜桃久久夜色精品一区的特点 | 视频一区二区三区在线| 日韩一二三区在线观看| 国产精品免费不| av资源中文在线| 欧洲激情综合| 日韩一区网站| 国产精品传媒麻豆hd| 特黄毛片在线观看| 美国欧美日韩国产在线播放| 国产精品美女久久久久久不卡| 国产成人精品一区二区免费看京| 99精品视频在线| 日韩影院免费视频| 欧美激情亚洲| 久久久精品五月天| 亚洲精品少妇| 91一区二区| 午夜在线视频观看日韩17c| 国产美女亚洲精品7777| 精品日韩视频| 亚洲尤物av| 国产精品videosex极品| 久久精品国产68国产精品亚洲| 免费视频久久| 麻豆精品av| 91成人超碰| 国产日韩欧美三区| 欧美日韩精品免费观看视完整| 亚洲深夜福利在线观看| 欧美国产精品| 一本一本久久| 精品资源在线| 鲁大师影院一区二区三区| 开心激情综合| 蜜臀久久99精品久久久画质超高清 | 久热综合在线亚洲精品| 国产精品久久久免费| 欧美亚洲在线日韩| 国产精品一区免费在线| 欧美福利在线| 久久字幕精品一区| 免费人成黄页网站在线一区二区| 超碰在线99| 日韩精品视频在线看| 亚洲午夜精品久久久久久app| 国产精品久久久一区二区| 亚洲资源av|