1. Spring Boot 了解多少
Spring Boot 是一个开源的 Java-based 框架,旨在简化 Spring 应用的配置和开发过程。它通过约定优于配置的理念,极大地减少了开发人员配置的麻烦。Spring Boot 提供了自动配置机制,支持内嵌的 Tomcat、Jetty 或 Undertow 容器,能够快速创建、启动和部署 Spring 应用。编辑
常见的优点包括:
- 快速启动:通过内嵌服务器实现无需部署容器,减少了部署时间。
- 自动配置:根据项目依赖自动配置相关的 Bean,简化了开发过程。
- 微服务支持:Spring Boot 提供了完善的微服务架构支持,便于与 Spring Cloud 配合使用。
编辑
2. Spring MVC
Spring MVC(Model-View-Controller)是 Spring 框架的一个 Web 模块,提供了基于 Java 的 HTTP 请求处理方式。它将请求和响应的处理分为三个主要组件:
- Model:包含了业务数据和逻辑。
- View:负责展示数据,可以是 JSP、Thymeleaf 等。
- Controller:负责处理用户请求,封装业务逻辑并返回结果。
Spring MVC 使用了请求分发机制,通过 DispatcherServlet 作为前端控制器来协调请求和相应的视图。在处理请求时,它会根据 URL 映射到具体的 Controller,然后调用相关的 Service 层处理业务逻辑。
3. Bean 生命周期
在 Spring 中,Bean 生命周期是指 Bean 从创建到销毁的整个过程。主要步骤如下:
- 实例化:通过反射机制创建 Bean 实例。
- 填充属性:Spring 会注入配置文件或注解中定义的属性值(依赖注入)。
- 初始化 :如果 Bean 实现了
InitializingBean
接口,或配置了init-method
,会调用相应的初始化方法。 - 销毁 :当容器关闭或 Bean 不再需要时,会调用
destroy-method
方法进行销毁,若 Bean 实现了DisposableBean
接口,也会调用其销毁方法。编辑
4. 为什么使用 MQ
消息队列(MQ)常用于异步解耦、流量削峰、分布式事务等场景。其优势如下:
- 解耦:通过消息中间件解耦应用之间的紧密耦合。
- 异步处理:消息队列可以异步处理任务,提高系统的响应能力和吞吐量。
- 流量削峰:通过消息队列可以缓解系统的高并发压力,平衡系统负载。
5. JVM 内存区域
JVM 内存主要分为几个区域:
- 堆内存(Heap):存储 Java 对象和数组,Java 中的垃圾回收发生在这里。
- 栈内存(Stack):每个线程独立的内存区域,用于存储局部变量、方法调用和返回值。
- 方法区(Method Area) :存储类信息、常量池、静态变量等,JVM 规范要求该区域在所有线程之间共享。
- 程序计数器(PC Register):记录当前线程执行的字节码的行号指示器。
- 本地方法栈(Native Method Stack):存储 native 方法的相关信息。
6. 双亲委派模型
JVM 类加载机制采用了双亲委派模型,指的是类加载器在加载类时,会先委托给父类加载器加载,如果父类加载器无法加载,再由子类加载器加载。这种机制的优点是:
- 避免重复加载:防止同一个类被加载多次,确保了类加载的唯一性。
- 隔离性:确保了不同层次的类加载器不会互相干扰。
7. synchronized
synchronized
是 Java 中用于实现线程同步的关键字。它可以用来修饰方法或代码块,确保在同一时刻只有一个线程能够执行该方法或代码块。
- 方法同步 :
synchronized
可以修饰实例方法或静态方法,分别实现对实例和类级别的同步。 - 代码块同步 :通过
synchronized
修饰代码块,只对该代码块内的资源进行同步,能够提高性能。
8. volatile
volatile
是 Java 中的一个关键字,用来修饰变量,保证该变量在多个线程间的可见性。它确保每次读取该变量时,都会从主内存中读取,而不是缓存中的值,从而避免了线程之间的缓存不一致问题。
9. ArrayList 和 LinkedList 的区别
- ArrayList:基于动态数组实现,支持随机访问,查询操作时间复杂度为 O(1),但插入和删除元素时可能需要移动元素,时间复杂度为 O(n)。
- LinkedList:基于双向链表实现,插入和删除操作时间复杂度为 O(1),但查询操作需要遍历链表,时间复杂度为 O(n)。
Redis
1. Redis 的数据结构
Redis 支持多种数据结构,包括:
- 字符串(String):最基本的数据类型,可以是文本或数字。
- 哈希(Hash):存储键值对集合,适用于存储对象。
- 列表(List):双向链表,适用于队列、栈等。
- 集合(Set):无序集合,适用于去重和一些集合运算。
- 有序集合(Sorted Set):每个元素都有一个权重值,用于排序。
- 位图(Bitmap) 、HyperLogLog 等。
2. 缓存穿透
缓存穿透是指请求的数据在缓存和数据库中都不存在,导致每次请求都访问数据库,造成压力。常见的防止措施包括:
- 布隆过滤器:在缓存中保存是否存在某个值的判断信息,防止无效请求直接访问数据库。
- 缓存空值:对于不存在的数据,可以缓存一个空值,避免重复查询。
3. 缓存雪崩
缓存雪崩是指多个缓存同时失效,导致大量请求直接访问数据库,造成数据库压力过大。防止措施包括:
- 设置不同的缓存过期时间:避免所有缓存同时失效。
- 使用过期预热机制:提前加载数据到缓存中。
4. Redis 为什么快
Redis 是内存数据库,所有数据都存储在内存中,读写速度极快。同时,Redis 的数据结构是为特定场景优化的,这使得它在处理复杂操作时也能保持高效。
5. IO 多路复用
IO 多路复用是一种处理多个 IO 操作的技术,允许单一进程或线程同时处理多个 IO 操作。Redis 使用了 epoll(Linux)等多路复用机制来处理并发请求,避免了线程阻塞,提升了性能。
计算机网络
1. 三次握手
TCP 三次握手是建立可靠连接的过程:
- 客户端发送 SYN 请求报文。
- 服务器接收 SYN 请求并回应 SYN-ACK。
- 客户端收到 SYN-ACK 后发送 ACK,连接建立。
2. TCP 和 UDP
- TCP(传输控制协议):面向连接,可靠,适用于对数据传输要求较高的场景。
- UDP(用户数据报协议):无连接,不可靠,适用于实时性要求较高的场景,如视频流、语音通话。
3. nginx 负载均衡的几种方式
- 轮询:默认方式,按顺序将请求分发到不同的服务器。
- IP 哈希:根据客户端 IP 计算哈希值来决定请求发送的服务器。
- 最少连接:选择当前连接数最少的服务器处理请求。
这篇文章总结了面试中可能涉及的一些常见问题,并提供了简明的回答和技术细节。在准备面试时,了解这些基础知识能帮助你更好地应对面试中的技术问题。