Java面试通关宝典(三)

小编:艳芬 1150阅读 2020.09.11

面试题精选

1.说说你知道的Java中的垃圾回收算法

在介绍垃圾回收算法之前,有必要先说一下JVM中是怎样定义“垃圾”的,或者说对象达到什么条件会被标记为“垃圾”进而被回收。JVM中标记对象已死的常见算法有2种:引用计数算法可达性分析算法(也叫根搜索算法)。

引用计数算法是指给每个对象分配一个引用计数器,每当有一个地方引用它时,计数器的值就加1,每当一个引用失效时,计数器就减去1,当某个对象的引用计数器的值为1时,表示该对象不会再被使用,因此可以被垃圾回收器回收。引用计数法的缺点是很难解决对象之间的循环引用问题。

可达性分析算法是指通过一系列被称为“GC Roots”的对象作为起始点,当一个对象到GC Roots没有任何引用链时,则说明该对象不可达,可以被垃圾回收器回收。

接下来介绍下Java中常见的垃圾回收算法,分别有以下几种:标记清除算法复制算法标记整理算法分代收集算法

标记清除算法的思想很简单,首先标记所有需要被回收的对象,然后对被标记的对象统一进行回收。其缺点是清除之后会产生不连续的内存碎片,当内存碎片太多时可能在需要分配大对象时,无法找到足够的连续内存而触发新的垃圾回收动作。

复制算法是将内存划分成大小相等的两块,每次只使用其中一块。当其中一块内存用完了,就将还存活的对象复制到另外一块上面,再一次性将已使用过的内存空间清理掉。这样的好处是不会出现内存碎片,缺点则是有一半的内存被闲置。

标记整理算法与标记清除算法类似,首先也是对待回收对象进行标记,然后将存对象移动到另一端,接着清除掉边界以外的内存。其好处是不需要进行较多的复制,也不会产生较多的内存碎片。

分代收集算法是把JVM内存分成不同的区域,然后根据每个区域的特点使用不同的垃圾回收算法进行垃圾回收。在新生代,由于对象的存活时间较短,只有少量的对象存活,因此采用复制算法只需要复制少量对象即可完成垃圾收集。而老年代由于对象存活率高,没有额外的空间进行担保,所以采用标记清理或标记整理算法进行回收。

2.Java中有哪些引用类型?

Java中有4种引用类型,分别是强引用软引用弱引用虚引用

强引用是最普遍的引用,像“Object obj=new Object()”之类的引用就是强引用,只要对象存在强引用,则垃圾回收器不会回收该对象。

软引用是用来描述一些有用但不是必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出之前,会将这些对象列入回收范围进行第二次回收。

弱引用也是用来描述非必需对象的,但其强度比软引用更弱一些。当垃圾回收器工作回收垃圾时,无论当前内存是否足够,弱引用关联着的对象都会被回收掉。

虚引用也叫幽灵引用,其是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象的实例。为一个对象设置虚引用关联的目的是能在这个对象被垃圾回收器回收时收到一个系统通知。

问题延伸:谈谈软引用和弱引用有哪些应用场景?

关联标签: