计算机基础与 Linux 面试题精选
Java 后端真实面试专题 · 计算机基础与 Linux 篇
网络、操作系统、Linux、部署——基础课但面试爱穿插问,外包/国企尤其爱考。每题三段: ① 标准答(讲透)→ ② 拓展(成体系带出关联点)→ ③ 怎么接到你自己的项目/工作。
年限标签:
🟢 3年内🔴 3年+
一、网络
1. 🟢 TCP 三次握手的过程?为什么是三次不是两次?
标准答:建立连接确认双方收发能力都正常——
- 客户端发 SYN(我要连)。
- 服务端回 SYN + ACK(收到,我也要连)。
- 客户端回 ACK(收到)。 为什么不是两次:两次的话,服务端无法确认客户端的接收能力,且可能因为旧的重复连接请求(延迟到达的 SYN)建立无效连接、浪费资源。三次才能双向确认收发能力。
拓展:
- "为什么不是四次?"——服务端的 SYN 和 ACK 可以合并成一次,所以三次就够。
- 引出 SYN 洪泛攻击(半连接队列被占满)及防护(SYN Cookie)。
往项目引 ⭐:"理解三次握手帮我排查过连接问题——比如 OpenFeign 第一次调用慢,部分原因就是建连(握手 + 连接池冷启动)。知道连接建立成本,我项目就用了连接池复用连接。"
2. 🟢 TCP 四次挥手的过程?为什么是四次?
标准答:关闭连接——① 主动方发 FIN(我没数据了);② 被动方回 ACK(知道了,但我可能还有数据);③ 被动方数据发完发 FIN;④ 主动方回 ACK。四次的原因:被动方收到 FIN 后,ACK 和自己的 FIN 不能合并(可能还有数据要发完),所以分两步。
拓展:
- "为什么主动方最后要等 2MSL(TIME_WAIT)?"——确保最后的 ACK 到达对方、让旧连接的报文在网络中消散。
- 大量 TIME_WAIT 是高并发短连接的常见问题(可调内核参数)。
往项目引 ⭐:"我排查过服务器大量 TIME_WAIT——是短连接太多。理解四次挥手和 TIME_WAIT 后,改用长连接 + 连接池复用,TIME_WAIT 明显下降。"
3. 🟢 TCP 和 UDP 的区别?分别用在什么场景?
标准答:
- TCP:面向连接、可靠(确认重传、有序)、有流量/拥塞控制,开销大。用于要求可靠的——HTTP、文件传输、数据库连接。
- UDP:无连接、不可靠、不保证顺序,但快、开销小。用于实时性优先、能容忍丢包的——视频直播、语音、DNS、游戏。
拓展:
- "怎么让 UDP 可靠?"——应用层自己做(如 QUIC/HTTP3 在 UDP 上实现可靠)。
- TCP 的可靠靠序号 + 确认 + 重传 + 滑动窗口。
往项目引 ⭐:"我项目业务接口都基于 TCP(HTTP)保证可靠;理解 UDP 的低延迟特性,知道为什么直播、语音这类场景用它——能根据'要可靠还是要快'选协议。"
4. 🟢 HTTP 的 GET 和 POST 有什么区别?
标准答:
- GET:参数在 URL、有长度限制、会被缓存和记录在历史、幂等且安全(只查询),用于获取数据。
- POST:参数在请求体、无长度限制、不被缓存、非幂等,用于提交数据。
拓展:
- "本质区别?"——语义不同(GET 查、POST 改),RESTful 里更看重语义。
- GET 参数在 URL 不适合传敏感信息。
- 严格说 GET 也能带 body,但不推荐。
往项目引 ⭐:"我项目按 RESTful 语义用——查询用 GET、创建用 POST、更新 PUT、删除 DELETE。理解幂等性也帮我设计接口:GET/PUT/DELETE 天然幂等,POST 要额外做幂等防重。"
5. 🟢 常见的 HTTP 状态码有哪些?
标准答:
- 2xx:成功(200 OK、201 Created、204 No Content)。
- 3xx:重定向(301 永久、302 临时、304 协商缓存命中)。
- 4xx:客户端错误(400 参数错、401 未认证、403 无权限、404 找不到、429 限流)。
- 5xx:服务端错误(500 内部错误、502 网关错误、503 不可用、504 网关超时)。
拓展:
- "401 和 403 区别?"——401 没登录/认证失败,403 登录了但没权限。
- "502 和 504 区别?"——502 网关收到无效响应、504 网关等后端超时。
往项目引 ⭐:"我项目接口按状态码规范返回——未认证 401、无权限 403、限流 429、系统错 500,前端按状态码统一处理。排查线上问题时看到 502/504 就知道是网关到后端的问题,缩小排查范围。"
6. 🔴 在浏览器输入一个 URL 到页面展示,发生了什么?
标准答:① DNS 解析域名拿 IP → ② 和服务器 TCP 三次握手(HTTPS 还有 TLS 握手)→ ③ 发送 HTTP 请求 → ④ 服务器处理返回响应 → ⑤ 浏览器解析渲染(构建 DOM/CSSOM、布局、绘制)→ ⑥ 四次挥手关闭连接(或保持长连接)。
拓展:
- 每一步都能往深挖(DNS 缓存、CDN、负载均衡、网关路由到微服务)。
- 后端视角重点在"请求怎么到服务、怎么处理、怎么返回"。
往项目引 ⭐:"这题能把我整个项目架构串起来讲——请求经 DNS/CDN → 负载均衡 → 网关(鉴权限流)→ 微服务 → DB/缓存 → 返回。后端面试我会重点讲'到了我服务之后'的链路。"
二、操作系统
7. 🟢 进程、线程、协程的区别?
标准答:
- 进程:资源分配的基本单位,有独立内存空间,开销大、隔离好。
- 线程:CPU 调度的基本单位,同进程内线程共享内存,开销小、通信方便但要同步。
- 协程:用户态的轻量"线程",由程序自己调度、不切内核态,开销极小,适合高并发 IO(如 Go 的 goroutine)。
拓展:
- "为什么有了进程还要线程?"——线程切换比进程轻、共享内存通信方便、能更好利用多核。
- Java 的虚拟线程(JDK21)就是类似协程的思路,解决高并发下线程太重的问题。
往项目引 ⭐:"理解三者帮我理解线程池——为什么不每个任务开新线程(开销大),而是用线程池复用。也关注到 JDK21 虚拟线程,本质是用更轻的调度单位扛高并发 IO。"
8. 🟢 操作系统为什么要加锁?用户态和内核态了解吗?
标准答:加锁是为了保护共享资源,避免多线程/进程并发访问导致数据不一致(竞态条件)。用户态/内核态:CPU 两种权限级别,用户程序跑在用户态,执行系统调用(IO、内存分配)要切到内核态。切换有开销。
拓展:
- "重量级锁为什么慢?"——要切到内核态做线程阻塞/唤醒。这也是 synchronized 锁升级(先用户态自旋)的原因。
- 系统调用、IO、线程切换都涉及态切换。
往项目引 ⭐:"理解用户态/内核态切换的成本,让我明白为什么 synchronized 先偏向锁/轻量级锁自旋(用户态)、实在不行才升级重量级锁(切内核态阻塞),也理解了为什么频繁 IO/线程切换性能差。"
三、Linux 与部署
9. 🟢 常用的 Linux 命令有哪些?
标准答:
- 查看:
ls、cd、pwd、cat、tail -f(实时看日志)、less。 - 查找:
grep(搜内容)、find(找文件)、awk/sed(文本处理)。 - 进程:
ps -ef | grep、top、kill -9。 - 网络:
netstat/ss(看端口)、curl、ping。 - 资源:
df -h(磁盘)、free -m(内存)。
拓展:
- 排查问题常用组合:
ps -ef | grep 应用名找 pid、tail -f 日志 | grep 关键字看实时日志。 top -Hp pid看线程(排查 CPU)。
往项目引 ⭐:"我项目部署在 Linux,排查问题离不开这些——tail -f + grep 实时追日志、ps/netstat 看进程端口、top 看负载、df/free 看资源。这些是后端日常。"
10. 🟢 一个 jar 包怎么部署到服务器?有哪些启动参数?
标准答:SpringBoot 打成可执行 jar,用 java -jar app.jar 启动,常配参数:
- 后台运行:
nohup java -jar app.jar > app.log 2>&1 &。 - JVM 参数:
-Xms/-Xmx(堆)、-XX:+UseG1GC、-XX:+HeapDumpOnOutOfMemoryError。 - Spring 参数:
--spring.profiles.active=prod、--server.port=8080。
拓展:
- 看进程
ps -ef | grep app、看日志tail -f app.log、停kill pid。 - 生产更规范是用容器(Docker/K8s)或脚本/CICD 部署。
往项目引 ⭐:"我项目早期用 nohup java -jar + JVM 参数(堆大小、GC、OOM dump)启动;后来上了 Docker + CI/CD 自动部署。能讲清启动参数和怎么看进程日志就够日常用。"
11. 🟢 Docker 是什么?解决了什么问题?常用命令?
标准答:Docker 是容器化技术,把应用和依赖打包成镜像,在任何环境用容器一致运行,解决"在我机器上能跑、到别的环境不行"的环境一致性问题,且轻量(共享内核、比虚拟机快)。常用:docker build(构建镜像)、docker run(启动容器)、docker ps、docker logs、docker-compose up(一键起多个服务)。
拓展:
- "Docker 和虚拟机区别?"——容器共享宿主机内核、秒级启动、资源占用小;虚拟机有完整 OS、重。
- 镜像分层、Dockerfile 定义构建。
- 大规模容器编排用 K8s。
往项目引 ⭐:"我项目用 Docker 容器化部署——保证开发/测试/生产环境一致,用 docker-compose 一键起 MySQL、Redis、应用做本地开发。理解'环境一致 + 轻量'就知道为什么要容器化。"
12. 🔴 服务的打包发布流程(CI/CD)是怎样的?
标准答:代码提交 → 触发 CI(拉代码、编译、跑单测、构建镜像)→ 推镜像仓库 → CD 部署到环境(测试/预发/生产)→ 健康检查 → 灰度/全量。常用工具 Jenkins、GitLab CI、阿里云效。
拓展:
- 配合灰度发布、回滚机制降低上线风险。
- 分支策略(如 GitFlow)+ 代码评审 + 自动化测试保证质量。
往项目引 ⭐:"我项目用 GitLab CI/CD——提 MR、过流水线(编译 + 单测 + 构建镜像)、合并后自动部署到测试,生产手动确认 + 灰度。能讲清'提交到上线'的完整流程体现工程规范。"
13. 🟢 git 工作流?新来一个任务你怎么开发?
标准答:从主干拉一个 feature 分支开发 → 提交 → 推到远程 → 提 MR/PR 请同事 code review → 通过后合并到开发/主干 → CI 自动构建部署。常用命令 git pull、git checkout -b、git add/commit/push、git merge/rebase。
拓展:
- 分支策略:主分支保护、feature 分支开发、release 分支发布、hotfix 修紧急 bug。
- 冲突解决、rebase vs merge 的区别。
往项目引 ⭐:"我项目用 feature 分支 + MR + code review 的流程——新任务从 develop 拉分支开发、自测、提 MR review、合并触发部署。这套流程体现团队协作规范,面试官爱问。"
14. 🔴 生产环境出了问题(接口报错/变慢)你怎么排查?
标准答:
- 看监控告警:定位是哪个服务、什么指标异常(错误率、耗时、CPU、内存)。
- 看日志:用 traceId 串起一次请求的全链路日志(
grep traceId),找报错点。 - 链路追踪:SkyWalking 看慢在哪段(SQL?下游?)。
- 看资源:
top/free/df看机器、看 GC 日志。 - 定位 + 修复 + 复盘。
拓展:
- 紧急时先止血(限流、降级、回滚、扩容)再定位根因。
- Arthas 能在线诊断(看方法入参、耗时、线程)。
往项目引 ⭐:"我项目线上问题排查是'监控告警 → traceId 串日志 → 链路追踪定位 → 看资源/GC'这套流程,紧急时先回滚/降级止血。有完整的排查方法论,比只会看单机日志强。"
15. 🟢 怎么查一个端口被哪个进程占用?怎么看实时日志?
标准答:
- 查端口:
netstat -anp | grep 端口或ss -lntp | grep 端口或lsof -i:端口。 - 看实时日志:
tail -f app.log,配合grep过滤关键字:tail -f app.log | grep ERROR。 - 查历史日志关键字:
grep -n '关键字' app.log、grep -A 10 -B 5(看上下文)。
拓展:
- 看大日志用
less(可搜索)、统计用grep -c、awk。 - 按 traceId 聚合一次请求日志是微服务排查的关键。
往项目引 ⭐:"我项目排查日常就靠 tail -f | grep 追实时日志、grep traceId 聚合一次请求的全链路日志。端口冲突就 lsof -i:端口 找占用进程。这些是后端基本功。"
16. 🟢 Nginx 是干什么的?
标准答:Nginx 是高性能的 Web 服务器 / 反向代理,常用来:反向代理(转发到后端服务)、负载均衡(把请求分发到多台后端)、静态资源服务、SSL 终结、限流。
拓展:
- 负载均衡策略:轮询、加权、ip_hash、最少连接。
- Nginx 高性能靠 epoll 事件驱动 + 多 worker 进程。
- 和网关(Gateway)的区别:Nginx 偏接入层/七层代理,网关偏业务路由 + 鉴权限流。
往项目引 ⭐:"我项目用 Nginx 做接入层——反向代理 + 负载均衡分发到多个网关实例 + 配 HTTPS + 静态资源。Nginx 在前、业务网关在后,各司其职。"
17. 🟢 同步和异步、阻塞和非阻塞的区别?
标准答:
- 同步/异步:关注结果通知方式——同步要主动等结果,异步是结果好了通知你(回调)。
- 阻塞/非阻塞:关注等待时线程状态——阻塞是线程挂起等,非阻塞是不挂起、轮询。 组合:BIO(同步阻塞)、NIO(同步非阻塞)、AIO(异步非阻塞)。
拓展:
- IO 多路复用(select/poll/epoll)让一个线程管多个连接,是 NIO/Netty/Redis 高并发的基础。
- "什么时候用异步?"——耗时、不需要立即结果的(发通知、写日志)。
往项目引 ⭐:"我项目下单后发通知用异步(MQ),主流程不等;网络框架(如 Netty/NIO)用 IO 多路复用一个线程管大量连接。理解这两组概念才能讲清高并发网络模型。"
18. 🟢 字符编码(UTF-8、乱码)了解吗?
标准答:字符编码是字符和字节的映射规则。UTF-8 是变长编码(中文 3 字节)、兼容 ASCII、最通用。乱码通常是"编码和解码用的字符集不一致"(如 UTF-8 存、GBK 读)。
拓展:
- 全链路统一 UTF-8(数据库、连接、页面、文件)防乱码。
- 一个中文在 UTF-8 占 3 字节、GBK 占 2 字节。
往项目引 ⭐:"我项目数据库、连接串、页面统一 UTF-8(characterEncoding=utf8),排查过导出 Excel 中文乱码——就是编码不一致,统一字符集解决。"
19. 🟢 你们的日志怎么收集和查看?
标准答:单机看 tail/grep;分布式用日志平台 ELK(Elasticsearch + Logstash + Kibana) 或类似——各服务日志采集汇总、ES 存储检索、Kibana 可视化查询,配合 traceId 串起一次请求的全链路日志。
拓展:
- 日志要打 traceId、分级别(ERROR/WARN/INFO)、关键节点打点。
- 别打太多无用日志(影响性能和存储)。
往项目引 ⭐:"我项目日志用 ELK 收集,每条日志带 traceId,线上排查在 Kibana 按 traceId 一搜就能看到一次请求经过的所有服务的日志——比登录每台机器翻日志高效太多。"
20. 🔴 一个请求 QPS 1000+ 是怎么算的?峰值怎么扛?
标准答:QPS = 总请求数 / 时间(秒)。评估系统能扛多少:QPS ≈ 并发数 / 平均响应时间。扛峰值的手段:缓存(减 DB 压力)、异步/MQ 削峰、限流(保护系统)、水平扩容(多实例 + 负载均衡)、读写分离/分库分表。
拓展:
- 压测(JMeter)得出系统真实承载能力。
- 监控 QPS、RT、错误率,提前扩容。
往项目引 ⭐:"我项目峰值 QPS 几千,靠'缓存扛读 + MQ 削峰 + 限流保护 + 多实例水平扩容'扛住。能说出 QPS 怎么估、用哪些手段扛峰值,体现你有容量和高并发意识。"
你能答到第几层?
- 三段都能答、还能接到项目/排查经历:基础 + 工程能力俱全,很全面。
- 标准答 + 拓展能成体系答:知识够,差接到一次真实排查或部署经历。
- 标准答都磕巴:这块是后端日常地基(网络 → OS → Linux → 部署排查),边做边补一遍就熟。
这是面试专题的「计算机基础与 Linux 篇」,网站上还有并发、MySQL、Redis、Spring、微服务、消息队列、JVM、安全认证、Java基础、项目场景等系统整理。 🌐 更多真实面试专题与资料:smallredtech.com 💬 想系统学 / 简历与辅导咨询,加微信:Ahongbb666(备注「面试题」)