简介:
面试岗位:Java软件开发工程师
需要经验:1-3年
流程:电话面试(大约30分钟)
文章目录
-
- 一、第一阶段:公司介绍+自我介绍
- 二、第二阶段:八股文(编码相关)
-
-
- [1.1 介绍Java中的线程池,并且说出有哪些线程池](#1.1 介绍Java中的线程池,并且说出有哪些线程池)
-
- [1.1.1 JDK预定义的5种核心线程池](#1.1.1 JDK预定义的5种核心线程池)
- [1.1.2 自定义线程池(ThreadPoolExecutor)](#1.1.2 自定义线程池(ThreadPoolExecutor))
- [1.2 Spring Boot与Spring Cloud的区别](#1.2 Spring Boot与Spring Cloud的区别)
-
- [1.2.1 核心区别对比](#1.2.1 核心区别对比)
- [1.2.2 核心功能](#1.2.2 核心功能)
-
- 三、第二阶段:八股文(运维相关)
-
-
- [2.1.1 Docker镜像与仓库的关系?](#2.1.1 Docker镜像与仓库的关系?)
- [2.1.2 Docker常用命令有哪些?](#2.1.2 Docker常用命令有哪些?)
- [2.2 K8s(Kubernetes)简述?](#2.2 K8s(Kubernetes)简述?)
-
- [2.2.1 核心功能](#2.2.1 核心功能)
- [2.2.2 核心组件与资源](#2.2.2 核心组件与资源)
- [2.3 Linux 命令](#2.3 Linux 命令)
-
- [2.3.1 查看内存使用命令有哪些?](#2.3.1 查看内存使用命令有哪些?)
- [2.3.2 查看进程命令有哪些?](#2.3.2 查看进程命令有哪些?)
- [2.3.3 实用组合技巧](#2.3.3 实用组合技巧)
-
一、第一阶段:公司介绍+自我介绍
介绍该公司主要是对军工项目进行开发的,需要内网开发,需要主要精通的技术:java并发、docker、k8s、Linux
二、第二阶段:八股文(编码相关)
1.1 介绍Java中的线程池,并且说出有哪些线程池
总结:
Java中存在已经定义要的线程池工具类:Executors,以及自定义线程池类:ThreadPoolExecutor
Java中线程池主要分为「JDK预定义常用线程池」(通过Executors工具类创建)和「自定义线程池」(通过ThreadPoolExecutor手动创建),此外Java 8新增了适用于分治任务的ForkJoinPool。
1.1.1 JDK预定义的5种核心线程池
- 固定线程池(newFixedThreadPool):核心线程数=最大线程数,无界队列,适用于任务数量固定、执行时间较长的场景,存在OOM风险。
- 单线程线程池(newSingleThreadExecutor):核心线程数=最大线程数=1,无界队列,任务串行执行,线程异常时自动重建。
- 缓存线程池(newCachedThreadPool):核心线程数=0,最大线程数无限大,60秒空闲回收,同步队列,适用于短任务、任务量波动大的场景,可能创建大量线程导致CPU过高或OOM。
- 定时/周期性线程池(newScheduledThreadPool):核心线程数固定,最大线程数无限大,延迟队列,支持延迟执行和周期性执行任务。
- 单线程定时线程池(newSingleThreadScheduledExecutor):newScheduledThreadPool的单线程版本,任务串行定时执行。
1.1.2 自定义线程池(ThreadPoolExecutor)
阿里巴巴Java开发手册推荐手动创建,可灵活控制参数,避免OOM风险,核心构造参数包括:核心线程数、最大线程数、空闲超时时间、时间单位、任务队列、线程工厂、拒绝策略。常用有界队列(如ArrayBlockingQueue)和合理拒绝策略(如CallerRunsPolicy)。
备注:并没有问线程池的具体执行流程,但是我们也要掌握的哈。
大致流程:走核心线程>不够 ,走任务队列>走 最大线程>不够,拒绝策略。
1.2 Spring Boot与Spring Cloud的区别
核心结论:Spring Boot是「快速开发单个微服务」的基础框架,Spring Cloud是「管理多个微服务」的分布式架构套件,Spring Cloud依赖Spring Boot实现,二者互补而非竞争。
1.2.1 核心区别对比
| 对比维度 | Spring Boot | Spring Cloud |
|---|---|---|
| 核心定位 | 快速构建单个独立Java应用(微服务/单体) | 构建分布式微服务架构的一站式解决方案 |
| 依赖关系 | 可独立使用,无依赖 | 必须依赖Spring Boot |
| 解决问题 | 简化Spring应用配置、开发、部署、监控 | 微服务间通信、注册发现、配置中心等分布式问题 |
| 应用场景 | 单个微服务、单体应用开发 | 多微服务协作的分布式系统(如电商平台) |
1.2.2 核心功能
- Spring Boot:自动配置、起步依赖、内嵌服务器、Actuator监控。
- Spring Cloud:服务注册发现(Nacos/Eureka)、服务调用(OpenFeign)、配置中心(Nacos/Config)、熔断降级(Sentinel/Hystrix)、网关(Gateway)、链路追踪(Sleuth+Zipkin)。
三、第二阶段:八股文(运维相关)
2.1.1 Docker镜像与仓库的关系?
- Docker镜像:只读的、不可修改的模板,包含应用运行所需全部文件(代码、依赖、配置等),是创建容器的基础。采用分层存储,通过"镜像名:标签"唯一标识(如nginx:1.25),支持导出(save)、导入(load)、删除(rmi)等操作。
- Docker仓库:集中存储和分发镜像的平台,分为公有仓库(如Docker Hub、阿里云镜像服务)和私有仓库(如Harbor)。核心操作包括登录(login)、镜像打标签(tag)、推送(push)、拉取(pull)。
关联关系:仓库存储镜像 → 镜像生成容器(运行实例),构成Docker应用分发与运行链路。
2.1.2 Docker常用命令有哪些?
(1)镜像操作
bash
docker pull <镜像名:标签> # 拉取镜像
docker images / docker image ls # 查看本地镜像
docker rmi <镜像ID/名称> # 删除镜像
docker save -o <文件.tar> <镜像名:标签> # 导出镜像
docker load -i <文件.tar> # 导入镜像
(2)容器操作
bash
docker run -d -p 主机端口:容器端口 --name 容器名 <镜像名:标签> # 创建并启动容器
docker ps # 查看运行中容器(-a查看所有)
docker start/stop/restart <容器ID/名称> # 启动/停止/重启容器
docker rm <容器ID/名称> # 删除容器(-f强制删除运行中容器)
docker exec -it <容器ID/名称> /bin/bash # 进入容器交互终端
docker logs -f <容器ID/名称> # 实时查看容器日志
docker inspect <容器ID/名称> # 查看容器详细信息
(3)数据卷与网络
bash
docker volume create <卷名> # 创建数据卷(持久化数据)
docker volume ls # 查看数据卷
docker network create <网络名> # 创建自定义网络(容器间通信)
docker network connect <网络名> <容器名> # 容器加入网络
2.2 K8s(Kubernetes)简述?
K8s是开源的分布式集群管理平台,用于自动化部署、扩缩容和管理容器化应用,核心定位是「容器的管家」,解决大量容器的编排与运维问题。
2.2.1 核心功能
- 自动化部署:按配置自动在集群节点部署容器
- 扩缩容:支持手动/自动调整容器实例数量,应对流量波动
- 故障自愈:容器/节点故障时自动重启实例,保障高可用
- 服务发现与负载均衡:内置注册发现,请求均匀分发到多个实例
- 滚动更新与回滚:无停机更新应用,支持快速回滚旧版本
- 存储编排:支持本地/网络存储挂载,实现数据持久化
2.2.2 核心组件与资源
- 集群架构:控制平面(Master,负责管理)包含kube-apiserver(统一入口)、etcd(数据库)、kube-scheduler(调度器)、kube-controller-manager(控制器);工作节点(Node,负责运行应用)包含kubelet(节点代理)、kube-proxy(网络代理)、容器运行时(如Docker)。
- 核心资源:Pod(最小部署单元)、Deployment(应用部署管理)、Service(服务暴露与负载均衡)、ConfigMap/Secret(配置存储)。
2.3 Linux 命令
2.3.1 查看内存使用命令有哪些?
- free -h:以人类可读格式(KB/MB/GB)显示物理内存和swap使用,关注available(实际可用内存)。
- top:实时监控内存+CPU使用,按M键按内存使用率排序,按q退出。
- vmstat 2 5:查看内存换入换出情况(si/so字段),排查内存瓶颈。
2.3.2 查看进程命令有哪些?
- ps aux:查看所有进程详细信息(用户、PID、CPU/内存占用),--sort=-%mem按内存排序,--sort=-%cpu按CPU排序。
- top:实时监控进程动态,支持终止进程(k键输入PID)。
- pstree -p:树状显示进程父子关系,包含PID。
- pgrep <进程名>:快速查找进程PID。
2.3.3 实用组合技巧
bash
ps aux --sort=-%mem | head -6 # 查看内存占用前5的进程
ps aux --sort=-%cpu | head -6 # 查看CPU占用前5的进程
top -p <PID> # 实时监控指定进程