方法区(下)


方法区(下)

方法区使用举例

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回收效率不高。而我们开发中会有大量的字符串被创建,回收效率低,导致永久代内存不足。放到堆里,能及时回收内存。

方法区的垃圾收集

般来说这个区域的回收效果比较难令人满意,尤其是类型的卸载,条件相当苛刻。但是这部分区域的回收有时又确实是必要的

方法区的垃圾收集主要回收两部分内容:常量池中废弃的常量和不再使用的类型。

在这里插入图片描述

总结

在这里插入图片描述


文章作者: fFee-ops
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 fFee-ops !
评论
  目录