一、背景
1.1 永久代(PermGen)在哪里?
根據,hotspot jvm結構如下(虛擬機棧和本地方法棧合一起了):
上圖引自網絡,但有個問題:方法區(qū)和heap堆都是線程共享的內存區(qū)域。
關于方法區(qū)和永久代:
在HotSpot JVM中,這次討論的永久代,就是上圖的方法區(qū)(JVM規(guī)范中稱為方法區(qū))。《Java虛擬機規(guī)范》只是規(guī)定了有方法區(qū)這么個概念和它的作用,并沒有規(guī)定如何去實現它。在其他JVM上不存在永久代。
1.2 JDK8永久代的廢棄
JDK8 永久代變化如下圖:
1.新生代:Eden+From Survivor+To Survivor
2.老年代:OldGen
3.永久代(方法區(qū)的實現) : PermGen----->替換為Metaspace(本地內存中)
二、為什么廢棄永久代(PermGen)
2.1 官方說明
參照JEP122:http://openjdk.java.net/jeps/122,原文截?。?/p>
Motivation
This is part of the JRockit and Hotspot convergence effort. JRockit customers do not need to configure the permanent generation (since JRockit does not have a permanent generation) and are accustomed to not configuring the permanent generation.
即:移除永久代是為融合HotSpot JVM與 JRockit VM而做出的努力,因為JRockit沒有永久代,不需要配置永久代。
2.2 現實使用中易出問題
由于永久代內存經常不夠用或發(fā)生內存泄露,爆出異常java.lang.OutOfMemoryError: PermGen
三、深入理解元空間(Metaspace)
3.1元空間的內存大小
元空間是方法區(qū)的在HotSpot jvm 中的實現,方法區(qū)主