方法区概述

首先先来说说 方法区 的作用。

方法区

方法区,是用来存放有关 类、方法 信息的一块逻辑上的区域。也就说,人们想规划出一块区域,用来存储类 方法 相关信息。

除此之外,还用来存储常量、静态变量,以及一些代码缓存等数据。

想想,这些数据都有什么特点。

几乎不变;不怎么依赖于对象,独立。

方法区的故事

关于方法区,有很多的故事 和 混乱。方法区、永久代、元空间都跟他有着故事。

故事的缘由是由历史和部分概念不清晰导致的。

我们之前说到,方法区 只是一个逻辑上的概念。

具体的实现,叫做 永久代 和 元空间。

永久代是 JDK 8 之前的实现。

元空间是 JDK 8 及其之后的实现。

方法区 只是 逻辑上的功能区域概念,永久代 和 元空间 才是在 JVM 中具体的实现。

永久代

永久代,是 JDK 8 之前的实现。永久代,顾名思义,永久存在的,也就是说不怎么需要进行 垃圾回收。

从我们之前对 方法区 的特点,可以知道,方法区内的数据,的确应该长久存在。

但是,当初在设计的时候,永久代存在一个问题。

可以看到,之前的 永久代 受到限定的内存大小限制,很容易发生内存溢出。

通常使用PermSize和MaxPermSize设置永久代的大小就决定了永久代的上限,但是不是总能知道应该设置为多大合适, 如果使用默认值很容易遇到OOM错误。

元空间

在 JDK8 之后,取消了 永久代,改为 元空间。元空间 位于本地内存,也就是说 只要系统内存足够大,就不会发生溢出。

当使用元空间时,可以加载多少类的元数据就不再由MaxPermSize控制, 而由系统的实际可用空间来控制。

原文地址:https://www.cnblogs.com/zhouzhiyao/p/13186253.html