面试题
基础
JVM内存模型(堆、方法区、本地方法栈、JVM栈、程序计数器)
GC回收方式(计数器、可达性分析等)
类加载器(AppClassLoader、ExtClassLoader、BootstrapClassLoader)
OSI七层模型(物理层->数据链路层->网络层->传输层->会话层->表现层->应用层)
设计模式(单例模式、观察者模式、装饰者模式、工厂模式、代理模式)
HashMap实现原理(JDK1.8)
分布式调度任务流程(XX-JOB):任务注册->任务下发->监控->日志信息收集
算法题(斐波那契数列、杨辉三角形、字符串123变为数字123)
多线程
1.validate
实现原理:将缓存的最新值更新到内存中,同时通知其他处理器,从内存中重新取值,此时其他处理器的缓存值失效
应用场景:插入内存屏障,防止指令重排序
目的:实现共享变量的可见性
2.transient
目的:防止不必要的变量序列化
3.syncronized
实现原理:反编译源码中存在监控计数器,线程获取锁时->计数器+1,锁释放时->计数器-1.当其他线程得知计数器为0时,线程可以进入,否则,线程需要等待.
应用场景:锁(可重入)
备注:reetrantLock是jdk5引入的并发包,作用类似于syncronized,但是比syncronized粒度更细,同时可以获取锁的状态
4.实现多线程的方式(thread,runnable,callable,fork/join框架)
无返回值,推荐runnable,理由:因为java是单继承的,但是可以同时实现多个接口,同时thread内部实现也是runnable
有返回值,推荐callable
5.线程池的参数解析(单线程池、固定线程池、可缓存线程池、定时器线程池)
核心线程数、最大线程数、空闲线程存活时间、时间单位、队列、拒绝策略
Spring
1.AOP
实现原理:通过JDK动态代理实现,也可以通过CGLIB代码
应用场景:事务、日志
目的:方法的横向增强
2.IOC
实现原理:JAVA反射(代码运行期间,动态地获取类或者对象的方法和属性)
目的:实现代码的松耦合
控制反转+依赖注入:以前调用方法需要new对象,现在调用方法直接从spring容器中获取,由主动变被动
3.@resource和@autowired区别
@resource是JDK自带的,@autowired是spring自带的
@resource是先根据名称匹配,再根据类型匹配,若第一次没匹配到,则会匹配第二次.@autowired是根据类型匹配,效率更高一些
@autowired一般配合@qualifier使用,区别同一接口的不同实现类
4.springMVC请求流程
5.事务的四种隔离级别,七种传播机制
6.核心组件
core、context、bean、spel、aop、web等
7.事务种类
声明式事务(注解)->推荐
编程式事务(手写)
8.springboot优点
配置更简单
部署更简单
监控更简单
博客源码GITHUB地址
9.filter和interceptor区别
A.filter基于函数回调,interceptor基于java反射
B.filter依赖servlet容器,只初始化一次
C.执行顺序(生命周期):filter->interceptor->业务逻辑代码->interceptor->filter
MyBatis
1.分页方式
逻辑分页(推荐)->sql处理分页,例如page插件
物理分页->程序处理分页,例如将全表结果返回再做处理,效率低
2.延迟加载
实现原理:
A.使用CGLIB创建代理对象
B.通过拦截器处理参数回填
目的:查询不必要的对象属性,提升查询效率
3.执行器(三种)
A.执行完,关闭
B.执行完,放入缓存,继续用
C. 批量执行
4.自定义插件步骤
A.自定义执行器
B.创建SQL处理器
C.设置参数
D.返回结果集处理
消息中间件MQ(RabbitMQ)
1.流程
producer->routeKey->exchange->bingKey->queue->consumer
2.消息一致性
关闭ACK自动提交为手动提交,通过成功或者失败函数处理
3.避免消费重复方式
A.幂等性:以消息ID作为关键字,缓存redis或者中间表,以此作为过滤条件
B.DB设置属性为唯一约束,防止重复插入
Redis
1.常用数据类型以及应用场景
string,hash,list,set,zset
2.用途
存储热点数据,缓存数据用的,这里要区别mongodb(mongodb是文档型数据库,不是缓存)
3.常见问题
A.缓存穿透:查询对象一直为null,会每次都查询数据库,造成IO浪费
解决办法:将null对象缓存起来
B.缓存雪崩:同一时间点,大量缓存失效,造成DB压力
解决办法:将缓存值的过期时间hash散列开,尽可能使缓存过期时间不一致
C.keys方法为什么被禁用:因为redis是单线程的,所以大量缓存的时候,会消耗时间,导致大量缓存失效,从而造成缓存雪崩,redis2.8使用scan解决,有分页
4.持久化方式以及区别
A.RDB:存储redis所有数据的文件
B.AOF:存储redis所有指令的文件,类似于MySQL的binlog文件
MySQL
1.分库分表如何做
A.主表id取余数,分成N段
B.批量插入小表(N代表段),伪代码如下:
INSERT INTO TABLEN SELECT * FROM TABLE WHERE ID%N=ID
备注:表应该单一,链接操作最好不要超过3个(阿里巴巴手册),这样有利于表水平扩展
2.不停机地给表增加一个字段如何实现
A.创建一个新加字段的临时表
B.将数据分批导入临时表,采取问题1的方式
C.表重新命名,伪代码如下:
RENAME TABLE A TO B
3.MyIsAM和InnoDB区别
A.InnoDB支持事务
B.InnoDB支持行锁,锁粒度更细,而MyIsAM只支持表锁
4.锁
主观上:乐观锁、悲观锁
粒度上:表锁、行锁、页锁(基于表、行锁之间)
再细分:共享锁、独占锁、排他锁,其实就是读操作共享,写操作锁住表
锁实现方式:MVCC
时间匆忙,若以上有问题,请留言,轻点喷!
以上是 面试题 的全部内容, 来源链接: utcz.com/z/512540.html