概述
方法区是一块独立于堆的内存空间,逻辑上属于堆的一部分。
- 于堆空间一样,是各个线程共享的一个区域
- 启动时由JVM创建,实际内存空间与堆一样,可以是不连续的物理内存空间
- 方法区主要就是用来储存类信息,方法区的大小决定了可以保存多少个类。过多的类定义将会导致OOM(JDK之前是OOM:PermGen space,JDK之后是OOM:Metaspace,JDK7之前叫永久代,JDK8开始叫元空间)
- JDK8之前的永久代使用的是运行时数据区的内存,所以容易OOM,JDK8开始使用本地内存,称之为元空间。
- 元空间使用的是本地内存,JDK8之前使用的是JVM的内存。
- JDK6静态变量存在于永久代中,JDK7后字符串常量池、静态变量从永久代移到了堆中。
- JDK8之后没有永久代,类信息、方法信息等保存在元空间MetaSpace,字符串常量池、静态变量仍然在堆中。