观妙科技 - Java开发 二面 面经

1. 上次一面聊了你的项目,能再深入说说项目中遇到的最大挑战吗?

最大的挑战是处理秒杀场景的高并发问题。

当时模拟了一个促销活动,瞬间有几千个请求抢购商品。最初的实现是直接查数据库库存,然后扣减,结果出现了超卖问题,而且数据库压力特别大,响应很慢。

我分析后发现主要有三个问题:数据库成为瓶颈,库存扣减不是原子操作,没有做流量控制。

解决方案是多层优化。首先把库存预热到Redis,用Lua脚本保证扣减的原子性。Lua脚本先判断库存是否充足,充足才扣减,整个过程是原子的。然后在网关层用Sentinel做限流,超过阈值直接拒绝。订单创建改成异步的,扣完库存就返回,通过RabbitMQ慢慢处理订单。

还做了一些细节优化,比如前端按钮防重复点击,Nginx做负载均衡,数据库读写分离。通过JMeter压测,优化后QPS从几百提升到三千多,没有出现超卖。

这个过程让我理解了高并发场景下要从多个层面优化,单点优化效果有限。也学会了用工具定位瓶颈,针对性解决问题。

2. 说说ConcurrentHashMap的实现原理,和HashMap有什么区别?

ConcurrentHashMap是线程安全的HashMap,但实现机制不同。

JDK 1.7用分段锁,把数据分成多个Segment,每个Segment是一个小的HashMap,继承自ReentrantLock。读操作不加锁,写操作只锁当前Segment,理论上支持16个线程并发写。

JDK 1.8取消了Segment,改用CAS加synchronized实现更细粒度的锁。数据结构和HashMap一样,是数组加链表加红黑树。锁的粒度是数组的每个位置,只有hash冲突时才用synchronized锁住链表或红黑树的头节点。使用CAS进行无锁的插入和更新,性能更好。

和HashMap的区别:

线程安全性,HashMap不是线程安全的,ConcurrentHashMap是。如果多线程用HashMap会出现数据丢失、死循环等问题。

null值,HashMap允许一个null key和多个null value,ConcurrentHashMap都不允许,会抛异常。

性能,单线程HashMap更快,多线程ConcurrentHashMap更快。

迭代器,HashMap的迭代器是fail-fast的,ConcurrentHashMap是弱一致性的,不会抛ConcurrentModificationException。

实际使用中,单线程用HashMap,多线程用ConcurrentHashMap。不要用Hashtable,性能差而且过时了。

3. JVM的垃圾回收机制了解吗?有哪些垃圾回收器?

JVM垃圾回收主要针对堆内存。

判断对象是否可回收用可达性分析算法,从GC Roots开始遍历,能到达的对象是存活的,不能到达的是垃圾。GC Roots包括虚拟机栈中的引用、静态变量、常量、本地方法栈的引用等。

垃圾回收算法有几种:

标记-清除,标记存活对象,清除未标记的,简单但会产生内存碎片。

标记-复制,把内存分两块,每次只用一块,垃圾回收时把存活对象复制到另一块,然后清空这一块。不会有碎片但浪费空间,适合新生代。

标记-整理,标记存活对象,然后移动到一端,清理边界外的内存。不会有碎片也不浪费空间,但移动对象有开销,适合老年代。

常见的垃圾回收器:

Serial,单线程,适合客户端应用。Parallel,多线程,吞吐量优先,适合后台计算。CMS,并发标记清除,停顿时间短,但会产生碎片。G1,分区回收,可预测停顿时间,JDK 9后的默认回收器,适合大内存应用。ZGC和Shenandoah,低延迟回收器,停顿时间在10ms以内,适合对延迟敏感的应用。

实际使用中,根据应用特点选择回收器。吞吐量优先用Parallel,延迟敏感用G1或ZGC。通过JVM参数调整堆大小、新生代比例等,使用工具分析GC日志优化性能。

4. 分布式事务有哪些解决方案?你项目中用过吗?

分布式事务是跨多个数据库或服务的事务,保证一致性比较复杂。

常见解决方案:

2PC两阶段提交,协调者先询问所有参与者能否提交,都同意再发提交命令。强一致性但性能差,有阻塞和单点问题,实际很少用。

TCC,业务层面的两阶段提交。Try预留资源,Confirm确认提交,Cancel回滚。需要业务代码实现三个接口,开发成本高但性能好,适合对一致性要求高的场景。

本地消息表,在本地数据库记录消息,事务提交后发送MQ,消费者处理后更新状态。定时任务扫描未发送的消息重试。实现简单,保证最终一致性。

消息事务,RocketMQ支持事务消息。发送半消息,执行本地事务,根据结果提交或回滚消息。消费者处理消息,失败则重试。

Saga模式,把长事务拆分为多个本地短事务,每个事务有对应的补偿操作。某步失败就执行之前所有步骤的补偿。适合长流程业务。

我项目中用的是消息队列保证最终一致性。比如下单后扣库存、扣积分、发通知,这些操作通过Rabb

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

Java面试圣经 文章被收录于专栏

Java面试圣经,带你练透java圣经

全部评论
二面一小时,挂了
2 回复 分享
发布于 03-03 17:02 湖北
我当时面java实习生二面真没这么难 基本围绕个人生活和一部分项目问了四十来分钟
1 回复 分享
发布于 03-04 14:43 吉林
27届实习机会或看我住业 https://careers.pddglobalhr.com/campus/intern?t=4OmKPVeX9a
点赞 回复 分享
发布于 03-11 14:50 上海
这要是真能背下来,我服
点赞 回复 分享
发布于 03-04 13:12 黑龙江
沾点喜气,二面凉了?我这菜鸡哭唧唧
点赞 回复 分享
发布于 03-03 19:10 四川
倒反天罡,反问拷打起面试官了
点赞 回复 分享
发布于 03-03 17:40 河南
点赞 回复 分享
发布于 03-02 11:47 湖北

相关推荐

03-17 17:57
门头沟学院 Java
1.    能否先做一个自我介绍?2.    简单介绍一下你的项目,以及你在里面主要做了哪些事情?3.    你们项目采用的框架以及技术栈是什么?4.    你觉得你对哪块技术比较熟悉一点?5.    引入线程池提升查询效率的方案,当时是你自己想出来的,还是你只负责落地执行?6.    能把你优化的代码执行的整个流程说一下吗?7.    为什么 CompeleteFuture 要使用线程池的线程,能解释一下吗?8.    这个项目的团队大概是多少人?9.    在做“花椒论坛”项目的过程中,有哪些觉得可以进行优化,而你还没有进行优化的点?10.    简单说一下粉丝订阅和关注模块里面涉及到了哪些业务逻辑?11.    消息推送模型中有涉及到数据持久化吗?12.    在拉模式的过程中,系统是怎么知道用户关注的博主发了新帖子的?13.    帖子入库的表结构是怎么样的,为什么要这么设计?14.    如果帖子内容是一个富文本,输入了一段包含特殊字符或前端注入(如 alert)的代码,导致前端渲染时弹窗了,用户上传了前端无法渲染的特殊字符给后端,如何解决这个问题?15.    如果前端的同学告诉你:“我不能包含XX这些特殊字符”,那你(后端)打算怎么做?16.    有没有考虑过做过滤器,或者在用户录入/接收到内容的时候,用正则表达式之类的去匹配,如果有特殊字符就替换掉或者挡住?(引导性提问)17.    你基于 Redis 的固定窗口限流具体是怎么做的?18.    这个限流的设计方案是有去参考过其他的解决方案,还是自己想出来的?19.    基于 Redis 的限流和谷歌的限流工具里面的限流有什么区别?20.    为什么要使用 Redis 这种中间件做限流,而不是放在本地内存(如 Java 的 Map 或静态属性)中实现?21.    如果是多台机器的分布式系统,使用本地内存做限流会出现什么问题?22.    除了 Redis 和本地内存,还有哪些技术或者中间件可以实现限流?23.    关于实习中平台用 Redis 做草稿缓存,如果前端页面一直关掉不保存,导致 Redis 数据无限膨胀,如何清理这些冗余数据?24.    如果业务人员操作配了一半去吃饭,过了设定的过期时间缓存数据被清除了怎么办?25.    如果同一个账号在两台电脑上同时登录,并对同一份工作流进行交叉修改,如何解决两边数据冲突覆盖(协同操作)的问题?26.    如果要给上述并发场景加锁,打算怎么去实现这个加锁逻辑?什么时候进行解锁? 加锁就一定能解决这个问题吗?27.    假如我一定要两个人可以并行操作怎么办?28.    如果发现了一些自己认知以外的问题,或者被安排了不熟悉的研发任务,你会基于什么样的方式去快速解决?29.    如果项目时间非常紧迫,你该怎么处理不熟悉的需求?30.    你最近在学习哪方面的技术?31.    现在学习 AI Agent 开发学到什么程度了?32.    简单介绍一下你正在学习的项目里面具体是什么内容?33.    平时编程会用到哪些外部工具或 AI 工具来进行辅助?34.    在使用 AI 命令行工具开发时,它可能会直接把代码改错,之前有遇到过这种情况吗?是如何防范和解决的?35.    探讨一下概念,你知道 AI 为什么会自动调用 Skill 或者是直接调用 MCP 吗?我这边没有什么问题了,你这边有什么想问我的吗?
大厂面试问八股多还是项目...
点赞 评论 收藏
分享
评论
6
24
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务