Java面试通关宝典(三)

前言

在之前的文章《Java面试通关宝典(一)》和《Java面试通关宝典(二)》中,沉思君为大家介绍了部分常见的面试题,涵盖Java基础、web基础和多线程,如果看了参考答案还有疑问的朋友,可以申请进群探讨,进群方式请见文末。好了,废话不多说,接下来我们继续探讨更多有趣的面试题。

面试题精选

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3.聊聊你熟悉的设计模式?

这是开放性的题目,只需要将常见的几种设计模式说清楚就行了。具体可以详见沉思君往期文章:《聊聊设计模式之单例模式(下)》、《聊聊设计模式之模板方法模式》、《聊聊设计模式之代理模式》。

4.如何进行MySQL索引优化?

关于这个话题,沉思君在往期文章里有所提及,可以点击文章链接进行阅读:《聊聊Mysql优化之索引优化》、《谈谈Mysql索引优化不得不提防的坑》。

本文分享自微信公众号 - 编程沉思录(code-thinker)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-09

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏后台开发+音视频+ffmpeg

redis跳跃表源码详解

跳跃表是一种有序的数据结构,他通过在每个节点中维护多个指向其它节点的指针,从而达到快速访问节点的目的。跳跃表的查找操作平均时间复杂度为o(logN)。在大部分情...

78750
来自专栏互联网大杂烩

腾讯面试

时间:2017年3月5号 这次面试和之前的面试差不多,一开始聊项目。聊了项目之后就问基础了,项目的话就不说了。

8720
来自专栏鸿的学习笔记

python源码阅读笔记之对象体系(一)

10320
来自专栏空帆船w

Java的强引用,软引用,弱引用,虚引用及其使用场景

从 JDK1.2 版本开始,Java 把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引...

40820
来自专栏Vamei实验室

Java进阶10 内存管理与垃圾回收

整个教程中已经不时的出现一些内存管理和垃圾回收的相关知识。这里进行一个小小的总结。 Java是在JVM所虚拟出的内存环境中运行的。内存分为栈(stack)和堆(...

23570
来自专栏cmazxiaoma的架构师之路

关于牛客网的JAVA面试题错题总结以及归纳(1)

15930
来自专栏向治洪

java的四种引用类型

java的引用分为四个等级:4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。 ⑴强引用(StrongReference) 强引用是使用最普遍的引用。...

21750
来自专栏xingoo, 一个梦想做发明家的程序员

精度计算-大数乘小数

语法:mult(char c[],char t[],int m); 参数:   c[]: 被乘数,用字符串表示,位数不限   t[]: 结果,用字符串表示   ...

25460
来自专栏个人分享

JAVA 几种引用类型学习

1、对象的强、软、弱和虚引用     在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(re...

37520
来自专栏Java后端技术栈

Java虚拟机之垃圾收集器(5)

(1)Java 内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈三个区域随线程而生,随线程而灭;栈中的栈帧随着方法的进入和退出而有条不紊地执行着出...

8340

扫码关注云+社区

领取腾讯云代金券