文章图片
解题思路如下。
- 第一题:线程、进程的区别和联系,主要从资源占用、切换效率、通信方式等方面进行解答;
- 第二题:线程的切换过程主要考察上下文切换,需要保存寄存器、栈等现场,需要由用户态切换到内核态。最后通过 vmstat 命令查看上下文切换的情况;
- 第三题:常用的 Linux 命令可以参考前面操作系统汇总提到的命令;
- 第四题、第五题,知识点详解中已经介绍过了,务必要掌握;
- 第六题:大致包括 DNS 解析、TCP 建连、HTTP 请求、HTTP 响应等,实际回答时,可以画个简单的交互图来说明。
文章图片
文章图片
解题思路如下所示。
- 第 1 题 Java 内存模型前面讲过,面试时回答这个问题时记得和面试官确认是希望回答 JVM 的内存模型,还是 Java 对内存访问的模型,不要答跑偏。
- 第 2 题要复习一下什么场景下会触发 FullGC,例如年轻代晋升时老年代空间不足,例如永久代空间不足等。
- 第 3~6 题前面已经有过讲解,因此不再重复。
文章图片
解题思路如下所示。
- 第 7 题 volatile 要重点回答强制主内存读写同步以及防止指令重排序两点。
- 第 8、9 题前面已经讲过。
- 第 10 题重点介绍出强、弱、软、虚四种引用,以及在 GC 中的处理方式。
- 第 11 题可以了解一下 Java 自带的几种工具的功能,例如 JMC 中的飞行记录器,堆分析工具 MAT,线程分析工具 jstack 和获取堆信息的 jmap 等。
文章图片
- 第 1 题如何实现一个生产者与消费者模型?可以尝试通过锁、信号量、线程通信、阻塞队列等不同方式实现。
- 第 4 题 wait 与 sleep 的有什么不同?回答的要点四个:
- wait 属于 Object 类,sleep 属于 Thread 类;
- wait 会释放锁对象,而 sleep 不会;
- 使用的位置不同,wait 需要在同步块中使用,sleep 可以在任意地方;
- sleep 需要捕获异常,而 wait 不需要。
- wait 属于 Object 类,sleep 属于 Thread 类;
- 第 6 题,读写锁适用于什么场景?可以回答读写锁适合读并发多,写并发少的场景,另外一个解决这种场景的方法是 copyonwrite。
真题第二部分如下,提供解题思路。
文章图片
- 第 7 题,线程之间如何通信?主要可以介绍一下 wait/notify 机制,共享变量的 synchronized 或者 Lock 同步机制等。
- 第 8 题,保证线程安全的方法有哪些?可以提 CAS、synchronized、Lock,以及 ThreadLocal 等机制。
- 第 9 题,如何尽可能提高多线程并发性能?可以从尽量减少临界区范围,使用 ThreadLocal,减少线程切换、使用读写锁或 copyonwrite 等机制这些方面来回答。
- 第 10 题,ThreadLocal 用来解决什么问题?ThreadLocal 是如何实现的?可以重点回答 ThreadLocal 不是用来解决多线程共享变量的问题,而是用来解决线程数据隔离的问题。
文章图片
- 第 1、2 题都是基础算法,必须要牢牢掌握,一些题目要记住递归与非递归的实现,例如树的遍历、快速排序等;
- 类似第 5 题这样的对使用内存进行限制的题目,要考虑使用分治思想进行分解处理;
- 第 6 题数组去重,可以有排序和 Hash 两种思路。
文章图片
- 第 9 题成语接龙,可以考虑使用深度优先搜索解决;
- 第 10 题寻找两节点公共祖先,可以考虑通过递归与非递归两种方式实现。
最后列出一些真题用于参考练习,如下。
文章图片
这些题目我前面基本都介绍过,就不再重复解答。推荐课后学习一下 JMC、BTrace、tcpdump、strace 等工具的使用。
文章图片
第 1 题,除了说出 SSH 框架是 Struct+Spring+Hibernate,SSM 是指的 Spring MVC+Spring+MyBatis,另外要重点说一下 SpringMVC 和 Struts 的区别,以及 MyBatis 和 Hibernate 的区别。
第 4 题,要答出是通过 BeanFactoryPostProcessor 后置处理器进行的占位符替换,如果自定义处理,可以扩展 PropertyPlaceholderConfigurer 或 PropertySourcesPlaceholderConfigurer 来实现。
第 5 题,大致可以分为:从 HandlerMapping 中查找 Handler、执行 Handler、执行完成给适配器返回 ModelAndView、视图解析、返回视图,这些步骤。建议通过调试来阅读源码,补充细节、增加理解。
第 6 题,可以从构造器循环依赖和 setter 循环依赖两部分来回答,构造器循环通过使用创建中 Bean 标示池,来判断是否产生了循环创建;setter 循环依赖通过引入 ObjectFactory 来解决。
文章图片
第 7 题,题目给出的就是执行顺序。
第 8 题,可以从 Channel、Socket、EventLoop、ChannelPipeline 等对象展开介绍。
第 9 题,可以从下面几方面回答:
- 使用方式,HTTP 使用 Client 方式进行远程调用,RPC 使用动态代理的方式实现远程调用;
- 请求模型,HTTP 一般会经过 DNS 解析、4?7 层代理等中间环节,而 RPC 一般是点对点直连;
- 服务治理能力,RPC 提供更加丰富的服务治理功能,例如熔断、负载均衡等;
- 语言友好性,HTTP 对跨语言服务之间交互更加友好。
真题汇总
本课时面试真题汇总如下,讲解其中重点。
文章图片
第 1~4 题前面都有提到,不再赘述。
第 5 题,可以从主从读写分离、多从库、多端口实例,以及 Cluster 集群部署来支持水平扩展等几方面回答,高可用可以回答用 Sentinel 来保证主挂掉时重新选主并完成从库变更。
第 6 题,可以使用 Redis 的 sorted set 来实现延时队列,使用时间戳做 Score,消费方使用 zrangbyscore 来获取指定延迟时间之前的数据。
- 简单场景下分布式锁可以使用 setnx 实现,使用 setnx 设置 key,如果返回 1 表示设置成功,即获取锁成功,如果返回 0 则获取锁失败。setnx 需要同时使用 px 参数设置超时时间,防止获取锁的实例宕机后产生死锁。
- 严格场景下,可以考虑使用 RedLock 方案。但是实现比较复杂。
真题汇总
最后将面试真题汇总如下。
文章图片
- 第 2 题,可以从消息的发送者保证投递到消息队列、消息对象自身的高可用、消费方处理完成后修改 offset 这三个方面来保证消息的可靠性。这个题目可以结合 Kafka 的消息发送同步、异步,消息可靠性配置来回答。
- 第 3 题可以从两个方面解决消息重复:一个是通过对消息处理实现幂等,消除消息重复的影响;另一个是使用 Redis 来进行消息去重,避免重复消息的处理。
- 第 4 题可以从创建索引、减少关联查询、优化 SQL 查询条件等方面展开。
- 第 6 题可以从 MySQL 调优部分讲解的相关原则这个角度来回答。
【高频面试题学习】
推荐阅读
- 人工智能|干货!人体姿态估计与运动预测
- 分析COMP122 The Caesar Cipher
- 技术|为参加2021年蓝桥杯Java软件开发大学B组细心整理常见基础知识、搜索和常用算法解析例题(持续更新...)
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- Python机器学习基础与进阶|Python机器学习--集成学习算法--XGBoost算法
- 数据结构与算法|【算法】力扣第 266场周赛
- 数据结构和算法|LeetCode 的正确使用方式
- leetcode|今天开始记录自己的力扣之路
- 人工智能|【机器学习】深度盘点(详细介绍 Python 中的 7 种交叉验证方法!)
- 网络|简单聊聊压缩网络