8. 方法区
8.1 方法区的基本理解
- 方法区(Method Area)与Java堆一样,是各个线程共享的内存区域。
- 方法区在JVM启动的时候被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的。
- 方法区的大小,跟堆空间一样,可以选择固定大小或者可扩展。
- 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:
java.lang.outOfMemory PermGen space
或者java.lang.outOfMemoryError: Metaspace
- 关闭JVM就会释放这个区域的内存。
JDK8放弃永久代的概念,使用JRockit的元空间来代替。元空间不再虚拟机设置的内存中,而是使用本地内存
8.2 方法区的大小的设置与OOM
-
jdk7及以前:
- 通过
-XX:PermSize
来设置永久代初始分配空间。默认值是20.75M -XX:MaxPernSize
来设定永久代最大可分配空间。32位机器默认是64M,64位机器模式是82M- 当JVM加载的类信息容量超过了这个值,会报异常outOfMemoryError:PermGenspace。
- 通过
-
jdk8及以后:
- 元数据区大小可以使用参数
-XX:MetaspaceSize
和-XX
- 元数据区大小可以使用参数