一、背景
1.1 永久代(PermGen)在哪里?
根據(jù),hotspot jvm結(jié)構(gòu)如下(虛擬機(jī)棧和本地方法棧合一起了):
上圖引自網(wǎng)絡(luò),但有個(gè)問題:方法區(qū)和heap堆都是線程共享的內(nèi)存區(qū)域。
關(guān)于方法區(qū)和永久代:
在HotSpot JVM中,這次討論的永久代,就是上圖的方法區(qū)(JVM規(guī)范中稱為方法區(qū))?!禞ava虛擬機(jī)規(guī)范》只是規(guī)定了有方法區(qū)這么個(gè)概念和它的作用,并沒有規(guī)定如何去實(shí)現(xiàn)它。在其他JVM上不存在永久代。
1.2 JDK8永久代的廢棄
JDK8 永久代變化如下圖:
1.新生代:Eden+From Survivor+To Survivor
2.老年代:OldGen
3.永久代(方法區(qū)的實(shí)現(xiàn)) : PermGen----->替換為Metaspace(本地內(nèi)存中)
二、為什么廢棄永久代(PermGen)
2.1 官方說明
參照J(rèn)EP122:http://openjdk.java.net/jeps/122,原文截取:
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而做出的努力,因?yàn)镴Rockit沒有永久代,不需要配置永久代。
2.2 現(xiàn)實(shí)使用中易出問題
由于永久代內(nèi)存經(jīng)常不夠用或發(fā)生內(nèi)存泄露,爆出異常java.lang.OutOfMemoryError: PermGen
三、深入理解元空間(Metaspace)
3.1元空間的內(nèi)存大小
元空間是方法區(qū)的在HotSpot jvm 中的實(shí)現(xiàn),方法區(qū)主