最近遇到的面试题

2024 年 9 月 9 日 星期一(已编辑)
33
2

最近遇到的面试题

JVM组成有哪些?

类加载器:负责将类文件从硬盘或其他存储介质加载到内存中。类加载器不负责验证类是否可以运行,这由执行引擎负责。
执行引擎:也称为解释器,负责解释并执行类文件中的字节码指令。执行引擎将内存划分为不同的区域,模拟实际机器的存储、记录和调度功能。
本地库接口:允许JVM融合不同的编程语言,为Java提供与本地系统交互的能力。
运行时数据区:包括堆、方法区、虚拟机栈、本地方法栈和程序计数器。这些区域用于存储对象实例、类信息、方法执行上下文等。
---堆:存储所有对象实例和数组。
---方法区:存储已被虚拟机加载的类信息、常量、静态变量等。
---虚拟机栈:每个线程在执行方法时都会创建一个栈帧,用于存储局部变量、操作数栈等。
---本地方法栈:与虚拟机栈类似,但为本地方法服务。
---程序计数器:指示下一条需要执行的字节码指令。

SpringBoot的自动装配原理

依赖@SpringBootApplication注解,spring-boot-autoconfigure模块,和META-INF/spring.factories文件实现自动装配
@SpringBootApplication有三个注解组成@SpringBootConfiguration,@EnableAutoConfiguration,和@ComponentScan组成,@SpringBootConfiguration是@Configuration的派生注解,标注当前类是一个SpringBoot的配置类。@EnableAutoConfiguration开启自动配置
在@EnableAutoConfiguration注解的内容使用@Import注解导入了一个AutoConfigurationImportSelector.class的类,在AutoConfigurationImportSelector.class中的selectImports方法内通过一系列的方法调用, 最终需要加载类加载路径下META-INF下面的spring.factories配置文件
在META-INF/spring.factories配置文件中, 定义了很多的自动配置类的完全限定路径,这些配置类都会被加载,加载配置类之后, 会配置类或者配置方法上的@ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalOnProperty条件注解是否满足条件,如果满足条件就会使用@ConfigurationProperties注解从属性配置类中读取相关配置 , 执行配置类中的配置方法 , 完成自动配置。

Bean的生命周期

Bean的元信息定义阶段:通过XML配置文件、Java配置类、注解等方式定义Bean。
Bean的元信息配置阶段:配置Bean的元信息,如类名、作用域、是否延迟初始化等。
Bean的元信息解析阶段:解析配置文件或注解中定义的Bean信息,生成BeanDefinition对象。如果存在父BeanDefinition,也要合并BeanDefinition。
Bean注册到容器阶段:将解析得到的BeanDefinition注册到Spring容器中。
BeanDefinition合并阶段:如果Bean存在父Bean,则合并父子BeanDefinition。
Bean Class加载阶段:加载Bean的Class文件,准备进行实例化。
Bean实例化前阶段:执行一些前置操作,如通过InstantiationAwareBeanPostProcessor的postProcessBeforeInstantiation方法。
Bean实例化阶段:创建Bean的实例。
Bean实例化后阶段:实例化完成后,进入实例化后阶段,可能包括属性赋值前的操作。
属性赋值前阶段:执行一些前置操作,如通过BeanWrapper的setPropertyValues方法前的操作。
属性赋值阶段:将配置文件中定义的属性值注入到Bean的相应字段中。
属性赋值后阶段:属性赋值完成后的操作。
(Bean Aware接口回调):如果Bean实现了某些Aware接口(如BeanNameAware、BeanFactoryAware等),则进行回调。
初始化前阶段:调用Bean的初始化方法。这可以通过实现InitializingBean接口的afterPropertiesSet方法、使用@PostConstruct注解标记的方法,或在XML配置文件中指定的init-method来完成。
初始化阶段:调用Bean的初始化方法。这可以通过实现InitializingBean接口的afterPropertiesSet方法、使用@PostConstruct注解标记的方法,或在XML配置文件中指定的init-method来完成。
初始化后阶段:执行一些初始化后的操作,如通过BeanPostProcessor的postProcessAfterInitialization方法。
所有单例Bean初始化完成后阶段:当容器中所有的单例Bean都初始化完成后,会执行一些后续操作,如触发事件通知等。
Bean的使用阶段:Bean被初始化并注入依赖后,即可在应用程序中被使用。
Bean销毁前阶段:当Spring容器关闭时,会触发Bean的销毁前操作。这通常涉及到执行一些清理工作。
Bean销毁阶段:调用Bean的销毁方法。这可以通过实现DisposableBean接口的destroy方法、使用@PreDestroy注解标记的方法,或在XML配置文件中指定的destroy-method来完成。

