一、背景

1.1 永久代(PermGen)在哪里?

根據(jù),hotspot jvm結(jié)構(gòu)如下(虛擬機(jī)棧和本地方法棧合一起了):

移動開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

上圖引自網(wǎng)絡(luò),但有個(gè)問題:方法區(qū)和heap堆都是線程共享的內(nèi)存區(qū)域。

關(guān)于方法區(qū)和永久代:

在HotSpot JVM中,這次討論的永久代,就是上圖的方法區(qū)(JVM規(guī)范中稱為方法區(qū))。《Java虛擬機(jī)規(guī)范》只是規(guī)定了有方法區(qū)這么個(gè)概念和它的作用,并沒有規(guī)定如何去實(shí)現(xiàn)它。在其他JVM上不存在永久代。

1.2 JDK8永久代的廢棄

JDK8 永久代變化如下圖:

移動開發(fā)培訓(xùn),Android培訓(xùn),安卓培訓(xùn),手機(jī)開發(fā)培訓(xùn),手機(jī)維修培訓(xùn),手機(jī)軟件培訓(xùn)

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,原文截?。?/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而做出的努力,因?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ū)主

網(wǎng)友評論