gptcache

101 阅读4分钟

1. Spring Boot 启动流程

Spring Boot 启动流程大致可以分为以下几个步骤:

  1. 启动类的 main 方法:Spring Boot 应用通常有一个包含 @SpringBootApplication 注解的启动类,这个类的 main 方法中调用 SpringApplication.run()

  2. SpringApplication.run()

    • 创建 SpringApplication 对象。
    • 确定是否是 Web 应用(决定是否需要启动内嵌的 Tomcat 等容器)。
    • 加载应用的配置文件,准备环境(比如 application.propertiesapplication.yml)。
    • 执行一系列的初始化步骤(例如启动监听器)。
  3. 创建并刷新 Spring 应用上下文:Spring Boot 会创建 ApplicationContext,并通过 refresh() 方法启动 Spring 的生命周期管理(包括创建 bean、依赖注入等)。

  4. 启动内嵌的 Tomcat 服务器:如果是 Web 应用,Spring Boot 将启动内嵌的 Tomcat(或其他容器,如 Jetty、Undertow),并将应用部署到这个容器中。

  5. 完成启动:所有 bean 都初始化完成后,Spring Boot 应用进入监听模式,准备接收请求。

2. Tomcat 如何接收 HTTP 请求

Tomcat 是一个 Servlet 容器,工作流程如下:

  1. Socket 监听:Tomcat 启动时,会绑定到指定的端口(默认 8080),并创建一个 ServerSocket 来监听 HTTP 请求。

  2. Acceptor 线程:Tomcat 使用一个 Acceptor 线程不断监听端口上的请求,当有客户端请求到达时,它会将请求 socket 分配给一个 PollerWorker 线程。

  3. 请求解析Worker 线程会解析 HTTP 请求,将其封装为一个 HttpServletRequest 对象,并将其传递给对应的 Servlet。

  4. Servlet 处理:Tomcat 会根据请求的 URL,将请求分发到对应的 Servlet,Servlet 处理完请求后生成响应。

  5. 响应返回: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 虽然有垃圾回收机制,但依然可能发生内存泄漏。常见的内存泄漏排查步骤:

  1. 使用 jmap 生成堆快照(heap dump)。
    jmap -dump:format=b,file=heap_dump.hprof <pid>
    

11. JDK 源码中的常见设计模式

  • 单例模式Runtime 类就是单例模式的经典实现,保证 JVM 运行时环境的唯一实例。
  • 工厂模式Calendar.getInstance() 使用了简单工厂模式,根据当前的时区和语言环境返回适合的 Calendar 实例。
  • 装饰器模式java.io 包中的 BufferedInputStreamBufferedReader 等类通过装饰器模式增强了基本的 InputStreamReader 功能。
  • 观察者模式java.util.ObserverObservable 就是观察者模式的实现,当对象状态发生变化时,观察者会被通知。

12. 1TB 文件如何快速找到想要的数据

对于超大文件的数据处理,可以考虑以下方案:

  1. 文件分块:将文件分成多个小块并行处理。
  2. 索引机制:在文件中建立索引,可以通过索引快速定位数据位置,而不必遍历整个文件。
  3. MapReduce:可以使用分布式计算框架(如 Hadoop)对大文件进行并行处理,通过 MapReduce 等算法快速找到目标数据。
  4. Bloom Filter:如果只需要快速判断数据是否存在,可以使用布隆过滤器等数据结构。