sql查询很慢,怎么分析和优化?

1.在mysql配置中开启慢查询日志,指定long_query_time获取日志,定位执行慢的SQL语句。
2.然后使用EXLPAIN命令分析SQL语句的执行过程。
比如key字段为空代表没有走索引 ,可以考虑添加索引。
type字段如果出现了index(把索引从头到尾扫⼀遍), all(全表扫描数据⽂件,然后再在server层进⾏过滤返回符合要求的记录), index_merge(表示查询使⽤了两个以上的索引,最后取交集或者并集 , 由于要读取多个索引,性能不好 , 可以考虑使用组合索引)等值, 这个查询的效率可能比较低 , 是否可以调整语句结构
如果出现 using filesort 代表排序时⽆法使⽤到索引 , 需要考虑为排序字段创建索引
如果出现 using join buffer 代表多表查询时被驱动的表没有索引, 考虑建立索引
如果出现 using where表示存储引擎返回的记录并不是所有的都满⾜查询条件,需要在server层进⾏过滤

设计模式了解过哪些?设计模式有哪些应用场景?

事务的传播行为有哪些?

PROPAGATION_REQUIRED(默认行为):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。这是最常用的传播行为,适用于大多数需要事务支持的场景。
PROPAGATION_REQUIRES_NEW:无论当前是否存在事务,都创建一个新的事务。如果当前存在事务,则将当前事务挂起,直到新事务完成。这种传播行为适用于需要独立于当前事务的场景,比如,当一个操作需要完全隔离于其他操作的事务控制时。
PROPAGATION_SUPPORTS: 如果当前存在事务,则支持当前事务;如果当前没有事务,则以非事务方式执行。这种传播行为适用于不强制要求事务,但可以充分利用现有事务的场景。
PROPAGATION_NESTED:如果当前存在事务,则以嵌套事务的方式执行;如果不存在事务,则创建一个新的事务。嵌套事务是一种特殊的事务,它可以独立于外部事务进行回滚,但提交时仍依赖于外部事务。这种传播行为适用于需要在单个事务内执行多个独立操作的场景。

权限功能是怎么做的?

我们的权限功能是基于RABC做的,不同的用户拥有不同的角色,不同的角色绑定了不同的功能模块,并且要保证用户不能操作权限之外的功能。

token中存的一般都是什么数据?

用户的id,可以存权限/角色,可以存会话信息。

动态路由怎么实现的?

通过拉取nacos的路由配置实现动态路由的

线程池的任务调度流程?

首先我们要接受我们的一个任务,先判断当前工作线程数量是否小于核心线程数量。如果核心线程数没满,则直接创建一个新线程来执行这个任务,如果核心线程数满了,则尝试加入阻塞队列。
如果队列已满,但最大线程数没满,则会创建新的非核心线程来执行任务。如果队列和最大线程都满了,则会执行拒绝策略。
如果非核心线程数量在指定的空闲时间里没有新的任务执行,那么这些线程将被终止并从线程池中移除。如果线程池不在需要,可以调用shutdown方法关闭线程池。

es有用过哪些分词器?

ik分词器

ik分词器有哪些?

ik_smart最少切分和ik_max_word最细粒度切分以及自定义词典功能。

分词有没有考虑过分词数量问题?

没有,主要通过分词算法和自定义词典控制的,ik_smart能保证切分的词汇都是有意义的,ik_max_word会尽可能多的切分,适用于文本挖掘,关键字提取等场景。

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...