JDK1.8移除永久代

內容來自:CSDN博主服務器

1.8中-XX:PermSize 和 -XX:MaxPermSize 已經失效,取而代之的是一個新的區域 —— Metaspace(元數據區)。數據結構

在 JDK 1.7 及以往的 JDK 版本中,Java 類信息、常量池、靜態變量都存儲在 Perm(永久代)裏。類的元數據和靜態變量在類加載的時候分配到 Perm,當類被卸載的時候垃圾收集器從 Perm 處理掉類的元數據和靜態變量。固然常量池的東西也會在 Perm 垃圾收集的時候進行處理。架構

JDK 1.8 的對 JVM 架構的改造將類元數據放到本地內存中,另外,將常量池和靜態變量放到 Java 堆裏。HotSopt VM 將會爲類的元數據明確分配和釋放本地內存。在這種架構下,類元信息就突破了原來 -XX:MaxPermSize 的限制,如今能夠使用更多的本地內存。這樣就從必定程度上解決了原來在運行時生成大量類的形成常常 Full GC 問題,如運行時使用反射、代理等。工具

分配本地內存發給類元數據在一個稱爲「塊」的數據結構上,不一樣類元數據將會用不一樣大小的塊存放。每一個塊與一個類加載器相關聯,而且全部被這個類加載器加載的類元數據在這個塊下分配的空間存儲元數據。不一樣的應用塊的大小將會不一樣,塊大小的分配將會被內部碎片和外部碎片所限制。當類加載器再也不使用,全部和這個類加載器相關聯的塊空間將會被釋放。spa

 

若是服務器內存足夠,升級到 JDK 1.8 修改 JVM 參數最簡單的辦法就是將 -XX:PermSize 和 -XX:MaxPermSize 參數替換爲 -XX:MetaspaceSize 和 -XX:MaxMetaspaceSize,由於如今裏面只存元數據信息了,給它個大的空間確定沒問題。不過堆得空間由於如今要多存儲原來在永久代的常量池和靜態變量可能須要稍微擴大些。具體能夠根據 GC 日誌,和 $JAVA/bin 下的工具作一些權衡和調優。.net

相關文章
相關標籤/搜索