一、背景

1.1 永久代(PermGen)在哪里?

根據,hotspot jvm結構如下(虛擬機棧和本地方法棧合一起了):

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

上圖引自網絡,但有個問題:方法區(qū)和heap堆都是線程共享的內存區(qū)域。

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

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

1.2 JDK8永久代的廢棄

JDK8 永久代變化如下圖:

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

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ū)主

網友評論