用户反馈, 再去用链路追踪工具 skywalking
线程池
Springboot
@SpringbootApplication
@SpringBootConfiuration : 等价于 @Configuration
@ComponentScan: 组件扫描,默认扫描当前类的引导类所在包及其子包
@EnableAutoConfiguration: SpringBoot实现自动化配置的核心注解
其中的 @Import 注解导入对应的配置选择器. 选择器去读取当前项目以及项目引用Jar包下面的classpath路径下META-INF/spring.factories文件中所配置的类的类名.在这些配置类中所定义的bean会根据条件注释所指定的条件来决定是否需要将其导入到Spring容器中.
条件判断会有像 @ConditionalOnClass 这样的注解,判断是否有对应的class文件,如果有则加该类,把这个配置类的所有Bean放入spring容器中使用
@ConditionalOnMissingBean
导师+ 2 + 应届生
前端2 + 测试1 服务端3
ES
ES
Spring
1. spring的bean是线程安全的吗?
不是线程安全的
2. AOP
3. spring中事务失效的场景
- 异常被捕捉
- 抛出检查异常 非RuntimeException和 Error 可以使用 rollBackFor=Exception.class
- 非 public 方法导致的事务失效 ,final
- 在@transaction中 调用this的方法 没有被代理类增强
4. spring事务
事务属性包括:
1. 隔离级别
2. 传播行为 7种
- request 同用一个事务
- Request_new 用不同的事务
- Nested 用不同的事务,但会通知,如果外层事务将其捕获就不会回滚
3. 回滚规则
4. 是否只读
5. 事务超时
5. spring的Bean的生命周期
6. 循环依赖
- singletonObjects, 一级缓存
- earlySingletonObjects, 二级缓存
- singletonFactories 三级缓存
加入
singletonFactories三级缓存的前提是执行了构造器,所以构造器的循环依赖没法解决 可以加@Lazy
二级缓存是用来存储 代理对象的?
三级缓存中的 objectFactories 能创建 普通对象和代理对象
对象不是代理对象的情况下
7. springMvc 执行流程
- JSP
- 前后端分离阶段(接口开发,异步请求)
8. Springboot的自动装配原理
微服务
SpringCloud
1. 注册中心
2. 负载均衡 Ribbon
3. 限流
4. 如何监控微服务
业务相关
1. 限流的实现
2. CAP和BASE
3. 分布式事务解决方案?
- XA模式
- AT模式
- TCC模式
- MQ分布式事务
4. 接口的幂等性
5. 分布式任务调度
消息中间件
RabbitMQ
消息不丢失
2. 消息堆积
3. 高可用
Kafka
1. 如何保证消息不丢失
2. 如何保证消费的顺序性
3. 分区备份机制
4. kafka数据清理机制
4.
集合框架
1. ArrayList
- 成员变量
- 构造函数
1. 如何实现数组与List之间的转换
2. LinkedList
3. ArrayList和LinkedList的区别是什么?
3. HashMap
- 二叉树
- 红黑树
为什么用红黑树,而不用平衡二叉树?
因为 作为动态树(需要添加和删除) , 红黑树的调整效率比平衡二叉树高!
- 散列表
1. HashMap实现原理
1.7 是头插法, 1.8 是尾插法,避免多线程下的循环链表问题
2. put流程
3. 扩容原理
4. hashMap的寻址算法
5. hashmap 在 1.7情况下的多线程死循环
并发编程
线程基础
1. 线程与进程的区别?
2. 并行和并发有什么区别?
3. 创建线程的方式
- 继承Thread类
- 实现runnable接口
- 实现Callable接口
- 线程池创建线程
runnable和callable有什么区别?
run方法与start()方法的区别?
4. 线程包括哪些状态,状态之间是如何变化的
5. 如何保证线程的顺序执行?
notify()和notifyAll()有什么区别?
6. wait和sleep方法的不同?
如何停止一个正在运行的线程?
在线程中 定义一个 volatile boolean flag = false; 做标志
线程中并发安全
1. Synchronized关键字的底层原理
- 轻量级锁
- 偏向锁
2. JMM(java内存模型)
3. CAS
Compare And Swap
4. 谈谈对volatile的理解
- 保证线程间的可见性
- 禁止指令重排序
5. 什么是AQS?
- AQS是公平锁还是非公平锁
6.ReentrantLock的实现原理
7 synchronized和Lock有什么区别?
可打断,可超时,多条件变量
8. 死锁产生的条件是什么?
9. CurrentHashMap
10. Java程序中怎么保证多线程的执行安全(导致并发程序出现问题的根本原因是什么)
java并发编程三大特性
- 原子性
- 可见性
- 有序性
线程池
1.线程池的执行原理知道吗?
说一下线程池的核心参数
2. 线程池中有哪些常见的阻塞队列
3. 如何确定核心线程数
4. 线程池的种类有哪些?
5. 为什么不建议使用Executors创建线程池?
使用场景
1.线程池使用场景(CountDownLatch,Future)
- CountDownLatch
数据导入
2. 数据汇总
3.异步调用
4. 如何控制某个方法允许并发访问线程的数量
5. ThreadLocal
设计模式
工厂模式
- 简单工厂
- 工厂方法模式
- 抽象工厂模式
单例模式
策略模式
登录案例( 工厂模式+策略模式)
策略模式+工厂: 实现多中登录方式
请求种带 type 表示请求类型.使用type去对应的工厂类中获取对应
在工厂内弄个map,调用aware接口去初始化 策略类
责任链设计模式
常见技术场景
1.单点登录如何实现
2. 权限认证如何实现
3. 上传数据的安全性你们怎么控制?
4. 你负载项目的时候遇到了哪些比较棘手的问题? 怎么解决的
5. 你们项目中日志是怎么采集的
6.生产问题如何排查
7. 如何快速定位系统的瓶颈
状态码
3XX 重定向
2XX 成功
- 200 Ok
- 204 no content (请求成功,但是没有结果返回)
- 206 partial content (客户端请求一部分资源,服务端成功反应,返回一范围资源)
4XX
1. 400 bad request (请求报文存在语法错误)
1. 401 unauthorized (需求认证 (第一次返回) 或者认证失败 (第二次返回))
1. 403 forbidden (请求被服务器拒绝了)
1. 404 not found (服务器上无法找到请求的资源)
5XX
1. 500 internal server error (服务端执行请求时发生了错误)
1. 503 service unavailable (服务器正在超负载或者停机维护,无法处理请求)
Mybatis
Mybatis执行流程 :
延迟加载
xml中 局部
实现原理: cglib 动态代理
Mybatis缓存
一级缓存基于PerpetualCache的HashMap 作用域为SqlSession 在增删改以及close 操作后会清空 ,默认打开
二级缓存基于PerpetualCache的HashMap存储,作用域为 namespace和mapper,默认关闭
MySQL 面试题
谈谈对mysql的理解
结构:
服务层 : 连接组件,提供连接池,对权限校验, 分析器: 先分析语法问题,再去查缓存 -> 再到优化器
引擎层
联合索引 a,b,c where b =1 and c = 2 and a = 3 , 单独 c = 2 不走索引
存储引擎层
日志层
索引 b+树 数据存储在叶子节点, b树 hash :不支持范围查询 (无序)
事务 acid 原子性,一致性,隔离性,持久性 实现: undo log redo log binlog
隔离性 : 读未提交,读已提交,可重复读(mysql默认),串行
并发事务问题: 脏读,不可重复读,幻读
解释下什么叫幻读: A事务第一次读有5条数据,B事务插入一条数据并提交事务.A事务 select count(*) 有6条 select * 只有5条
可重复读的情况下如何解决部分幻读 MVCC,间隙锁 加行锁
日志文件
锁
集群
索引下推 ?
MySQL 8.0 新特性 ?
in 与 exists 的区别
- in是把外表和内表做hash连接,先查询内表,返回一个数据列,这个数据列的值将提供给外层查询语句进行比较操作.
- Exists 是 对外表做loop循环,循环后再对内表查询,将主查询的数据放入子查询中做条件验证,根据验证结果(true或false)来决定主查询的数据是否得以保留
- 在外表大 的情况下用in效率高,内表大的情况下用exists效率高
简记: in 小, exists 大
索引结构
- B-Tree
- B+Tree
MySQL体系结构
连接层,服务层,引擎层,存储层,日志层
存储引擎特点
- InnoDB
- MyISAM
- Memory
SQL优化
插入优化
顺序插入,批量插入,本地文件插入
1. limit优化
2. count优化
3. update优化
索引不能失效,否则行锁变表锁
锁
1. 全局锁
数据备份
2. 表级锁
- 表锁
- 元数据锁 (meta data lock ,MDL)
避免DML与DDL冲突,保证读写的正确性 . 增删改与 表结构改动的冲突
- 意向锁
当我们设置行锁的时候,会自动添加意向锁,用于与后来的表锁交互,判断能否兼容,能兼容则可以添加表锁
主要解决InnoDb中行锁与表锁的冲突问题
3. 行级锁
- 行锁
- 间隙锁
- 临键锁
InnoDB引擎
1.逻辑存储结构
2.架构
1. 内存框架
- Buffer Pool
- Change Buffer
- Adaptive Hash Index (自适应哈希):
- Log Buffer
2.磁盘结构
3. 后台线程
3.事务原理
- redo log
- undo log
4. MVCC
- 实现原理
readview
运维
日志
- 错误日志
- 二进制日志
- 查询日志
- 慢查询日志
Redis 面试题
Redis 数据一致性
(双写一致性)
一致性要求高
允许延迟一致
JVM 面试练习
- 一个类是怎么加载到JVM内存中的?
编译生成二进制字节码, 经过7步流程 加载->验证->准备->解析->初始化->使用->卸载
- jvm内存结构
堆,本地方法栈,程序计数器,虚拟机栈,元空间.
-
哪些是线程安全的哪些非安全? 注意 堆并不一定非线程安全
非线程安全: 元空间,堆
线程安全: 虚拟机栈,
方法内部的局部变量不一定线程安全,要看作用域
4.程序计数器的作用
记录每个线程执行的位置
- 栈缓存了哪些信息
栈里面存放了1一个个栈帧,栈帧里面还有哪些 : 局部变量表,操作数栈,动态链接,方法返回值地址...
-
java创建对象需要经过哪些操作
给对象分配内存空间,初始化对象,将引用地址指向该对象
-
对象有哪些部分组成?
对象头+实例数据+填充 如果是数组还有数组长度
-
jdk 1.7 与 jdk1.8的区别
方法区变成元空间,改成本地内存, static 方法区移到堆区,常量池移到堆区
-
常量池的作用
常量的复用
-
元数据存储了那些信息
类的元数据 运行时常量池
-
怎么让元空间溢出?
cglib提供了一个增强类,可以通过这个类大量创建类的元数据导致元空间溢出
-
GC Roots的对象由哪些
- 虚拟机栈 (栈帧中的本地变量表)中的引用对象
- 方法区中静态属性引用的对象 堆区中的静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中JNI引用的对象
-
几种引用的区别:
- 强引用: == new 只有没有 GC Roots 指向的时候才会被垃圾回收处理
- 软引用: 当内存不足时,垃圾回收才会回收软引用对象
- 弱引用: 只要触发垃圾回收,就会回收弱引用对象
- 虚引用: 陪合引用队列使用,但被引用对象回收后 虚引用主要用来跟踪对象的回收,清理被销毁对象的相关资源。
-
Jvm 调优
经量保证启动时,堆占用50%以下
关闭 from,to 区动态内存调整大小参数 -XX:-UseAdaptiveSizePolicy
使用cms垃圾回收器时, 开启在老年代垃圾回收器之前让新生代回收一次参数
JVM
JVM组成
1. 什么是程序计数器
2. Java堆
线程共享的区域,主要用来保存对象实例和数组
S0: from S1: to
1.7与1.8 的区别 方法区变成元空间,改存到 本地内存.static方法区移到堆区,字符串常量池移到堆区
3. 什么是虚拟机栈?
一个线程一个栈,一个方法一个栈帧
栈里存 参数,局部变量,返回地址
栈内存
栈帧默认为1m ,一般不会超过.
4. 什么是方法区?
5. 什么是直接内存?
类加载器
1. 什么是类加载器
什么事双亲委派模型?
2. 类装载的执行过程
1. 加载 : 导入class文件
2.验证
3.准备 : 为类变量分配内存并设置类变量初始值
4.解析 : 把类中的符号引用转换为直接引用
5.初始化 : 对类的
6.使用
垃圾回收
1. 对象什么时候可以被垃圾器回收
主要是回收堆中的对象
引用计数法 :循环引用,会引发内存泄漏
可达性分析算法
哪些对象可以作为 GC Roots
2. JVM 垃圾回收算法有哪些?
- 标记清除算法
- 复制算法
- 标记整理算法
标记清除算法
标记整理算法 : 一般老年代用
复制算法 : 一般年轻代用
3. 说一下JVM中的分代回收
分代收集算法
对象头 : 4位二进制数 最大15
Major GC 针对老年代
4. 说一下JVM有哪些垃圾回收器
串行垃圾收集器
并行垃圾收集器
5. G1垃圾回收器
需要触发stw
重新标记需要stw
6. 强引用,弱引用,软引用虚引用的区别
JVM实践
1. JVM调优的参数可以在哪里设置参数
- war包部署在tomcat中设置
- jar包部署在启动参数设置
2. JVM调优参数都有哪些?
512k
7. 说一下JVM调优的工具?
7.Java内存泄漏的排查思路
2.CPU飙高排查方案与思路
线程创建
- 继承Thread类
- 实现runnable
- 实现Callable接口
- 线程池创建线程 项目中使用