什么是full GC
先说一下结论,Full GC这个概念是没有官方定义的,而且含义还特别混乱,在不同地方表达的含义是不同的,需要就不同的场景分别进行讨论。
Full GC为一次特殊GC行为的描述,这次GC会回收整个堆的内存,包含老年代,新生代,metaspace等,
方法区是一种规范
而永久代,元空间是它的具体实现
jdk8以前方法区的实现叫做永久代,这个永久代里包含了这样几部分内容:它可以存储类的信息(也就是类里面的成员变量,成员方法,构造器,还有类加载器),还有一块叫运行时常量池,常量池里有一个比较重要的就是我们通常俗称叫串池的东西,它正式的名称叫StringTable(字符串表名)。
jdk8使用元空间作为方法区的实现,这个元空间里会存储类,类加载器,常量池的信息,不过它已经不占用我们的堆内存了,换句话说它已经不是由jvm来管理它的内存结构了,它已经被移出到本地内存当中,本地内存就是操作系统内存
stringTable它不再放在方法区的实现里(元空间),它被移到了堆里面
永久代会发生垃圾回收
而1.7以前的jdk采用的是永久代作为方法区的实现,在1.7及以前的jdk版本,永久代的空间不足也会导致fullGC,
1.7以前,永久代空间如果设小了,就会触发整个堆的一次full
GC(注意是触发堆的full GC),经过这样的一次定位就初步定位到了是由于永久代空间不足导致了堆的full GC
元空间不会发生垃圾回收
1.8以后由于改成了元空间,它的垃圾回收就不是由java来控制了,元空间的默认情况下内存空间是使用的操作系统的内存空间,所以空间的容量是比较充裕的,不会发生元空间的空间不足问题。