方法区(Method Area)基础知识
堆、栈、方法区堆关系
概述
-
方法区与堆区一样,是各个线程共享的内存区域
-
方法区在JVM启动时就会被创建,并且它的实际的物理内存空间中和Java堆区一样都可以是不连续的
-
方法区的大小,跟堆空间一样,可以选择固定大小或者可拓展
-
方法区的大小决定了系统可以保存多少个类,如果系统定义了太多的类,导致方法区溢出,虚拟机同样会抛出内存溢出错误:java.lang.OutOfMemoryError:PermGen space 或者 java.lang,OutOfMemoryError:Metaspace,比如:关闭JVM就会释放这个区域的内存
-
加载大量的第三方jar包
-
Tomcat部署的工程过多
-
大量动态生成反射类
-
-
在jdk7及以前,习惯上把方法区称为永久代,jdk8开始,使用元空间取代了永久代。元空间的本质和永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代最大的区别在于:元空间不再虚拟机设置的内存中,而是使用本地内存
-
本质上,方法区和永久代并不等价。仅是对hotSpot而言的。《java虚拟机规范》对如何实现方法区,不做统一要求。例如:BEA JRockit/IBM J9中不存在永久代的概念
-
使用永久代,会导致Java程序更容易OOM(超过-XX:MaxPermSize上限)
(Java7和Java8在方法区的实现)