方法区(落地实现jdk7永久代,jdk8元空间),元空间并不在虚拟机中,而是使用本地内存,它和堆在逻辑上是连续的,但在物理上是不连续的,所以也叫非堆。
1、此区域是线程共享的
。储存已加载的类型信息、常量、静态变量、即时编译器编译后的代码等数据;
2、常量池:编译器生成的各种字面量和符号引用;
3、关于字符串常量池和运行时常量池的位置说明:
JDK版本 | 方法区实现 | 变化 |
---|---|---|
jdk1.6 | 永久代 | 字符串常量池、运行时常量池、静态变量都是在永久代中 |
jdk1.7 | 永久代 | 字符串常量池和静态变量被移动到了堆当中,运行时常量池还是在永久代中 |
jdk1.8 | 元空间 | 字符串常量池和静态变量仍然在堆当中;运行时常量池、类型信息、常量、字段、方法被移动都了元空间中 |
4、元空间的好处:
① 减少报OOM的可能:元空间与永久代类似,本质区别是元空间并不占用虚拟机内存了,而是使用本地内存,由于本地内存一般是比较大的,所以方法区就没有那么容易报OOM(OutOfMemoryError)。
② 提高JVM性能:元空间的垃圾回收很少,一