面试系列|蚂蚁金服技术面【2】
今天继续分享一下蚂蚁金服的 Java 后端开发岗位真实社招面经,复盘面试过程中踩过的坑,整理面试过程中提到的知识点,希望能给正在准备面试的你一些参考和启发,希望对你有帮助,愿你能够获得心仪的 offer !

第一轮面试完成后的第二天收到电话通知简历面过了,是另外一位面试官打的,通知进行下一轮面试。还是约的是晚上 8 点,不过这次的面试官应该是在忙事情,通过电话沟通,应该还在加班,大概推迟了半个小时,这一次是视频远程面试,需要开摄像头,并且有笔试环节,下面是面试时语音实录复盘。
面试官:首先简单自我介绍一下。
候选者:好的,balabala…(按照提前准备的进行答复)。
面试官:讲一下自己现在所负责的项目。
候选者:好的,balabala…(按照提前准备的进行答复)。
面试官:说一下你负责这个项目模块的架构设计及原因?
候选者:嗯,自己负责的这个项目的架构设计主要考虑以下几个方面。
候选者:首先考虑微服务架构,各模块职责单一、独立部署、独立扩容。
候选者:其次考虑高可用性 , 用户登录状态和数据存储在 Redis 中。这样服务可以在任意节点处理请求实现负载均衡。通过 Nginx 进行负载均衡,并集成 Sentinel 做熔断降级,保证服务在高峰期稳定运行。
候选者:还考虑了可扩展性,支持横向扩容, 服务节点可以动态增加或减少,并通过 Nacos + Spring Cloud Gateway 实现自动注册与发现,从而支持弹性伸缩。
面试官:你有没有处理过 CPU 高和 内存 高的问题,如何排查的?
候选者:有遇到过,首先要排查定位到具体原因。CPU 高的排查方法可以使用 top 命令检查占用 CPU 较高的进程,再使用 jstack 查看线程堆栈,分析是否有死循环或锁竞争。内存高排查方法可以使用 jmap 分析内存快照,查找内存泄漏。
面试官: 如何解决项目中锁竞争比较频繁的情况?
候选者: 嗯…(思考中)有的,主要是通过几个方式应对。
候选者: 使用 读写锁(如 ReentrantReadWriteLock)降低写锁的竞争;使用 分段锁(如 ConcurrentHashMap);使用 CAS 操作(如 AtomicInteger, AtomicReference 等);缩小锁的粒度,避免锁住大块代码。
面试官: 就项目中遇到过什么比较有挑战性的问题,说说如何分析与解决?
候选者: 第一个挑战是项目中遇到的高并发环境下的性能瓶颈分析与优化,通过查看系统的资源消耗情况(CPU 、 内存 、磁盘 IO 、网络等)定位到具体的性能瓶颈,分析数据库、缓存、 消息队列等是否是瓶颈。查看是否有锁竞争、 死锁等问题。进行缓存优化、数据库优化、SQL查询优化、异步处理、线程池调优等操作提升性能。持续监控确保优化操作后避免新的瓶颈再次出现。
候选者: 第二个挑战是系统的高可用性 与系统容灾设计,系统在遭遇数据中心故障时,如何确保高可用性。主要考虑进行多数据中心部署:分析当前系统是否仅部署在单一数据中心,是否存在单点故障问题。负载均衡与流量切换:确认流量切换策略是否合理,是否能在发生故障时迅速切换到备用数据中心。备份与恢复:检查数据的备份策略是否能满足灾难恢复的要求,尤其是实时备份和快速恢复。
面试官: 死锁问题的分析与具体解决办法(具体排查思路与实践过程)?
候选者: 排查步骤可以使用 jstack 检查线程堆栈,分析死锁状态,分析日志,找到涉及的锁对象,使用死锁检测工具,如 Arthas 进行排查。发现死锁分析解决办法,可以通过避免嵌套锁,使用 tryLock 尝试获取锁,避免阻塞。
面试官:解释一下 MySQL 中的幻读?
候选者:(八股文来了,这题我熟)幻读指的是在同一事务内,多次执行相同查询,结果集却发生了变化,比如事务 A 先查询 WHERE age > 18,事务 B 插入一条 age = 20 的数据,事务 A 再次查询时,结果发生了变化。这种现象通常出现在 REPEATABLE READ 隔离级别下。
面试官:那么幻读问题如何解决?
候选者: (开始继续追问,稳住)MySQL 主要通过 间隙锁(Gap Lock) 解决幻读问题,它会锁住查询范围内的间隙,防止其他事务插入新数据。例如 SELECT … FOR UPDATE 在可重复读级别下会锁住查询范围,避免新数据插入导致幻读。此外,升级到 Serializable 隔离级别 也能彻底避免幻读,但代价较高,会影响并发性能。
面试官:你提到间隙锁,那么说一下间隙锁死锁原因与排查思路,如何预防?
候选者: 嗯…(三连问,GG,要思考一下,当时没有答好)首先形成死锁的情况主要有 (1)事务锁定范围重叠,相互等待。(2)索引未命中,触发不必要的间隙锁。(3)并发插入,多个事务尝试插入相同区间数据。
候选者: 排查思路:可以通过 SHOW ENGINE INNODB STATUS\G 查死锁详情。以及 SHOW PROCESSLIST 查看等待锁的事务。
候选者: 可以使用唯一索引,减少间隙锁。避免大范围 FOR UPDATE,改用主键锁定。降低隔离级别(如 READ COMMITTED)。固定事务顺序,避免交叉锁。
面试官:好的,我们继续, redolog 日志在磁盘上的存储方式?落盘的策略有哪些?
候选者: 存储方式是通过 Redo Log 循环写的固定大小日志文件;落盘策略是 innodb_flush_log_at_trx_commit 控制落盘频率参数:0: 每秒刷新到磁盘、1: 每次事务提交时刷新 2: 每次提交时写入系统缓存,每秒刷新到磁盘。
面试官: RabbitMQ的镜像集群与普通集群有什么区别,如何保证高可用,消息的持久化机制?
候选者: 嗯…(当时不知道,思考片段后还是直说不知道)这个自己不熟悉。(下来看了下复盘知识点镜像集群所有节点都存储完整的队列,避免单点故障,缺点: 性能下降,带来更高的同步开销;普通集群: 只有主节点存储队列数据:高可用: 使用 Quorum Queues 或者 镜像队列策略 )。
面试官: ThreadLocal 原理,以及在线程池中使用需要注意什么问题,或者说有没有遇到 ThreadLocal 的坑?
候选者: ThreadLocal 原理为每个线程单独存储变量,避免线程间数据共享。线程池中的问题主要是线程复用导致 ThreadLocal 数据未清理,可能引起内存泄漏。可以使用 ThreadLocal.remove() 手动清理;还有一个问题是ThreadLocal无法跨线程传递变量,这个时候可以使用阿里的 TransmittableThreadLocal (TTL) 来传递变量。
面试官:下面我们做两道题,可以先说一下你的思路
1、算法题:最靠近目标数的和
题目描述: 给定一个整数数组 nums 和一个目标值 target,请从数组中找到三个整数,使得它们的和最接近 target,并返回这个和。
候选者: 思路:排序 + 双指针: 1)先对数组进行排序。2)固定一个数 nums[i],使用双指针 left 和 right 查找最接近 target 的两个数
面试官:说一下时间复杂度和空间复杂度
候选者: 时间复杂度: O(n^2),空间复杂度: O(1)
public int threeSumClosest(int[] nums, int target) {Arrays.sort(nums);int closestSum = Integer.MAX_VALUE;for (int i = 0; i < nums.length - 2; i++) {int left = i + 1, right = nums.length - 1;while (left < right) {int sum = nums[i] + nums[left] + nums[right];if (Math.abs(target - sum) < Math.abs(target - closestSum)) {closestSum = sum;}if (sum < target) {left++;} else {right--;}}}return closestSum;
}
2、考察多线程的熟悉程度:有两个线程,一个打印奇数,一个打印偶数,调度两个线程,升序打印1到100的数字
public class PrintOddEven {private static final Object lock = new Object();private static int count = 1;private static final int MAX = 100;public static void main(String[] args) {Thread oddThread = new Thread(() -> {while (count <= MAX) {synchronized (lock) {// 判断是否是奇数if (count % 2 == 1) {System.out.println(Thread.currentThread().getName() + " : " + count);count++;// 唤醒偶数线程lock.notify();} else {try {// 等待偶数线程打印lock.wait();} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}, "奇数线程");Thread evenThread = new Thread(() -> {while (count <= MAX) {synchronized (lock) {// 判断是否是偶数if (count % 2 == 0) {System.out.println(Thread.currentThread().getName() + " : " + count);count++;// 唤醒奇数线程lock.notify();} else {try {// 等待奇数线程打印lock.wait();} catch (InterruptedException e) {Thread.currentThread().interrupt();}}}}}, "偶数线程");oddThread.start();evenThread.start();}
}
面试官:还有没有其他写法?
候选者:还有可以通过信号量 Semaphore 来进行线程之间的协作。
import java.util.concurrent.Semaphore;public class PrintOddEvenWithSemaphore {private static final int MAX = 100;private static final Semaphore semaphore = new Semaphore(1);private static int count = 1;public static void main(String[] args) {Thread oddThread = new Thread(() -> {while (count <= MAX) {try {// 奇数线程等待信号量semaphore.acquire();// 判断当前是否是奇数if (count % 2 == 1 && count <= MAX) {System.out.println(Thread.currentThread().getName() + " : " + count);count++;}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {// 释放信号量,唤醒偶数线程semaphore.release();}}}, "奇数线程");Thread evenThread = new Thread(() -> {while (count <= MAX) {try {// 偶数线程等待信号量semaphore.acquire();// 判断当前是否是偶数if (count % 2 == 0 && count <= MAX) {System.out.println(Thread.currentThread().getName() + " : " + count);count++;}} catch (InterruptedException e) {Thread.currentThread().interrupt();} finally {// 释放信号量,唤醒奇数线程semaphore.release();}}}, "偶数线程");oddThread.start();evenThread.start();}
}
面试官:那么还有没有其他的?
其实这里还有写法是通过 Condition 来做,当时没有想到,这道题还是比较经典,是面试官常考的一道题。
面试官:还有没有想问我的?
还是照例问了技术栈和团队的主要方向是什么。
面试官: 后续有结果会邮件通知你这边,感谢你参与今天的面试。
第二轮面试大概持续将近有一个小时,由于面试官迟到了一会,面试流程完成后他还主动聊了一会,当然第二轮面试完成后还是照样等通知。
📢 如果对你有帮助的话,还请帮忙点赞 + 收藏!!!(谢谢!!!)
相关文章:
面试系列|蚂蚁金服技术面【2】
今天继续分享一下蚂蚁金服的 Java 后端开发岗位真实社招面经,复盘面试过程中踩过的坑,整理面试过程中提到的知识点,希望能给正在准备面试的你一些参考和启发,希望对你有帮助,愿你能够获得心仪的 offer ! 第一轮面试完…...
【JavaEE】网络原理之初识
1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…...
WorkTool 技术解析:企业微信自动化办公的合规实现方案
引言:企业微信生态中的自动化需求 随着企业微信用户规模突破4亿(据腾讯2023年财报),其开放生态催生了自动化办公的技术需求。传统RPA(机器人流程自动化)工具在PC端已广泛应用,但移动端自动化仍…...
从0到1构建AI深度学习视频分析系统--基于YOLO 目标检测的动作序列检查系统:(2)消息队列与消息中间件
文章大纲 原始视频队列Python 内存视频缓存优化方案(4GB 以内)一、核心参数设计二、内存管理实现三、性能优化策略四、内存占用验证五、高级优化技巧六、部署建议检测结果队列YOLO检测结果队列技术方案一、技术选型矩阵二、核心实现代码三、性能优化策略四、可视化方案对比五…...
一文讲通锁标记对象std::adopt_lock盲点
一文讲通锁标记对象std::adopt_lock盲点 1. 核心概念2. 代码详解1. 单个锁2. 多重锁(可以用来预防死锁)3. 条件变量的互斥控制4. 复杂示例: 多生产者-多消费者模型(超纲了, 可不看,哈哈哈哈) 3. 小结 1. 核心概念 在C中, std::adopt_lock是一…...
Vscode工具开发Vue+ts项目时vue文件ts语法报错-红波浪线等
Vscode工具开发Vuets项目时vue文件ts语法报错-红波浪线等 解决方案 问题如题描述,主要原因是开发工具使用的代码检查与项目的中的ts不一致导导致,解决办法,修改 vscode 中, 快捷键:command shift p, 输入ÿ…...
Mac下安装Zed以及Zed对MCP(模型上下文协议)的支持
Zed是当前新流行的一种编辑器,支持MCP(模型上下文协议) Mac下安装Zed比较简单,直接有安装包,在这里: brew install --cask zedMac Monterey下是可以安装上的,亲测有效。 配置 使用CtrlShiftP…...
ROS实践(五)机器人自动导航(robot_navigation)
目录 一、知识点 1. 定位 2. 路径规划 (1)全局路径规划 (2)局部路径规划 3. 避障 二、常用工具和传感器 三、相关功能包 1. move_base(决策规划) 2. amcl(定位) 3. costmap_2d(代价地图) 4. global_planner(全局规划器) 5. local_planner(局部规划器…...
REDIS生产环境配置
REDIS生产环境配置 REDIS生产环境配置docker-compose文件redis.conf文件 REDIS生产环境配置 docker-compose模式部署生产环境 docker-compose文件 d_redis:image: redis:${REDIS_VERSION}container_name: d_redisvolumes:- ${REDIS_1_CONF_FILE}:/etc/redis.conf:ro- ${DATA_…...
【小沐学Web3D】three.js 加载三维模型(React)
文章目录 1、简介1.1 three.js1.2 react.js 2、three.js React结语 1、简介 1.1 three.js Three.js 是一款 webGL(3D绘图标准)引擎,可以运行于所有支持 webGL 的浏览器。Three.js 封装了 webGL 底层的 API ,为我们提供了高级的…...
软考教材重点内容 信息安全工程师 第19章 操作系统安全保护
19.1.1 操作系统安全概念 一般来说,操作系统的安全是指满足安全策略要求,具有相应的安全机制及安全功能,符合特定的安全标准,在一定约束条件下,能够抵御常见的网络安全威胁,保障自身的安全运行及资源安全。…...
【C++设计模式】第二十一篇:模板方法模式(Template Method)
注意:复现代码时,确保 VS2022 使用 C17/20 标准以支持现代特性。 算法骨架的标准化定义 1. 模式定义与用途 核心思想 模板方法模式:在父类中定义算法的骨架,将某些步骤延迟到子类实现,使得子类不改变算法结构即可…...
【机器学习】基于t-SNE的MNIST数据集可视化探索
一、前言 在机器学习和数据科学领域,高维数据的可视化是一个极具挑战但又至关重要的问题。高维数据难以直观地理解和分析,而有效的可视化方法能够帮助我们发现数据中的潜在结构、模式和关系。本文以经典的MNIST手写数字数据集为例,探讨如何利…...
【Pycharm】Pycharm无法复制粘贴,提示系统剪贴板不可用
我也没有用vim的插件,检查了本地和ubutnu上都没有。区别是我是远程到ubutnu的pycharm,我本地直接控制windowes的pycharm是没问题的。现象是可以从外部复制到pycharm反之则不行。 ctl c ctlv 以及右键 都不行 参考:Pycharm无法复制粘贴&…...
基于python+django+vue.js开发的医院门诊管理系统/医疗管理系统源码+运行
功能介绍 平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。源码 功能包括:医生管理、科室管理、护士管理、住院管理、药品管理、用户管理、日志管理、系统信息模块。 源码地址 https://github.com/geee…...
Spring Boot整合RabbitMQ极简教程
一、消息队列能解决什么问题? 异步处理:解耦耗时操作(如发短信、日志记录)流量削峰:应对突发请求,避免系统过载应用解耦:服务间通过消息通信,降低依赖 二、快速整合RabbitMQ 1. 环…...
Flink-学习路线
最近想学习一下Flink,公司的实时需求还是不少的,因此结合ai整理了一份学习路线,记录一下。 当然,公司也有Scala版本Flink框架,也学习了一下。这里只说Java版本 1. Java基础 目标: 掌握Java编程语言的基础知识。 内容…...
Atcoder ABC397-D 题解
https://atcoder.jp/contests/abc397/tasks/abc397_dhttps://atcoder.jp/contests/abc397/tasks/abc397_d 题目描述: 确定是否存在一对正整数,使得 思路: 首先对方程进行转化 设 即 接下来确定的范围 根据立方差公式 因此,我们可以从到来…...
K8S学习之基础二十七:k8s中daemonset控制器
k8s中DaemonSet控制器 DaemonSet控制器确保k8s集群中,所有节点都运行一个相同的pod,当node节点增加时,新节点也会自动创建一个pod,当node节点从集群移除,对应的pod也会自动删除。删除DaemonSet也会删除创建的pod。…...
电机控制常见面试问题(八)
文章目录 一、解释什么是矢量控制及其优势二、 如何设计一个电机控制系统的开环和闭环控制?请给出具体案例三.如何通过软件模拟来优化电机控制设计四. 请解释电机过流保护过压保护过温保护等保护机制五.你熟悉哪些电机驱动拓扑结构六.解释空间适量脉宽调制的原理 一…...
保持docker内容器一直运行
首先:确保Docker服务配置为开机自启,这样当虚拟机启动时,Docker也会启动,并按照设定的重启策略自动启动相关容器。 sudo systemctl enable docker 创建容器时: 当你使用docker run命令启动容器时,可以添…...
神经网络的基本知识
感知机 输入:来自其他 n 个神经元传递过来的输入信号 处理:输入信号通过带权重的连接进行传递, 神经元接受到总输入值将与神经元的阈值进行比较 输出:通过激活函数的处理以得到输出 感知机由两层神经元组成, 输入层接受外界输入信号传递给…...
PostgreSQL技术内幕26:PG聚合算子实现分析
文章目录 0.简介1.概念说明2.朴素聚集3.Group by聚集3.1 哈希聚集3.2 分组聚集 0.简介 聚合算子在聚合函数在数据分析、报告生成和统计计算中扮演着重要角色,通过对多行数据进行计算,将多个输入值压缩为单一输出值,如求和、平均值、计数等。…...
【RS】OneRec快手-生成式推荐模型
note 本文提出了一种名为 OneRec 的统一生成式推荐框架,旨在替代传统的多阶段排序策略,通过一个端到端的生成模型直接生成推荐结果。OneRec 的主要贡献包括: 编码器-解码器结构:采用稀疏混合专家(MoE)架构…...
AVL树的平衡算法的简化问题
AVL树是一种紧凑的二叉查找树。它的每个结点,都有左右子树高度相等,或者只相差1这样的特性。文章https://blog.csdn.net/aaasssdddd96/article/details/106291144给出了一个例子。 为了便于讨论,这里对AVL树的结点平衡情况定义2个名称&#…...
mac安装navicat及使用
0.删除旧的 sudo rm -Rf /Applications/Navicat\ Premium.app sudo rm -Rf /private/var/db/BootCaches/CB6F12B3-2C14-461E-B5A7-A8621B7FF130/app.com.prect.NavicatPremium.playlist sudo rm -Rf ~/Library/Caches/com.apple.helpd/SDMHelpData/Other/English/HelpSDMIndexF…...
【HTML】二、列表、表格
文章目录 1、列表1.1 无序列表1.2 有序列表1.3 定义列表 2、表格2.1 定义2.2 表格结构标签2.3 合并单元格 1、列表 列表分为: 无序列表有序列表定义列表:一个标题下有多个小分类 1.1 无序列表 ul嵌套li,ul是无序列表,li是列表…...
大语言模型安全风险分析及相关解决方案
大语言模型的安全风险可以从多个维度进行分类。 从输入输出的角度来看,存在提示注入、不安全输出处理、恶意内容生成和幻觉错误等风险; 从数据层面来看,训练数据中毒、敏感信息泄露和模型反演攻击是主要威胁; 模型自身则面临拒绝服务和盗窃的风险; 供应链和插件的不安全引…...
windows平台的ffmpeg编译使用
windows平台的ffmpeg编译使用 一、现状 本人使用libgdx开发galGame,发现扩展包gdx-video不支持mp4,不能忍,正好看到官网有支持自定义编译的文档,所以操作一下,自定义编译。本文重点在于操作windows平台,linux平台太简单了。 整个过程包括如下几个步骤。 二、代码下载…...
FFMPEG录制远程监控摄像头MP4
手绘效果图 上图是录制功能的HTML前端页面,录制功能和解码视频放在一起。录制功能关键是录制(开始录制按钮)、停止录像按钮。当点击“录制”的时候则会开始录制MP4文件, 当点击停止的时候就会停止录制MP4。经过录制后,则会生成MP4,并放到我的RV1126的/tm…...
