【名词解析】
- 和java堆一样,方法区是一块所有线程共享的内存区域。
- 保存类的元数据,比如,类型信息,常量池,字段信息,方法信息,常量,静态变量等
- 方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出的错误
- jdk1.6和jdk1.7方法区可以理解为永久代。
- jdk1.8已经将方法区取消,替代的是元空间。元空间没有使用堆内存,而是与堆不相连的本地内存区域。所以,理论上系统可以使用的内存有多大,元空间就有多大,所以不会出现永久代存在时的内存溢出问题。
- jdk1.8的元数据区可以使用参数-XX:MaxMetaspaceSzie设定大小,这是一块堆外的直接内存,与永久区不同,如果不指定大小,默认情况下,虚拟机会耗尽可用系统内存
【参数设定】
- jdk1.6和jdk1.7的永久区可以使用参数-XX:PermSize 和-XX:MaxPermSize指定
- -XX:PermSize =5m 默认启动大小为5M
- -XX:MaxPermSize=64m 最大大小为64M
【异常】
- jdk1.8元数据区内存溢出:java.lang.OutOfMemoryError:Metaspace