程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java8新特征之字符串去重引見

Java8新特征之字符串去重引見

編輯:關於JAVA

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的字符數組。

(全文完)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved