方法区(下)
方法区使用举例
public class MethodAreaDemo {
public static void main(String[] args){
int x=500:
int y 100:
int a =x/y;
int b=50
System. out. println(a b)
}
}
方法区的演进细节
首先要明确的一个点,只有Hotspot才有永久代,BEA JRockit 、IBM、J9等都没有这个概念。
Hotspot中方法区的变化
永久代为什么要被元空间取代
1、因为永久代很难设置适合的空间大小
在某些场景下,如果动态加载类过多,容易产生Perm的OOM。而元空间并不在虚拟机中,而是使用本地内存,默认情况下,元空间的大小仅仅受本地内存限制。
2、对永久代进行调优是很困难的
String Table为什么要调整
jdk7中将 Stringtable放到了堆空间中。因为永久代的回收效率很低,在full gc的时候才会触发。
而full gc是老年代的空间不足、永久代不足时才会触发。
这就导致 Stringtable回收效率不高。而我们开发中会有大量的字符串被创建,回收效率低,导致永久代内存不足。放到堆里,能及时回收内存。
方法区的垃圾收集
般来说这个区域的回收效果比较难令人满意,尤其是类型的卸载,条件相当苛刻。但是这部分区域的回收有时又确实是必要的。
方法区的垃圾收集主要回收两部分内容:常量池中废弃的常量和不再使用的类型。