面试题总结

1.redis是否是单线程

在执行命令的时候是单行程执行,redis其他处理模块还是会存在多线程的

2.jvm常用命令

jps,jstat,jmap,jat ,jstack

3.线程安全并发怎么实现

1.使用多副本2.使用锁 3.使用线程安全的类库

4.g1和cms区别

区别一: 使用范围不一样
CMS收集器是老年代的收集器,可以配合新生代的Serial和ParNew收集器一起使用
G1收集器收集范围是老年代和新生代。不需要结合其他收集器使用

区别二: STW的时间
CMS收集器以最小的停顿时间为目标的收集器。

G1收集器可预测垃圾回收的停顿时间(建立可预测的停顿时间模型)

区别三: 垃圾碎片
CMS收集器是使用“标记-清除”算法进行的垃圾回收,容易产生内存碎片

G1收集器使用的是“标记-整理”算法,进行了空间整合,降低了内存空间碎片

5.spring boot的启动过程

主要流程如下

0.启动main方法开始

1.初始化配置:通过类加载器,(loadFactories)读取classpath下所有的spring.factories配置文件,创建一些初始配置对象;通知监听者应用程序启动开始,创建环境对象environment,用于读取环境配置 如 application.yml

2.创建应用程序上下文-createApplicationContext,创建 bean工厂对象

3.刷新上下文(启动核心)
3.1 配置工厂对象,包括上下文类加载器,对象发布处理器,beanFactoryPostProcessor
3.2 注册并实例化bean工厂发布处理器,并且调用这些处理器,对包扫描解析(主要是class文件)
3.3 注册并实例化bean发布处理器 beanPostProcessor
3.4 初始化一些与上下文有特别关系的bean对象(创建tomcat服务器)
3.5 实例化所有bean工厂缓存的bean对象(剩下的)
3.6 发布通知-通知上下文刷新完成(启动tomcat服务器)

4.通知监听者-启动程序完成

启动中,大部分对象都是BeanFactory对象通过反射创建
https://www.cnblogs.com/Narule/p/14253754.html

6.kafka怎么保证消息幂等

使用redis来保证
,或者使用数据库唯一主键特性,kafka有自带的幂等的功能Kafka引入了 Producer ID (PID)和 Sequence Number的概念

7.jvm怎么优化

8.mysql怎么优化

1.慢sql优化
⚫分析语句,是否加载了不必要的字段/数据。
⚫ 分析SQL执行计划(explain extended),思考可能的优化点,是否命中索引等。
⚫ 查看SQL涉及的表结构和索引信息。
⚫ 如果SQL很复杂,优化SQL结构。
⚫ 按照可能的优化点执行表结构变更、增加索引、SQL改写等操作。
⚫ 查看优化后的执行时间和执行计划。
⚫ 如果表数据量太大,考虑分表。
⚫ 利用缓存,减少查询次数。

9.服务器上遇到问题怎么解决

10.transaction注解失效的几种场景

1.@Transactional 应用在非 public 修饰的方法上
2.@Transactional 注解属性 propagation 设置错误
3.Transactional 注解属性 rollbackFor 设置错误
4.同一个类中方法调用,导致 @Transactional 失效
5.异常被你的 catch“吃了”导致 @Transactional 失效
6.数据库引擎不支持事务
https://www.cnblogs.com/frankyou/p/12691463.html

11.悲观锁乐观锁的区别

总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到 锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等, 读锁,写锁等,都是在做操作之前先上锁.
每次去拿数据的时候都认为别人不会修改, 所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于 write_condition 机制,其实都是提供的乐观锁。在 Java 中 java.util.concurrent.atomic 包下面的原子变量类就是使用了乐观锁的一种实现方式 CAS 实现的,缺点:对于资源竞争严重(线程冲突严重)的情况,CAS 自旋的概率会比较大,从而
浪费更多的 CPU 资源,效率低于 synchronized

12.hashmap和hashtable的区别

13.mysql 行锁怎么实现的,是悲观锁还是乐观锁

14.mysql 有哪些索引

15spring 事务 隔离级别

16mysql 事务隔离级别

