9.方法区
在jdk7及之前,习惯上把方法区称为永久代,jdk8之后,使用元空间取代了永久代。
本质上,方法区和永久代并不等价。
元空间的本质与永久代类似,都是对JVM规范中方法区的实现。不过元空间与永久代最大的区别在于:元空间不在虚拟机设置的内存中,而是使用本地内存。
永久代元空间二者不只是名字变了,内存结构也调整了。
JDK7: OOM(PermGen space)
JDK8 : OOM(Metaspace)
- -XX:MetaspaceSize=10m
- -XX:MaxMetaspaceSize=10m
方法区存储什么?
用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等。
运行时常量池 VS 常量池
- 方法区,内部包含了运行时常量池。
- 字节码文件,内部包含了常量池。
- 要弄清楚方法区,需要理解清楚ClassFile,因为加载类的信息都在方法区。
- 要弄清楚方法区的运行时常量池,需要理解清楚ClassFile中的常量池。