# Java面试一

> 第一次面试

发布：2026-02-27 | 分类：计算机 | 标签：Java、面试


昨天进行了一次面试，但是问到的基本没有八股，反而是一些其他很实际的问题，回答的不是很好。

QAQ，经验确实是少了。

## TCP 协议

TCP（Transmission Control Protocol）是一种面向连接的、可靠的、基于字节流的传输层协议。

它主要特点有：

1. 面向连接  
   在传输数据之前需要先建立连接。
2. 可靠传输  
   通过确认应答机制、序列号机制、重传机制来保证数据不丢失、不重复、不乱序。
3. 有序传输  
   通过序列号保证数据按顺序到达。
4. 流量控制  
   通过滑动窗口机制控制发送速率，避免接收方处理不过来。
5. 拥塞控制  
   通过慢启动、拥塞避免等机制避免网络拥堵。

### 三次握手与四次挥手

**三次握手**用于建立可靠连接：

1. 客户端发送SYN请求。
2. 服务端返回SYN+ACK确认。
3. 客户端发送ACK确认，连接建立。

**四次挥手**用于断开连接：

1. 主动方发送FIN请求。
2. 被动方返回ACK确认。
3. 被动方发送FIN请求。
4. 主动方返回ACK确认，连接断开。

## 前后端的交互流程

1. 用户在浏览器操作页面，比如点击按钮或提交表单。
2. 前端通过 Ajax 或 fetch 发送 HTTP 请求到后端接口。
3. 请求会携带参数，请求方式可能是 GET 或 POST。
4. 后端 Controller 接收到请求后，调用 Service 处理业务逻辑。
5. Service 调用 Mapper 操作数据库。
6. 处理完成后，后端返回 JSON 数据给前端。
7. 前端接收到响应后，更新页面数据，实现动态渲染。

> 这里吐槽一下自己太紧张，后端的详细过程都没说出来，前端倒是说差不多了，后端 4-5 步都给略过去了

## 域名解析的过程

1. 浏览器先查询本地 DNS 缓存：如果缓存中有对应的 IP 地址，就直接使用。
2. 查询操作系统缓存
3. 查询本地 hosts 文件
4. 如果都没有命中，则向本地 DNS 服务器发起查询（通常是运营商提供的 DNS）。
5. 本地 DNS 服务器开始递归查询：
   - 先查询根域名服务器
   - 再查询顶级域名服务器（如 .com）
   - 再查询权威域名服务器
   - 最终获得目标服务器的 IP 地址
6. 本地 DNS 将结果返回给浏览器，并缓存起来。
7. 浏览器拿到 IP 地址后，开始和服务器建立 TCP 连接。

## 多应用共 ip 的路由逻辑

如果使用不同端口，操作系统通过端口号将请求分发给不同进程。  
如果共用同一个端口，则通过 HTTP 请求头中的 Host 字段进行区分，Web 服务器根据域名匹配对应应用，这种方式称为虚拟主机。

## 讲一下 JWT 的流程

1. 用户输入账号密码登录
2. 后端验证成功后生成 JWT
3. 将 Token 返回给前端
4. 前端保存 Token（一般放在 localStorage）
5. 之后每次请求在请求头中携带 Token
6. 后端通过拦截器解析 Token 并验证合法性

## 有MySQL 了为什么还要用Redis

MySQL 主要用于数据的持久化存储，而 Redis 是基于内存的缓存数据库，读写速度更快。  
在高并发场景下，如果所有请求都直接访问 MySQL，会给数据库带来较大压力。  
使用 Redis 作为缓存，可以减少<mark style="color:#bf616a">数据库访问次数</mark>，提高系统性能和响应速度。

> 这里我又紧张了，说成了请求次数，被狠狠指出来了

## Java线程池的作用

线程池是一种**预先创建并复用线程**的机制，通过统一管理线程生命周期，减少频繁创建/销毁线程的开销，从而提升系统性能与响应速度。Java 中的核心实现类是 **_ThreadPoolExecutor_**，它基于任务队列、核心线程数、最大线程数及拒绝策略来调度任务。

### 业务价值

线程池的业务价值在于提升系统并发处理能力、提高接口响应速度、控制资源使用，避免因线程过多导致系统崩溃，从而提高系统稳定性。

> 具体忘了问什么了，大概是这方面

## 线上运行的java应用，如何在终端查看报错日志

一般线上 Java 应用都会把日志输出到日志文件中，比如 logs 目录下的 xxx.log 文件。  
可以通过 Linux 命令查看日志，比如使用 tail、cat 或 less 命令。

> 一般使用 tail 和 grep 直接查看错误日志
