Java8移除永久代并引入元空間,主要是為了解決 PermGen 固定大小、容易導致內存溢出、GC 效率低的問題。元空間使用本地內存,具備更靈活的內存分配能力,提升了垃圾收集和內存管理的效率。
PermGen 的局限性
①固定大小:永久代的內存空間大小在 JVM 啟動時是固定的,容易出現 內存溢出(OutOfMemoryError),尤其是在動態加載大量類時。
②類和方法的存儲限制:永久代用于存放類的元數據(類信息、方法等),其容量受限,導致某些應用特別是在大量動態生成類或使用大量第三方庫時,容易出現內存管理問題。
③GC 效率低:永久代內大部分存放的類的元數據是都是被使用的,不是垃圾對象,因此無法被回收,回收的效率很低。
Metaspace 的改進
①使用本地內存:元空間使用的是本地內存(Native Memory),而不是 JVM 的堆內存,這樣使得內存的分配更加靈活,避免了 PermGen 固定大小帶來的局限性。
②自動調整大小:元空間可以根據應用的需要自動擴展大小,從而降低了出現 OutOfMemoryError 的風險,提升了內存使用的靈活性和效率。
③性能提升:元空間(在堆外)減少了 GC 對類元數據的影響,避免了頻繁回收 PermGen 時的停頓,改善了JVM 的整體性能。