JVM:永久代 以及jdk1.8为什么将其移除?
生活随笔
收集整理的這篇文章主要介紹了
JVM:永久代 以及jdk1.8为什么将其移除?
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
永久代
在JDK8之前的HotSpot實現中,類的元數據如方法數據、方法信息(字節碼,棧和變量大小)、運行時常量池、已確定的符號引用和虛方法表等被保存在永久代中,32位默認永久代的大小為64M,64位默認為85M,可以通過參數-XX:MaxPermSize進行設置,一旦類的元數據超過了永久代大小,就會拋出OOM異常。
虛擬機團隊在JDK8的HotSpot中,把永久代從Java堆中移除了,并把類的元數據直接保存在本地內存區域(堆外內存),稱之為元空間。
把永久代從Java堆中移除了,并把類的元數據直接保存在本地內存區域(堆外內存)。這樣做有什么好處?
有經驗的同學會發現,對永久代的調優過程非常困難,永久代的大小很難確定,其中涉及到太多因素,如類的總數、常量池大小和方法數量等,而且永久代的數據可能會隨著每一次Full GC而發生移動。
而在JDK8中,類的元數據保存在本地內存中,元空間的最大可分配空間就是系統可用內存空間,可以避免永久代的內存溢出問題,不過需要監控內存的消耗情況,一旦發生內存泄漏,會占用大量的本地內存。
ps:JDK7之前的HotSpot,字符串常量池的字符串被存儲在永久代中,因此可能導致一系列的性能問題和內存溢出錯誤。在JDK8中,字符串常量池中只保存字符串的引用。詳情參見本博客JVM模塊這篇文章
總結
以上是生活随笔為你收集整理的JVM:永久代 以及jdk1.8为什么将其移除?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SIP协议和压力测试, SIP call
- 下一篇: JVM:gc什么时候开始?System.