其他內容

類型註解

java8裏面註解可以應用在任何地方。類型註解只是語法而不是語義,並不會影響java的編譯、加載以及運行時間。

類型註解被用來支持在Java的程序中做強類型檢查。 配合插件式的check-framework,可以在編譯的時候檢測出runtime error來提高代碼質量,這就是類型註解的作用了。

重複註解

允許在同一申明類型(類/屬性/方法)上多次使用同一個註解。@Repeatable指向註解XXX.class。

泛型的目標類型推斷

泛型是JavaSE1.5新特性。泛型的最大優點就是提供了程序的類型安全同時可以向後兼容,但尷尬的地方就是每次定義時都要寫明泛型的類型,這樣不僅感覺有些冗長,現在通過編譯器自動推斷泛型的參數類型,能夠減少這樣的情況並提高代碼可讀性。

JAVA7對此提出了簡化,例如:Map<String, String> myMap = new HashMap<>();但JAVA7只有構造器的參數化類型在上下文中被顯著的聲明瞭纔可以使用類型推斷,其他則不行。

針對JAVA7,JAVA8針對泛型的目標類型推斷主要有2個改進:

①支持通過方法上下文推斷泛型目標類型,而不侷限在構造方法上。

②支持在方法調用鏈路當中,泛型類型推斷傳遞到最後一個方法。

說白了,JAVA8根據代碼上下文來推斷其泛型的目標類型,不用再次指明。

精簡的JRE

該特性使得JAVA應用程序不需要整個JRE平臺即可部署和運行在小型設備上。可以基於目標硬件的可用資源選擇一個合適的JRE運行環境。

緊湊的JRE分3種:compact1、compact2、compact3,他們內涵API的數量關係是:compact1<compact2<compact3。

可以通過如下2個工具來判斷其最小JAR是哪類:

①javac –bootclasspath/javac –profile

②jdeps可以用來分析應用程序所依賴的profile, 有三個參數比較常用-p/-v/-r。

PermGen空間

java.lang.OutOfMemoryError: PermGen space,該問題往往是由類加載器相關的內存泄漏以及新類加載器的創建導致的。

PermGen space全稱是Permanent Generation space,是指內存的永久保存區域,這一部分用於存放Class和Meta的信息,當Class在被Load的時候被放入PermGen space區域, 它和和存放Instance的Heap區域不同,如果LOAD很多CLASS的話,就很可能出現PermGen space錯誤。

JDK8 JVM將移除永久區,使用計算機本地內存來存儲類元數據信息並稱之爲:元空間( Metaspace),總結如下:

①PermGen空間的狀況:這部分內存空間將全部移除。JVM的參數:PermSize和MaxPermSize 會被忽略並給出警告。

②Metaspace內存分配模型:大部分類元數據都在本地內存中分配。

③Metaspace容量:默認情況下,類元數據只受可用的本地內存限制(容量取決於是32位或是64位操作系統的可用虛擬內存大小) 。

新參數( MaxMetaspaceSize)用於限制本地內存分配給類元數據的大小。如果沒有指定這個參數,元空間會在運行時根據需要動態調整。

④Metaspace垃圾回收:對於僵死的類及類加載器的垃圾回收將在元數據使用達到“MaxMetaspaceSize”參數的設定值時進行。適時地監控和調整元空間對於減小垃圾回收頻率和減少延時是很有必要的。 持續的元空間垃圾回收說明,可能存在類、類加載器導致的內存泄漏或是大小設置不合適。

⑤Java堆內存的影響:一些雜項數據已經移到Java堆空間中。 升級到JDK8之後會發現Java堆空間有所增長。

⑥Metaspace 監控:元空間的使用情況可以從HotSpot1.8的詳細GC日誌輸出中得到。

StampedLock鎖

StampedLock控制鎖有三種模式(寫,讀,樂觀讀) ,一個StampedLock狀態是由版本和模式兩個部分組成, 鎖獲取方法返回一個數字作爲票據stamp, 它用相應的鎖狀態表示並控制訪問, 數字0表示沒有寫鎖被授權訪問。

在讀鎖上分爲悲觀鎖和樂觀鎖。所謂的樂觀讀模式,也就是若讀的操作很多,寫的操作很少的情況下,你可以樂觀地認爲,寫入與讀取同時發生機率很少, 因此不悲觀地使用完全的讀取鎖定, 程序可以查看讀取資料之後,是否遭到寫入執行的變更,再採取後續的措施。

StampedLock 對吞吐量有巨大的改進, 特別是在讀線程越來越多的場景下。StampedLock有一個複雜的API, 對於加鎖操作, 很容易誤用其他方法;

當只有少量競爭者的時候,synchronized是一個很好的通用的鎖實現;當線程增長能夠預估,ReentrantLock是一個很好的通用的鎖實現;

Base64

在JDK1.6之前,JDK核心類一直沒有Base64的實現類。JDK1.6中添加了另一個Base64的實現, javax.xml.bind.DatatypeConver
ter兩個靜態方法parseBase64Binary和 printBase64Binary,隱藏在javax.xml.bind包下面。

在Java8在java.util包下面實現了BASE64編解碼API且性能非常好。

Nashorn

支持JS腳本運行在JVM端,其主要是兩個方面:jjs工具以及javax.script包下面的API。jjs是在java_home/bin下面自帶。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章