Java8新特征之字符串去重引見。本站提示廣大學習愛好者:(Java8新特征之字符串去重引見)文章只能為提供參考,不一定能成為您想要的結果。以下是Java8新特征之字符串去重引見正文
8月19日,Oracle宣布了JDK 8u20,JDK 8u20包括許多新特征,好比Java編譯器更新、支撐在運轉時經由過程API來修正MinHeapFreeRatio和MaxHeapFreeRatio參數、新的GC調優指南文檔。不外在浩瀚新特征中,最使人等待的還屬字符串去重(String Deduplication )。若何削減內存占用一向是一個永久的話題,而在Java運用中,常常會看到String對象會占用運用30%的內存,它是Java中最經常使用的對象之一。新的字符串去重特征可以贊助削減運用中String對象的內存占用,今朝該特征只實用於G1渣滓搜集器,而且默許不被開啟。
Fabian Lange說明了字符串去重特征的完成方法:
渣滓搜集器會在拜訪String對象時對其字符數組停止標志,並將String的哈希值和弱援用保留到一個數組中。當渣滓搜集器發明另外一個具有雷同哈希值的String對象時,它就會逐字符比對這兩個對象。假如他們完整婚配,那個中一個String就會被修正指向到另外一個String的字符數組。因為第一個字符數組曾經不再被援用,所以它也便可以被收受接管了。渣滓搜集器會盡可能削減全部操作的開支,好比某個String對象掃描未發明有反復,那接上去的一段時光內它不會再被檢討。
緊接著,Fabian Lange經由過程代碼的方法說明了字符串去重特征的奇異後果。起首應用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異常而停止運轉。在應用參數 -XX:+UseStringDeduplication -XX:+PrintStringDeduplicationStatistics開啟字符串去重特征後,法式可以多運轉一段時光。經由過程JVM的日記也能夠具體懂得全部去重進程的具體信息。請讀者自行測試。
最初,Fabian Lange還說明了字符串去重與字符串駐留的差別,它們很類似,除字符串駐留重用了全部的String實例,而字符串去重只是針對String的字符數組。
(全文完)