您的位置:首页 > 编程语言 > Java开发

Java 虚拟机永久代的垃圾收集

2017-12-15 17:10 232 查看
永久代中的垃圾收集主要回收两个部分内容:

废弃常量和无用类

常量的回收: 当系统中没有任何常量对象引用常量池中的常量,也没有其他敌法引用这个字面量,如果发生内存回收,必要的话, 没有使用的常量将会被系统清理出常量池

什么叫做无用类:

判断一个类是否是无用类的条件有三个:

1,该类的所有实例都已经被回收,也就是Java堆中不存在该类的任何实例

2, 加载该类的class loader 已经被回收

3,该类对应的Java,lang,class 队形没有在任何地方被引用,无法在任何地方通过反射访问该类的方法

垃圾收集器算法:

标记 - 清除算法:

分为标记,清除两个阶段,首先标记出所有需要回收的对象,在标记完成后同意回收所有被标记的对象

复制算法:将可用的内存按照容量划分为大小相等的凉快。每次只使用其中的一块,当这一块的内存使用完了,将还存货的对象复制到另外一块上面,然后把已使用过的内存空间一次清理掉,这样每次都是堆整个半区进行内存回收。(新生代一般使用这种方式)

标记 整理算法 :同标记清除算法一样,但是后续的步骤不是直接堆可回收的对象进行清理,而是让存活的对象都向一端移动,然后直接清凉掉边界意外的内存

分代收集算法:

根据对象存活周期的不同将内存划分为几块,一般是把Java堆分为新生代和老年代,这又就可用根据各个年代的特点采用最适当的收集算法

在新生代中,每次垃圾收集的时候都发现有大批对象死去,只有少量存活,那就选择复制算法,只需要付出少量存活对象的复制成本就可用完成收集

老年代中因为对象存活率高,没有额外的空间对他进行分配担保,就必须使用 标记 清理,获取标记 整理算法来进行回收

新生代GC (Minor GC ) 指的是新生代的垃圾搜集动作,因为Java对象大多都具备招生熄灭的特性 ,所以新生代 GC 发生非常频繁,一般回收速度也比较快

老年代 GC (Magir /full GC ) 在老年代的GC 出现了Major GC 经常会伴随至少一次的Minorr

GC (但并不是绝对的 ) 一般来说 老年代GC 比新生代GC 满2 10 倍以上
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: