Java面试一
昨天进行了一次面试,但是问到的基本没有八股,反而是一些其他很实际的问题,回答的不是很好。
QAQ,经验确实是少了。
TCP 协议
TCP(Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层协议。
它主要特点有:
- 面向连接
在传输数据之前需要先建立连接。 - 可靠传输
通过确认应答机制、序列号机制、重传机制来保证数据不丢失、不重复、不乱序。 - 有序传输
通过序列号保证数据按顺序到达。 - 流量控制
通过滑动窗口机制控制发送速率,避免接收方处理不过来。 - 拥塞控制
通过慢启动、拥塞避免等机制避免网络拥堵。
三次握手与四次挥手
三次握手用于建立可靠连接:
- 客户端发送SYN请求。
- 服务端返回SYN+ACK确认。
- 客户端发送ACK确认,连接建立。
四次挥手用于断开连接:
- 主动方发送FIN请求。
- 被动方返回ACK确认。
- 被动方发送FIN请求。
- 主动方返回ACK确认,连接断开。
前后端的交互流程
- 用户在浏览器操作页面,比如点击按钮或提交表单。
- 前端通过 Ajax 或 fetch 发送 HTTP 请求到后端接口。
- 请求会携带参数,请求方式可能是 GET 或 POST。
- 后端 Controller 接收到请求后,调用 Service 处理业务逻辑。
- Service 调用 Mapper 操作数据库。
- 处理完成后,后端返回 JSON 数据给前端。
- 前端接收到响应后,更新页面数据,实现动态渲染。
这里吐槽一下自己太紧张,后端的详细过程都没说出来,前端倒是说差不多了,后端 4-5 步都给略过去了
域名解析的过程
- 浏览器先查询本地 DNS 缓存:如果缓存中有对应的 IP 地址,就直接使用。
- 查询操作系统缓存
- 查询本地 hosts 文件
- 如果都没有命中,则向本地 DNS 服务器发起查询(通常是运营商提供的 DNS)。
- 本地 DNS 服务器开始递归查询:
- 先查询根域名服务器
- 再查询顶级域名服务器(如 .com)
- 再查询权威域名服务器
- 最终获得目标服务器的 IP 地址
- 本地 DNS 将结果返回给浏览器,并缓存起来。
- 浏览器拿到 IP 地址后,开始和服务器建立 TCP 连接。
多应用共 ip 的路由逻辑
如果使用不同端口,操作系统通过端口号将请求分发给不同进程。
如果共用同一个端口,则通过 HTTP 请求头中的 Host 字段进行区分,Web 服务器根据域名匹配对应应用,这种方式称为虚拟主机。
讲一下 JWT 的流程
- 用户输入账号密码登录
- 后端验证成功后生成 JWT
- 将 Token 返回给前端
- 前端保存 Token(一般放在 localStorage)
- 之后每次请求在请求头中携带 Token
- 后端通过拦截器解析 Token 并验证合法性
这个是因为我简历里写了,然后说了一下… 后面还被吐槽,你都用 redis 了还用这玩意…
也确实,我自己除了第一次做项目,后面也没用过。结束后默默的从简历里删除了 JWT
有MySQL 了为什么还要用Redis
MySQL 主要用于数据的持久化存储,而 Redis 是基于内存的缓存数据库,读写速度更快。
在高并发场景下,如果所有请求都直接访问 MySQL,会给数据库带来较大压力。
使用 Redis 作为缓存,可以减少数据库访问次数,提高系统性能和响应速度。
这里我又紧张了,说成了请求次数,被狠狠指出来了
Java线程池的作用
线程池的作用是管理和复用线程,避免频繁创建和销毁线程带来的性能开销,从而提高系统性能和稳定性。
业务价值
线程池的业务价值在于提升系统并发处理能力、提高接口响应速度、控制资源使用,避免因线程过多导致系统崩溃,从而提高系统稳定性。
具体忘了问什么了,大概是这方面
线上运行的java应用,如何在终端查看报错日志
一般线上 Java 应用都会把日志输出到日志文件中,比如 logs 目录下的 xxx.log 文件。
可以通过 Linux 命令查看日志,比如使用 tail、cat 或 less 命令。
一般使用 tail 和 grep 直接查看错误日志

