25年12月26日-福州某科技公司一面面试原题

简介:

面试岗位: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>  # 实时监控指定进程
相关推荐
梁洪飞8 分钟前
clk学习
linux·arm开发·嵌入式硬件·arm
一起养小猫22 分钟前
LeetCode100天Day14-轮转数组与买卖股票最佳时机
算法·leetcode·职场和发展
~光~~37 分钟前
【嵌入式linux驱动——点亮led】基于鲁班猫4 rk3588s
linux·点灯·嵌入式linux驱动
kk哥88991 小时前
如何快速掌握JavaSE的核心语法?
java
我是一只小青蛙8881 小时前
AVL树:平衡二叉搜索树原理与C++实战
java·jvm·面试
yuanmenghao1 小时前
车载Linux 系统问题定位方法论与实战系列 - 车载 Linux 平台问题定位规范
linux·运维·服务器·网络·c++
浩瀚地学1 小时前
【Java】JDK8的一些新特性
java·开发语言·经验分享·笔记·学习
XXOOXRT2 小时前
基于SpringBoot的加法计算器
java·spring boot·后端·html5
阿崽meitoufa2 小时前
JVM虚拟机:垃圾收集器和判断对象是否存活的算法
java·jvm·算法