java面试整理
2019-11-24 21:16:22 4 举报
AI智能生成
java面试整理
作者其他创作
大纲/内容
框架
Spring
Bean的生命周期
(由两组回调方法组成)
(由两组回调方法组成)
初始化之后调用的回调方法
销毁之前调用的回调方法
循环依赖
构造器参数循环依赖
抛异常
setter方式单利
setter方式prototype
事件
上下文更新事件(ContextRefreshedEvent):ApplicationContext被初始化或者更新时发布
上下文开始事件(ContextStartedEvent)
上下文停止事件(ContextStoppedEvent)
上下文关闭事件(容器被关闭,所有单例Bean都被销毁)
5.请求处理事件(http请求结束触发)
如何配置Bean
全类名反射
通过工厂方法(静态工厂方法&实例工厂方法)
FactoryBean
SpringMVC
流程
控制器是否单例
是,不用prototype,
在控制器里不用类变量和实例变量
在控制器里不用类变量和实例变量
MyBatis
SpringBoot
MQ
消息队列高可用
rabbitmq
普通集群模式(无高可用)
一个queue只会在一个mq实例上
一个queue只会在一个mq实例上
镜像模式(高可用)
每次写消息到queue时,都会自动同步到其他mq实例上
kafka
消息不被重复消费
数据库主键
redis的set方法
redis的bitmap保存消息id
消息的可靠性传输
rabbitmq
生产者避免数据丢失:confirm机制
mq避免数据丢失:持久化
消费者避免数据丢失:ack
消息的顺序性
单个消费者消费太慢,多个又会导致顺序错乱
解决:单个queue对应单个消费者,消息
插入内存队列,再分发给worker处理
插入内存队列,再分发给worker处理
消息堆积
1.扩大消费者规模
2.不设置消息过期时间(会导致消息丢失)
分布式
限流
计数器法
队列
滑动窗口
漏桶算法
令牌桶算法
redis.incr加过期时间(RateLimiter)
dubbo
springcloud
资源隔离,限流,熔断,降级
Hystrix
线程池
适合绝大多数场景,比如说我们对依赖服务的网络请求的调用和访问、
需要对调用的 timeout 进行控制(捕捉 timeout 超时异常)
需要对调用的 timeout 进行控制(捕捉 timeout 超时异常)
信号量
内部的一些比较复杂的业务逻辑的访问,并且系统内部的代码,不涉及任何的网络请求,
那么只要做信号量的普通限流就可以了,因为不需要去捕获 timeout 类似的问题
那么只要做信号量的普通限流就可以了,因为不需要去捕获 timeout 类似的问题
服务注册
Eureka
注册流程
zookeeper
分布式事务
TCC
可靠消息最终一致性方案
rocketmq
最大努力通知方案
网关
zuul
微服务中实现负载均衡
采用ribbon + eureka实现本地负载均衡
如何实现网关对服务的动态路由
定时发送刷新路由事件 +
读取路由表(缓存 + 数据库)
读取路由表(缓存 + 数据库)
nginx
适合服务器端负载均衡
分表分库
按业务分库
分表
垂直分表
常访问表
不常访问表
水平分表
时间范围
(容易造成热点问题)
(容易造成热点问题)
某个字段hash
id如何处理
数据库自增id
UUID
雪花算法
分布式锁
redis
redisson
通过watchdog监控当前锁是否存在,
存在则延迟过期时间(默认30s)
存在则延迟过期时间(默认30s)
集群情况下会出现锁丢失
解决:修改redisson源码
解决:修改redisson源码
zookeeper
羊群效应
解决:利用curator框架,加顺序临时节点,
并且只对上一个临时节点加监听器
并且只对上一个临时节点加监听器
java基础
多线程
synchronized原理
线程池实现与几个核心基本参数
cas的理解及带来的问题
volatile原理
juc
悲观锁和乐观锁,锁的升降级
线程的6种状态
countdownlatch,cyclicbarrier
ThreadLocal及常见问题
线程安全,死锁,如何查看死锁
集合
jvm
类加载机制
加载
验证
准备
解析
初始化
使用
卸载
类加载器
Bootstrap ClassLoader
Extension ClassLoader
Application ClassLoader
自定义类加载器
双亲委派机制
1.避免类重复加载
2.避免java核心api被篡改
内存模型
主内存和工作内存
内存结构
程序计数器
栈
堆
方法区
常量池
对象在jvm内存中如何分配和流转
如何设置jvm参数
gc
young gc时机
eden区满触发
old gc时机
老年代可用连续内存空间小于新生代历次
young gc进入老年代对象总和的平均大小
young gc进入老年代对象总和的平均大小
老年代空间不足
老年代使用率超92%
full gc
young gc + old gc + 永久代gc
频繁full gc
1.并发数过大,导致young gc频繁且存活对象太多,
survivor区过小,对象频繁进入老年代
survivor区过小,对象频繁进入老年代
2.大对象过多
3.内存泄漏
4.Metaspace加载类过多
5.误调用System.gc
监控
zabbix、open-falcon工具监控
jstat监控
垃圾回收算法
新生代
复制算法
老年代
标记整理
垃圾回收器
新生代
ParNew
老年代
CMS
G1
查看堆栈和gc情况的命令
jstat -gc pid
如何判断一个对象是否存活
GC Roots
1.虚拟机栈中引用的对象
2.方法区类静态属性引用的对象
3.方法区常量池引用的对象
4.本地方法栈JNI引用的对象
GC Roots没有引用是第一次标记,不会真正回收,
如果没有执行finalize方法,才真正回收
如果没有执行finalize方法,才真正回收
设计模式
工厂模式
桥接模式
状态模式
策略模式
模板模式
迭代器模式
门面模式
责任链模式
数据库
mysql
软优化
1.查询语句优化
2.优化子查询
3.使用索引
4.增加中间表
5.增加冗余字段
6.分解表
7.分析表,检查表,优化表
硬优化
事务
读未提交
读已提交
行锁
导致不可重复读,幻读
可重复读
范围锁(gap lock)
导致幻读
串行化
并发问题
脏读
不可重复读
解决:锁住满足条件的行
幻读
解决:锁表
MVCC
根据一致性读视图和row trx_id,去undo-log寻找对应的更早的版本
死锁
解决
1.固定顺序访问表和行
2.大事务拆小
3.在同一事务中,尽可能做到一次锁定所需的所有资源
4.降低隔离级别
5.为表添加合理索引
定位
1.死锁被检测到后会回滚,可查看业务日志找到对应异常日志
2.确定数据库隔离级别
3.show Innodb status查看死锁日志
主从复制
原理
半同步复制
至少收到一个从库的ack才会认为主库写操作成功
(解决从库数据丢失问题)
(解决从库数据丢失问题)
并行复制
(解决主从同步延时问题)
主从同步延时
1.主库拆分,减少写并发
2.并行复制
3.避免写完马上读取
mongodb
redis
常用数据结构及具体实现
三种集群
使用场景
缓存与数据库写一致性
淘汰策略
清除策略
被动删除
主动删除(定期淘汰)
已用内存超过最大内存
问题
雪崩
缓存同一时间大面积失效
redis高可用;本地ehcache + hystrix限流;redis持久化
穿透
故意请求缓存中不存在的数据,导致所有请求落地磁盘
布隆过滤器;缓存返回为空的数据,设置过期时间
击穿
热点key失效
永不过期;加锁,等第一个缓存构建完再释放锁
持久化
linux
cp
find
mv
rm
ps
top
free
cat, more, less, head, tail
grep 检索
0 条评论
下一页