为了达到事务的四大特性,数据库定义了4种不同的事务隔离级别:
⚫ READ-UNCOMMITTED(读取未提交):最低的隔离级别,允许脏读,也就是可能读取到其他会话中未提交事务修改的数据,可能会导致脏读、幻读或不可重复读。
⚫ READ-COMMITTED(读取已提交): 只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读),可以阻止脏读,但是幻读或不可重复读仍有可能发生。
⚫ REPEATABLE-READ(可重复读):对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
⚫ SERIALIZABLE(可串行化):最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
⚫ MySQL 默认采用的 REPEATABLE_READ隔离级别。

17. jdk优化

https://juejin.cn/post/7023319854048346120

18.都用过哪些线程池,参数怎么配置的

19.怎么使用arthas.有哪些命令

使用sc,sm,trace

20.kafka怎么保证高可用的

分区与多副本的设计

21.mysql 如何迁移

22.mysql索引失效的场景

1.like以%开头索引无效,当like以&结尾,索引有效
2.or语句前后没有同事使用索引,当且仅当or语句查询条件的前后列均为索引时,索引生效。
3.组合索引,使用的不是第一列索引时候,索引失效,即最左匹配规则
4.数据类型出现隐式转换,如varchar不加单引号的时候可能会自动转换为int类型,这个时候索引失效。
5.在索引列上使用IS NULL或者 IS NOT NULL 时候,索引失效,因为索引是不索引空值得。
6.在索引字段上使用,NOT、 <>、!= 、时候是不会使用索引的,对于这样的处理只会进行全表扫描。
7.对索引字段进行计算操作,函数操作时不会使用索引。
8.当全表扫描速度比索引速度快的时候不会使用索引。

23.spring mvc的执行过程

用户向服务端发送一次请求,这个请求会先到前端控制器DispatcherServlet。
⚫ DispatcherServlet接收到请求后会调用HandlerMapping处理器映射器。由此得知,该请求该由哪个Controller来处理(并未调用Controller,只是得知)
⚫ DispatcherServlet调用HandlerAdapter处理器适配器,告诉处理器适配器应该要去执行哪个Controller
⚫ HandlerAdapter处理器适配器去执行Controller并得到ModelAndView(数据和视图),并层层返回给DispatcherServlet
⚫ DispatcherServlet将ModelAndView交给ViewReslover视图解析器解析,然后返回真正的视图。
⚫ DispatcherServlet将模型数据填充到视图中
⚫ DispatcherServlet将结果响应给用户

24.mysql 间隙锁是用来做什么的

25.spring用到了哪些设计模式

工厂设计模式 : Spring 使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。
⚫ 代理设计模式 : Spring AOP 功能的实现。
⚫ 单例设计模式 : Spring 中的 Bean 默认都是单例的。 ⚫ 模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。
⚫ 包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
⚫ 观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
⚫ 适配器模式 : Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。

26.innodb和myisam的区别

⚫ InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引。
⚫ InnoDB的主键索引的叶子节点存储着行数据,因此主键索引非常高效。
⚫ MyISAM索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据。
⚫ InnoDB非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会非常高效。

27.聚簇和非聚簇的区别

28.索引优缺点

29.项目中是否用到过多线程

30.synchronized的使用方法场景

31.线程的生命周期

32.volatile 使用

33.spring bean的加载过程

34.springboot的核心注解

35.接口和抽象类的区别

接口是对行为的抽象,它是抽象方法的集合,利用接口可以达到 API 定义和实现分离的目的。接口,不能实例化;不能包含任何非常量成员,任何 field 都是隐含着 public static final 的意义;同时,没有非静态方法实现,也就是说要么是抽象方法,要么是静态方法。Java 标准类库中,定义了非常多的接口,比如 java.util.List。
抽象类是不能实例化的类,用 abstract 关键字修饰 class,其目的主要是代码重用。除了不能实例化,形式上和一般的 Java 类并没有太大区别,可以有一个或者多个抽象方法,也可以没有抽象方法。抽象类大多用于抽取相关 Java 类的共用方法实现或者是共同成员变量,然后通过继承的方式达到代码复用的目的。Java 标准库中,比如 collection 框架,很多通用部分就被抽取成为抽象类,例如 java.util.AbstractList。

你可能感兴趣的:(面试题总结)