一面:技术面
1.自我介绍
你好,面试官,我是XXX,于xxxx参加工作,上家公司就职于xxxx,做过xxxx项目,会xxx技术,最擅长xxx,平时生活爱好。。。
2.Spring AOP的原理和用处
原理:
SpringAOP是动态代理来实现,有两种代理方式:JDK动态代理与CGLIB动态代理。
JDK动态代理:是通过反射来接收被代理类,要求必须实现一个接口。
CGLIB动态代理:当被代理类没有实现一个接口的时候,就会使用CGLIB进行动态代理。CGLIB动态代理通过运行时动态生成被代理类的子类,运用继承的方式来实现动态代理。如果被代理类被final修饰了,那么就不能使用CGLIB进行动态代理了
用途:
SpringAOP切面编程,在日常开发中,主要用于框架接口访问的拦截控制,网关层的访问过滤,日志记录等
3.NIO的实现方式,用途
实现方式:
NIO,非阻塞IO,也称New IO,是一种同步非阻塞的I/O模型,也是I/O多路复用的基础。主要有三大核心部分组成:Channel(通道),Buffer(缓冲区), Selector(选择器)。传统IO是基于字节流和字符流进行操作(基于流),而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。(简单介绍,日常开发其实很少用到,除非是中间件研发专家。属于面试造火箭了)
用途:
应用到大型应用服务器,解决高并发与大量连接、I/O处理问题。如大量用户在线的聊天服务器,视频直播等。
4.LinkList和ArrayList的区别,插入,查询比较
LinkList和ArrayList都是List的实现类,ArrayList 底层是动态数组,查询快,插入慢,有移动的动作;LinkedList 底层是链表, 插入快,查询慢。
5.java bean为什么要实现序列化
- 持久存储,将对象的状态保存在存储媒体中以便可以在以后重新创建出完全相同的副本
- 按值封送,尤其是在分布式系统中。如果对象标记为 Serializable,则该对象将被自动序列化,并从一个应用程序域传输至另一个应用程序域,然后进行反序列化,从而在第二个应用程序域中产生出该对 象的一个精确副本
- 实现serializable接口的作用是就是可以把对象存到字节流,然后可以恢复
6.redis为什么这么快----底层设计原理
redis是一个内存数据库,是使用内存存储,没有磁盘IO上的开销;还有使用单个线程处理请求,避免了多个线程之间线程切换和锁资源争用的开销;使用多路复用IO技术,在poll,epool,kqueue选择最优IO实现;有诸多可以直接应用的优化数据结构的实现,应用层可以直接使用原生的数据结构提升性能
7.常见的几种分布式锁,redis锁的用法
redis,zookeeper,数据库实现的三种分布式锁;通过redis在Java中的setnx和get方法,设置获取锁的标志位,哪个进程获取redis锁的标志位,谁就可以执行代码块,其他进程队列等待。
接着补问:如果redis并发锁的服务宕了,抢夺锁资源的队列怎么处理?
不好意思,开发的业务场景真没处理过这种问题。哈哈。这块了解的不够深入。
8.线程池的实现原理和应用场景,参数配置
线程池原理:
提交一个任务到线程池中,线程池的处理流程如下:
1)判断核心线程池是否都在执行任务,如果不是(核心线程空闲或者还有核心线程没有被创建也就是没有达到核心线程大小),则创建一个新的工作线程来执行任务。如果核心线程都在执行任务,则进入下个流程。
2)判断线程池的缓存队列是否已满,如果没满,则将新提交的任务存储在这个工作队列中,否则进入下个流程。
3)判断最大线程池里的线程是否都处于工作状态也就是是否达到了最大线程池个数,如果没有,则创建一个新的工作线程来执行任务,如果已经满了,则交给饱和策略来处理这个任务
目的:减少在创建和销毁线程上所花的时间以及系统资源的开销 ,如不使用线程池,有可能造成系统创建大量线程而导致消耗完系统内存以及”过度切换”。
应用场景:
- 单个任务处理的时间比较短
- 需处理的任务的数量大
参数设置:
以ThreadPoolExecutor参数设置为例
ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
- corePoolSize 线程池核心线程大小
- maximumPoolSize 线程池最大线程数量
- keepAliveTime 空闲线程存活时间
- unit 空间线程存活时间单位
- workQueue 工作队列
- threadFactory 线程工厂
- handler 拒绝策略。当工作队列中的任务已到达最大限制,并且线程池中的线程数量也达到最大限制,这时如果有新任务提交进来,该如何处理呢。这里采用拒绝策略。这里不详细介绍了。
9.java虚拟机垃圾回收机制,tomcat的jvm参数配置
粗略回答,这个问题当时看书时间有点长,淡忘了。首先判断对象是否可被回收,采用计数算法或可达性分析算法进行判断。
jvm参数配置
tomcat的catalina.sh文件进行服务器的JVM参数配置。日常开发只涉及到最大堆内存的配置,比较low啊,所以JVM调优这块工作还是接触比较少的。
JAVA_OPTS="-Xmx4096m -XX:MetaspaceSize=1024m -XX:MaxMetaspaceSize=1024m -Xss4m"
CATALINA_OPTS="-Djava.awt.headless=true"
10.红黑树原理(回答不好)
回答:一个平衡的二叉搜索数,不熟悉,没好好复习。数据结构是硬伤。。。
11.谈谈多租户模型(回答不好)
回答:SaaS,是一种软件架构技术,没详细了解
12.微服务的分布式事务怎么实现的,同时调用多个微服务接口时(回答不是很好)
回答:分布式事务在微服务中可以有seata框架集成实现,也可以通过分布式消息中间件kafka来实现业务的一致性和实时性。例如在商城交易系统中,为了保证用户下单模块,支付模块和物流模块的一致性,可以使用kafka作为消息中间件,用户支付成功时,支付模块作为生产者向kafka发送一条消息,kafka接收到消息后,持久化存储,物流模块监听消费掉该条消息后,做相应的业务处理,从而保证了该交易系统下单交易的ACID属性。
13.kafka如何避免消息丢失(回答不是很好)
看kafka生产环境的消息接收量,如果消息接收量比较小,日接收不过万条,建议采用同步发送的方式。同步发送发出消息后,必须阻塞等待收到通知,才能发送下一条消息。这样既能保证不丢失消息,又能保证顺序。
但是如果kafka的吞吐量很大,每天接收的数据很大。那就只能采用异步发送的方式了。异步发送消息之后回调函数,发送成功就发送下一条,发送失败就记在日志中,等着定时脚本来扫描。(回答粗糙简陋)
14.一条查询SQL的执行流程,底层原理
- 客户端把语句发给服务器端执行
- 客户端把 SQL 语句传送到服务器,服务器进程对该语句进行解析
- 语句合法性检查
- 语言含义检查
- 获得对象解析锁
- 数据访问权限的核对
- 确定最佳执行计划
- 语句执行
- 提取数据
15.谈谈类加载的双亲委派机制(回答不好)
某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载
16.谈谈mysql与oracle的分页
这个问题比较简单,就举例了两条SQL
mySQL分页方式:
select * from table limit 3,5;--查询table从第3页开始,每页5条数据
Oracle分页方式:
select rownum,rowid,tt.* from table tt where rownum<=3 and sex=1 and rownum>=2
17.对SpringBoot的了解,个性化配置
简单介绍了SpringBoot的开发便捷性,无配置化开发。个性化设置介绍了定制个性banner。属于入门级面试题
18.通过反射机制获取的对象跟new 的对象有什么区别,哪个更快,为什么不通过反射机制直接获取对象
在使用反射机制获取对象时,必须确保这个类已经加载且已经连接,使用new的时候,这个类可以没有被加载,也可以已经被加载;new关键字是强类型的,效率较高。反射是弱类型的,效率低;反射只是提供了一种更加灵活的方式创建对象,获取对象的信息。
19.SpringCloud的介绍,熔断机制(回答不是很好)
首先介绍了SpringCloud微服务框架的各大组件,及其作用。SpringCloud的熔断机制主要是Hystrix框架来实现的,主要是在使用Feign客户端调用其他服务接口时,如果该服务调用超时,异常或不可用,Hystrix就会fallback切断与服务的连接。
20.数据库的分布式事务(回答不好)
事务是数据库管理系统执行过程中的一个逻辑单位,它能保证一组数据库操作要么全部执行,要么全不执行,我们能够通过事务将数据库从一个状态迁移到另一个状态,在每一个状态中,数据库中的数据都保持一致性。分布式事务其实也是事务,只是由于业务上的定义以及微服务架构设计的问题,所以需要在多个服务之间保证业务的事务性,也就是 ACID 四个特性;从单机的数据库事务变成分布式事务时,原有单机中相对可靠的方法调用以及进程间通信方式已经没有办法使用,同时由于网络通信经常是不稳定的,所以服务之间信息的传递会出现障碍。(怎么设计数据库的分布式事务不了解)
21.如何看待出差和加班
适度加班可以接受,短期出差也可以接受。
22.最近在看什么书,研究什么新技术
《收获,不止SQL优化》,《亿级流量网站架构核心技术》,《Spring Cloud微服务架构开发实战》。。。
23.你对公司工作有什么要问的
。。。。
一个半小时的电话面试结束了,感觉回答的不是很好,主要是没怎么准备,更别说背什么面试题,都是根据自己日常在开发和处理问题的经验来回答的。面试结束,面试官让等通知。
二面:项目面
1.这个项目几个人开发,你负责哪些模块,一些模块的实现细节
2.深入交谈模块所使用技术的底层原理
3.你遇到的最深刻最难的几个问题,怎么处理的
4.某个模块,你跟同事是怎么协作开发的,跟前端开发怎么对接,跟底层协议开发怎么对接
5.能自己搭建一个微服务项目吗
6.一个加载很慢的模块,你是怎么优化的,介绍下优化的方法和步骤
二面进行了大约30分钟,自我感觉还很良好,毕竟都是介绍自己做的东西,表达很顺畅流利。
三面:HrBP面
hr面是谈经历,谈生活,谈未来,扯皮的,这就不总结了。hr面试过了一天,就通知面试过了,在走offer发起流程,过了几天邮件发了offer和入职注意事项。