小米&携程面经part2

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笔面经#  #软件开发笔面经#
全部评论
哥 我之前投小米未来星挂了,这个占秋招一志愿,这个能解嘛
点赞 回复 分享
发布于 08-27 10:02 湖北

相关推荐

1 8 评论
分享
牛客网
牛客企业服务