JVM垃圾收集机制

来源:互联网 发布:vue.js配合什么ui框架 编辑:程序博客网 时间:2024/06/05 17:18

问题汇总:什么地方需要垃圾收集?哪些对象是要被回收的?垃圾回收算法有哪些?垃圾回收过程?主流的垃圾收集器?
问题一、什么地方需要垃圾收集?
答:JVM的五个内存模型,其中虚拟机栈(堆栈)、程序计数器、本地方法栈,随着线程的销毁而销毁。垃圾收集的主要是堆
和方法区。
问题二、哪些是要被回收的?
答:哪些对象要被回收是垃圾收集算法要面对的问题。主要通过两种方法来判断,引用计数法,根搜索法
1、引用计数法:根据程序中对该对象的引用计数,每添加一个对该对象的引用计数增加1,如果计数为0
说明此对象已经成为垃圾回收的对象。缺点:无法解决循环引用
2、根搜索法:内存中包括一系列被称为“GC Root”的对象,从这些节点开始搜索,经过的路径成为引用链。如果某个对象到
GC Root没有引用链,则这个对象成为垃圾回收的对象。现在主要使用的。
有资格成为“GC Root”的对象有哪些?(1)、虚拟机栈引用的对象(2)、方法区中类属性引用的对象(3)、方法区中常量引用的对象(4)、本地方法栈中JNI本地方法引用的对象。
方法区中可回收类的条件有哪些?(1)、堆中的所有实例对象都被回收(2)、对应的类加载器也被回收(3)、对应的Class对
象没有被使用,也无法引用到。
问题三、垃圾回收算法有哪些?
答:1、标记—清除:将要回收的对象进行标记,然后清除。缺点:大量的内存碎片
2、复制算法:将内存分为两部分,一部分存放新建的对象,领一部分存放垃圾回收存活的对象。垃圾回收时,将存活的对象,
从一部分直接复制到另一部分,然后将该部分全部清理。使用范围:回收时存活对象较少。
3、标记—整理:将存活的对象进行标记并全部整理到内存一端,然后清除边界的所有对象。优点:解决了出现大量内存碎片的
问题。
4、分代收集:将堆内存分为新生代、老年代。将新生代分为Eden、survivor、survivor。默认比例8:1:1。根据不同区域
的特点,每个区域采用不同的垃圾收集算法。新生代的对象存活率较低,使用复制算法进行垃圾收集。老年代的对象存活率较
高,使用标记整理或标记清除算法。
问题四、垃圾回收过程?
答:当Eden空间不够存放新创建的对象时,进行min-GC,将存活的对象复制到一个survivor中。接下来出现min-GC时,如果该survivor空间足够,则直接堆积在这个地方。当该空间survivor不够时,将eden和该survivor存活的对象复制到另一个surv
ivor中。重复上述步骤,当survivor的空间不够时,使用空间担保,将eden区存活的对象存放到老年代。对于新创建的对象,一般放在eden区域。大对象直接放到老年代,防止eden区域和survivor区域大量的内存拷贝,影响效率。对于survior空间长期存活的对象进入老年代。当老年代空间不足时,进行full-gc的垃圾回收,如果回收之后空间仍旧不够,则抛出堆溢出。
问题五、主流的垃圾收集器?
答、垃圾收集器是垃圾收集算法的体现,sun的JVM版本是HotSpot,使用分代收集算法。新生代使用复制收集算法,实现的垃
圾器包括新生代串行收集器,新生代并行收集器。老年代使用标记清除、标记整理算法,包括垃圾收集器有老年代串行收集器
(标记整理)、老年代并行收集器(标记整理)、CMS(标记清除)。前面是垃圾收集器组合的形式存在进行垃圾回收,从JDK1.7开始,使用G1最新的垃圾收集器,既可以在新生代也可以在老年代使用。使用标记整理收集算法。

0 0
原创粉丝点击