扫码关注公众号

JVM虚拟机之垃圾回收机制和标记
11-28
34观看
01

java中如何判断对象是否是垃圾?

引用计数:在对象中添加一个引用计数器,如果被引用计数器加1,引用失效时计数器减1,如果计数器为0则被标记为垃圾。原理简单,效率高,但是在Ja

来自:jvm虚拟机相关-垃圾回收算法
02

下列对JVM垃圾回收的描述,不正确的是()

正确答案是CC是移动算法,不是复制算法,不需要额外空间1.标记清除执行GC的两次标记过程,被标记的对象,将会被清除。但是随之而来又有相应的问题,算法执行的效率不高,而且重点是清除之后会产生内部碎片,如上图所示,黑色部分被回收之后,产生了一些碎片,这样在分配内存给大对象的时候,无法找到足够的内存,而又要触发收集动作。2.复制首先在使用时候,将内存分为两块AB,回收后将A部分所有的存活对象移动到B,将A空闲出来。这种操作解决了碎片的问题,但也暴露出相应的弊端,比如说空间的浪费,在使用的时候将储存空间一分为二,内存优势大打折扣,一次GC触发之前只能用一半内存来工作。另一个显而易见的问题就是,当对象很多的时候,逐个复制去调整位置,也是个大问题。3.标记整理将对象标记之后,全部存活的对象向一端移动,然后清理掉存活对象边界以外的内存。4.分代收集这种方法内存空间分为了老年代和新生代,老年代的特点就是其中的对象不怎么被回收,而新生代的特点就是其中的对象要经常被回收,在老年代,由于对象回收量较小,所以一般采用标记整理算法。在新生代,由于对象回收量较大,所以一般采用复制算法。但是也不是说一定要付出复制算法的超高代价,因为实际应用中,一般将新生代划分为一块大的Eden和两块小的Survivor空间,每次使用一块Eden和一块Survivor,当回收时,把所有的存活对象Copy到另一块Survivor上,其余的空间全清理,然后继续使用这块Survivor和Eden来进行操作。

来自:jvm虚拟机相关-垃圾回收算法
03

如果JVM内触发新生代GC,如果存活对象总量大于survivor区容量,以下说法正确的是()

正确答案是B这道题考查的是JVM堆结构里的数据存放和垃圾回收机制首先要了解堆结构,分为新生代(包含Eden区和两个Survivor区)、老年代和元空间,如图A的错误在于不会直接清空Survivor区域,而是整理空间,大对象提升到年老代B是正确的C的错误是MinorGC只是在新生代内部或者新生代和老年代之间发生的回收,如果超出老年代就是MajorGC

来自:jvm虚拟机相关-垃圾回收算法
04

对象死亡(被回收)前的最后一次挣扎(百度面试题)

通过可达性分析,那些不可达的对象并不是立即被销毁,他们还有被拯救的机会。如果要回收一个不可达的对象,要经历两次标记过程。首先是第一次标记,并判断对象是否覆写了finalize方法,如果没有覆写,则直接进行第二次标记并被回收。如果对象在finalize()方法中重新与引用链建立了关联关系,那么将会逃离本次回收,继续存活。方法区如何判断是否需要回收方法区主要回收的内容有:废弃常量和无用的类。对于废弃常量也可通过引用的可达性来判断,但是对于无用的类则需要同时满足下面3个条件:①该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例;②加载该类的ClassLoader已经被回收;③该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

来自:jvm虚拟机相关-垃圾回收算法
05

常用的垃圾回收算法(百度面试题)

1、标记-清除算法标记-清除算法采用从根集合(GCRoots)进行扫描,对存活的对象进行标记,标记完毕后,再扫描整个空间中未被标记的对象,进行回收,此算法一般没有虚拟机采用。优点1:解决了循环引用的问题优点2:与复制算法相比,不需要对象移动,效率较高,而且还不需要额外的空间不足1:每个活跃的对象都要进行扫描,而且要扫描两次,效率较低,收集暂停的时间比较长。不足2:产生不连续的内存碎片2、复制算法将内存分成两块容量大小相等的区域,每次只使用其中一块,当这一块内存用完了,就将所有存活对象复制到另一块内存空间,然后清除前一块内存空间。这样一来就不容易出现内存碎片的问题。1、复制的代价较高,所以适合新生代,因为新生代的对象存活率较低,需要复制的对象较少;2、需要双倍的内存空间,而且总是有一块内存空闲,浪费空间3、标记-整理算法思想:在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。不会产生内存碎片,但是依旧移动对象的成本。4、分代收集算法分代收集算法是目前大部分JVM的垃圾收集器采用的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(TenuredGeneration)和新生代(YoungGeneration),在堆区之外还有一个代就是永久代(PermanetGeneration)。老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。内存被分为下面三个区域:①新生代:Enden、formsurvicorspace、tosurvivorspace。②老年代③永久代:方法区

来自:jvm虚拟机相关-垃圾回收算法
课程
专栏
java语言-jvm虚拟机相关-垃圾回收算法
3专栏
1课程
5 试题