規范和實現
針對Java虛擬機的實現有專門的《Java虛擬機規范》,在遵守規范的前提下,不同的廠商會對虛擬機進行不同的實現。 就好比開發的過程中定義了接口,具體的接口實現大家可以根據不同的業務需求進行實現。
PS:大家都有必要了解一下《Java虛擬機規范》,關注公眾號“程序新視界”,回復“002”獲得Java SE 7的虛擬機規范PDF版。
我們通常使用的Java SE都是由Sun JDK和OpenJDK所提供,這也是應用最廣泛的版本。而該版本使用的VM就是HotSpot VM。通常情況下,我們所講的java虛擬機指的就是HotSpot的版本。
永久代(PermGen)
上面理解了規范和實現之后,來看認識一個概念“永久代(Permanet Generation,也稱PermGen)”。對於習慣了在HotSpot虛擬機上開發、部署的程序員來說,很多都願意將方法區稱作永久代。
本質上來講兩者並不等價,僅因為Hotspot將GC分代擴展至方法區,或者說使用永久代來實現方法區。在其他虛擬機上是沒有永久代的概念的。也就是說方法區是規范,永久代是Hotspot針對該規范進行的實現。
理解上面的概念之后,我們對Java7及以前版本的堆和方法區的構造再進行一下變動。
再重復一遍就是對Java7及以前版本的Hotspot中方法區位於永久代中。同時,永久代和堆是相互隔離的,但它們使用的物理內存是連續的。
永久代的垃圾收集是和老年代捆綁在一起的,因此無論誰滿了,都會觸發永久代和老年代的垃圾收集。
但在Java7中永久代中存儲的部分數據已經開始轉移到Java Heap或Native Memory中了。比如,符號引用(Symbols)轉移到了Native Memory;字符串常量池(interned strings)轉移到了Java Heap;類的靜態變量(class statics)轉移到了Java Heap。
然后,在Java8中,時代變了,Hotspot取消了永久代。永久代真的成了永久的記憶。永久代的參數-XX:PermSize和-XX:MaxPermSize也隨之失效。
元空間(Metaspace)
對於Java8,HotSpots取消了永久代,那么是不是就沒有方法區了呢?當然不是,方法區只是一個規范,只不過它的實現變了。
在Java8中,元空間(Metaspace)登上舞台,方法區存在於元空間(Metaspace)。同時,元空間不再與堆連續,而且是存在於本地內存(Native memory)。
本地內存(Native memory),也稱為C-Heap,是供JVM自身進程使用的。當Java Heap空間不足時會觸發GC,但Native memory空間不夠卻不會觸發GC。
針對Java8的調整,我們再次對內存結構圖進行調整。
元空間存在於本地內存,意味着只要本地內存足夠,它不會出現像永久代中“java.lang.OutOfMemoryError: PermGen space”這種錯誤。看上圖中的方法區,是不是“膨脹”了。
默認情況下元空間是可以無限使用本地內存的,但為了不讓它如此膨脹,JVM同樣提供了參數來限制它使用的使用。
- -XX:MetaspaceSize,class metadata的初始空間配額,以bytes為單位,達到該值就會觸發垃圾收集進行類型卸載,同時GC會對該值進行調整:如果釋放了大量的空間,就適當的降低該值;如果釋放了很少的空間,那么在不超過MaxMetaspaceSize(如果設置了的話),適當的提高該值。
- -XX:MaxMetaspaceSize,可以為class metadata分配的最大空間。默認是沒有限制的。
- -XX:MinMetaspaceFreeRatio,在GC之后,最小的Metaspace剩余空間容量的百分比,減少為class metadata分配空間導致的垃圾收集。
- -XX:MaxMetaspaceFreeRatio,在GC之后,最大的Metaspace剩余空間容量的百分比,減少為class metadata釋放空間導致的垃圾收集。
永久代為什么被替換了
思考一下,為什么使用元空間替換永久代?
表面上看是為了避免OOM異常。因為通常使用PermSize和MaxPermSize設置永久代的大小就決定了永久代的上限,但是不是總能知道應該設置為多大合適, 如果使用默認值很容易遇到OOM錯誤。
當使用元空間時,可以加載多少類的元數據就不再由MaxPermSize控制, 而由系統的實際可用空間來控制。
更深層的原因還是要合並HotSpot和JRockit的代碼,JRockit從來沒有所謂的永久代,也不需要開發運維人員設置永久代的大小,但是運行良好。同時也不用擔心運行性能問題了,在覆蓋到的測試中, 程序啟動和運行速度降低不超過1%,但是這點性能損失換來了更大的安全保障。
參考連接:
https://mp.weixin.qq.com/s/UwrSOx4enEX9iNmD4q_dXg
https://cloud.tencent.com/developer/article/1546965