1. Spring Boot 启动流程
Spring Boot 启动流程大致可以分为以下几个步骤:
-
启动类的 main 方法:Spring Boot 应用通常有一个包含
@SpringBootApplication注解的启动类,这个类的main方法中调用SpringApplication.run()。 -
SpringApplication.run():
- 创建
SpringApplication对象。 - 确定是否是 Web 应用(决定是否需要启动内嵌的 Tomcat 等容器)。
- 加载应用的配置文件,准备环境(比如
application.properties或application.yml)。 - 执行一系列的初始化步骤(例如启动监听器)。
- 创建
-
创建并刷新 Spring 应用上下文:Spring Boot 会创建
ApplicationContext,并通过refresh()方法启动 Spring 的生命周期管理(包括创建 bean、依赖注入等)。 -
启动内嵌的 Tomcat 服务器:如果是 Web 应用,Spring Boot 将启动内嵌的 Tomcat(或其他容器,如 Jetty、Undertow),并将应用部署到这个容器中。
-
完成启动:所有 bean 都初始化完成后,Spring Boot 应用进入监听模式,准备接收请求。
2. Tomcat 如何接收 HTTP 请求
Tomcat 是一个 Servlet 容器,工作流程如下:
-
Socket 监听:Tomcat 启动时,会绑定到指定的端口(默认 8080),并创建一个
ServerSocket来监听 HTTP 请求。 -
Acceptor 线程:Tomcat 使用一个
Acceptor线程不断监听端口上的请求,当有客户端请求到达时,它会将请求 socket 分配给一个Poller或Worker线程。 -
请求解析:
Worker线程会解析 HTTP 请求,将其封装为一个HttpServletRequest对象,并将其传递给对应的 Servlet。 -
Servlet 处理:Tomcat 会根据请求的 URL,将请求分发到对应的 Servlet,Servlet 处理完请求后生成响应。
-
响应返回:Tomcat 将 Servlet 的响应封装为 HTTP 响应,并通过 socket 返回给客户端。
3. 301 和 302 的区别
- 301 Moved Permanently:表示资源已永久移动到新的位置,搜索引擎会更新资源的 URL,客户端在以后也会使用这个新的 URL。
- 302 Found:表示资源临时移动,客户端会暂时使用新的 URL,但以后可能还会使用原来的 URL。
4. 幂等性
幂等性指的是一个操作能重复执行多次,并且每次执行的结果都相同。常见的 HTTP 方法中,GET、PUT、DELETE 都是幂等的,而 POST 通常不是幂等的。
5. TCP 的 TIME_WAIT 和 CLOSE_WAIT
-
TIME_WAIT:当主动关闭连接的一方发送了
FIN包,并接收到对方的ACK之后,会进入TIME_WAIT状态,等待 2 个 MSL(Maximum Segment Lifetime)。这个状态确保延迟的报文能够被处理,并且避免旧连接数据混入新连接。 -
CLOSE_WAIT:被动关闭连接的一方在收到对方的
FIN包后,进入CLOSE_WAIT状态,表示它已经收到对方的请求关闭连接的通知,但它还需要关闭自己的连接并发送FIN包。
6. Linux 抓包
在 Linux 中,可以使用工具 tcpdump 来抓包。基本用法如:
sudo tcpdump -i eth0
这会抓取 eth0 设备上的所有网络流量。可以通过 -w 参数将抓包结果保存为文件:
sudo tcpdump -i eth0 -w output.pcap
然后可以用 Wireshark 等工具分析 pcap 文件。
7. Java 内存泄漏的排查
Java 虽然有垃圾回收机制,但依然可能发生内存泄漏。常见的内存泄漏排查步骤:
- 使用
jmap生成堆快照(heap dump)。jmap -dump:format=b,file=heap_dump.hprof <pid>
11. JDK 源码中的常见设计模式
- 单例模式:
Runtime类就是单例模式的经典实现,保证 JVM 运行时环境的唯一实例。 - 工厂模式:
Calendar.getInstance()使用了简单工厂模式,根据当前的时区和语言环境返回适合的Calendar实例。 - 装饰器模式:
java.io包中的BufferedInputStream、BufferedReader等类通过装饰器模式增强了基本的InputStream和Reader功能。 - 观察者模式:
java.util.Observer和Observable就是观察者模式的实现,当对象状态发生变化时,观察者会被通知。
12. 1TB 文件如何快速找到想要的数据
对于超大文件的数据处理,可以考虑以下方案:
- 文件分块:将文件分成多个小块并行处理。
- 索引机制:在文件中建立索引,可以通过索引快速定位数据位置,而不必遍历整个文件。
- MapReduce:可以使用分布式计算框架(如 Hadoop)对大文件进行并行处理,通过 MapReduce 等算法快速找到目标数据。
- Bloom Filter:如果只需要快速判断数据是否存在,可以使用布隆过滤器等数据结构。