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()”之类的引用就是强引用,只要对象存在强引用,则垃圾回收器不会回收该对象。
软引用是用来描述一些有用但不是必需的对象。对于软引用关联着的对象,在系统将要发生内存溢出之前,会将这些对象列入回收范围进行第二次回收。
弱引用也是用来描述非必需对象的,但其强度比软引用更弱一些。当垃圾回收器工作回收垃圾时,无论当前内存是否足够,弱引用关联着的对象都会被回收掉。
虚引用也叫幽灵引用,其是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象的实例。为一个对象设置虚引用关联的目的是能在这个对象被垃圾回收器回收时收到一个系统通知。
问题延伸:谈谈软引用和弱引用有哪些应用场景?
相关推荐
- 21道最新Java面试题剖析(数据库+JVM+微服务+高并发) 1、Map 的底层结构?(HashMap)评注:老题目了,各位面试的人员必须熟记!回答:Map是以键值对来存储对象的,它的底层实际上是数组和链表来组成的,经典的一张图如下(别人画的);当使用put方法时,先查找出数组位置是否存在对象,通过key.hashcode对数组长度取余…
- 整理+学习《Java面试题全集(上)》 1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面:抽象:抽象是将一类对象的共同特征总结出来构造类的过程,包括数据抽象和行为抽象两方面。抽象只关注对象有哪些属性和行为,并不关注这些行为的细节是什么。继承:继承是从已有类得到继承…
- 3DMAX提示和技巧 本主题标识使用 Civil View 的一些重要提示和技巧。常规使用屏幕分辨率至少为 1280x1024 的 Civil View。低于此分辨率时,一些面板将占用过多屏幕空间。 将视口设置为线框显示以达到最佳性能。 要尽可能简化用户界面,请在单个视口中工作并关闭 3ds Max 命令面…