1. 了解MQ出现的原因或者主要使用的场景吗?削谷填峰。对于一些实时性要求不是那么高的业务,交给消息队列可以提高业务的整体速度。2. 分布式锁的实现3. 【没记下来,个人项目相关的问题】4.Spring,SpringMVC以及SpringBoot的区别Spring它是一个开源的应用程序框架,主要做的是管理这些对象,包括它的创建,销毁等。Spring MVC是Spring的一部分,主要处理web开发的路径映射和视图渲染SpringBoot:Spring越来越庞大,其配置文件也越来越繁琐,于是推出实现自动配置,降低项目搭建的复杂度Spring MVC和Spring Boot都属于Spring,Spring MVC 是基于Spring的一个Web层框架,而Spring Boot 是基于Spring的一套快速开发整合包5. SpringBoot简化了哪些操作【1】内嵌了tomcat等容器,只需要用jar包就能部署项目【2】Spring Boot提供了一些列starter的pom,当确定使用类型后可以自动导入依赖【3】提供一些监控的服务【4】用注解代替xml文件6.SpringBoot如何实现自动配置【什么是自动装配】springboot的自动装配实际上就是为了从spring.factories文件中获取到对应的需要进行自动装配的类,并生成相应的Bean对象,然后将它们交给spring容器来帮我们进行管理【如何实现自动装配】利用注解。首先,将主配置类(@SpringBootApplication标注的类)所在包以及子包里面的所有组件扫描并加载到spring的容器中,将需要自动装配的类以全类名的方式返回,(在spring.factories里去找),使用反射创建对象,对对象进行管理。【更详细的流程】1、main方法中SpringApplication.run(HelloBoot.class,args)的执行流程中有refreshContext(context)。2、而这个refreshContext(context)内部会解析,配置类上自动装配功能的注解@EnableAutoConfiguration中的,@EnableAutoConfiguration中的,引入类AutoConfigurationImportSelector。3、AutoConfigurationImportSelector这个类中的方法SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader()会读取jar包中的/项目中的META-INF/spring.factories文件。7.SpringBoot的启动流程new了一个SpringApplication对象【1】确定项目的类型 【2】载入spring.factory配置 【3】从载入的配置中获取项目监听器调用它的run方法【1】启动listner 【2】配置相关环境8.Mybatis的优点【1】SQL语句和代码分离【2】提供了很多xml标签方便我们编写动态SQL语句9.CAS,compare and swap——比较并替换,乐观锁的一种实现。CAS适用于并发冲突发生频率较低的场合。操作步骤如下:【1】修改前记录数据的内存地址V;【2】读取数据的当前的值,记录为A;【3】修改数据的值变为B;【4】查看地址V下的值是否仍然为A,若为A,则用B替换它;若地址V下的值不为A,表示在自己修改的过程中,其他的线程对数据进行了修改,则不更新变量的值,而是重新从步骤2开始执行,这被称为自旋;CAS可以确保数据修改的原子性在java.util.concurrent.atomic包下有很多的原子类,如AtomicInteger、AtomicBoolean......这些类提供对int、boolean等类型的原子操作,而底层就是通过CAS机制实现的。比如AtomicInteger类有一个实例方法,叫做incrementAndGet,这个方法就是将AtomicInteger对象记录的值+1并返回,与i++类似。但是这是一个原子操作,不会像i++一样,存在线程不一致问题,因为i++不是原子操作。【CAS】存在的问题:ABA问题,解决:加版本号。10. 常用的设计模式11. @Autowired和@Resource的区别@Autowired默认按类型进行装配,@Resource默认按照名称进行装配。12.类加载机制Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、解析和初始化,变成虚拟机可以使用的类型,这个过程就叫做类的加载机制。当程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、链接、初始化3个步骤来对该类进行初始化,这也就是类的加载机制。【1.加载】:通过类的全限定名获取字节流,将字节流转化为数据结构,然后生成java.lang.Class对象,作为方法区这个类的各种数据的访问入口【2.链接】:1)首先,验证。确保字节流符合规范要求,避免对虚拟机造成伤害 2)准备。为变量分配默认初始值。3)解析。将符号引用转换为直接引用【3.初始化】:根据代码初始化变量【拓展】:类加载器,“通过全限定名获取类的二进制流的代码”14.双亲委派机制15.redis大key会有什么影响导致性能严重下降,因为redis的核心工作线程是单线程的,前面的请求没有处理完不会处理后面的,大key很容易带来阻塞、超时。大key的产生:大 key 的产生往往是业务方设计不合理,没有预见 vaule 的动态增长问题:【1】一直往 value 塞数据,没有删除机制,迟早要爆炸;【2】数据没有合理做分片,将大 key 变成小 key。16.同步方法和同步代码块哪个更好?同步块是更好的选择,因为它不会锁住整个对象(当然你也可以让它锁住整个对象)。同步方法会锁住整个对象,哪怕这个类中有多个不相关联的同步块,这通常会导致他们停止执行并需要等待获得这个对象上的锁。同步块更要符合开放调用的原则,只在需要锁住的代码块锁住相应的对象,这样从侧面来说也可以避免死锁。17.项目中的异常处理Springboot,自定义异常视图,出现异常的时候不访问springboot默认的界面没有特地去做自定义异常处理18.线程池队列过长的影响线程池的任务队列本来起缓冲作用,但是如果设置的不合理会导致线程池无法扩容至max,这样无法+发挥多线程的能力,导致一些服务响应变慢。队列长度要看具体使用场景,取决服务端处理能力以及客户端能容忍的超时时间等19. synchronized和ReentantLock对比:20.为什么说Python的多线程是鸡肋Python代码的执行由Python虚拟机(解释器)来控制。Python在设计之初就考虑要在主循环中,同时只有一个线程在执行。【对Python虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同时只有一个线程在运行。】21.计算一个二进制长整型二进制表示1的个数使用bigcount,22.关于TCP粘包TCP是面向流的的传输协议,发送端可以一次发送不定长度的数据,而接收端也可以一次提取不定长度的数据。即这种传输方式是无保护消息边界的,接收方接收数据后放在缓存中,如果处理不及时则可能发生粘包。处理方式:【1】可以关闭Nagle算法,通过TCP_NODELAY选项来关闭。缺点是TCP传输效率降低【2】在应用层,对数据进行循环处理,应用程序从接收缓存中读取分组时,读完一条数据,就应该循环读取下一条数据,直到所有数据都被处理完成。(要做到这点则需要发送数据长度)23.线程池七大参数24. Spring 的核心组件25.Spring如何解决循环依赖26.数据库数据量过大怎么优化分区、分表、分库、建索引,聚簇&非聚簇27.Mysql数据库分区28.Nginx负载均衡策略整理完后才发现第二part的面经来自携程和某小公司的二面,小公司没算法题,都是八股,写出来大家可以参考参考,查漏补缺#小米##面经##软件开发2024笔面经# #软件开发笔面经#