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