本人详解
作者:王文峰,参加过 优快云 2020年度博客之星,《Java王大师王天师》
公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题
中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯
转载说明:务必注明来源(注明:作者:王文峰哦)
上海Java开发面试高频出现的业务场景实时日志分析系统、实现订单服务的弹性扩缩容与流量治理、与底层原理JVM垃圾回收器及解析
- 学习教程(传送门)
-
-
- **一、业务场景类题目**
- **二、底层原理类题目**
-
- **题目3:JVM垃圾回收器GC Roots是如何确定的?为什么老年代回收效率比新生代低?**
- **题目4:Spring Cloud中Feign的熔断机制是如何实现的?与Hystrix有何区别?**
- **题目5:TCP协议如何保证可靠传输?三次握手与四次挥手的具体过程**
- **题目6:Seata的AT模式与TCC模式在电商支付场景中的选择依据是什么?**
- **题目7:设计一个支持亿级订单的MySQL分库分表方案,如何解决单表过大、查询慢等问题?**
- **题目8:在电商秒杀场景中,为什么选择RocketMQ而非Kafka?如何实现顺序消息与重试机制?**
- **题目9:如何通过Kubernetes和Istio实现电商服务的网格化治理?请描述服务发现、流量拦截与监控集成方案。**
-
- 学习教程(传送门)
- 往期文章
学习教程(传送门)
1、掌握 JAVA入门到进阶知识(持续写作中……)
2、学会Oracle数据库用法(创作中……)
3、手把手教你vbs脚本制作(完善中……)
4、牛逼哄哄的 IDEA编程利器(编写中……)
5、吐血整理的 面试技巧(更新中……)
上海Java开发面试高频出现的业务场景(实时日志分析系统、实现订单服务的弹性扩缩容与流量治理)与底层原理(JVM垃圾回收器)及解析
一、业务场景类题目
题目1:设计一个电商秒杀系统(高并发场景)
考察点:分布式锁、缓存击穿、限流降级、异步处理、数据库优化
答:
-
核心流程设计
• 用户请求 -> 接口限流(Sentinel/Apollo)-> 查询缓存(Redis)库存 -> 若有库存,执行扣减(CAS原子操作或Redis Lua脚本)-> 下单记录异步写入MySQL -> 发送短信/邮件通知。 -
关键技术点
• 缓存层:Redis预加载热点商品库存,设置超时自动回源DB。
• 防超卖:Redis Sorted Set实现分布式锁(SETNX
+EXPIRE
),或Redisson红锁。
• 库存更新:lua脚本
保证原子性:MULTI
→HINCRBY
库存 →EXEC
。
• 异步化:通过Kafka解耦下单与通知,使用RabbitMQ实现最终一致性。
• 限流:Sentinel配置QPS阈值,熔断异常流量。 -
数据库优化
• 表引擎选InnoDB,支持事务。
• 主键索引优化:order_id
聚簇索引。
• 读写分离:从库处理查询,主库处理写操作。
• 分库分表:按商品ID哈希分表,解决单表过大问题。 -
压测与监控
• JMeter模拟高并发,Grafana监控QPS、响应时间、错误率。
• ELK日志分析慢查询,Arthas诊断Java服务瓶颈。
题目2:设计一个实时日志分析系统(如电商用户行为追踪)
考察点:Flume/Kafka数据管道、实时计算、窗口统计、资源隔离
答:
-
架构分层
• 采集层:Flume Agent监听Nginx日志,自定义拦截器解析JSON格式日志。
• 传输层:Kafka Topic分区按用户ID哈希,保障顺序性,设置acks=all
持久化。
• 处理层:Flink窗口计算(1分钟/5分钟/小时维度)用户点击率、转化率。
• 存储层:HBase存储原始日志,ClickHouse做OLAP查询,Redis缓存Top10商品。 -
性能优化
• Kafka批量压缩(LZ4),提升吞吐量。
• Flink State TTL自动清理,防止OOM。
• ClickHouse列式存储+稀疏索引,加速聚合查询。 -
容错设计
• Flume重试机制(maxRetryAttempts
),Kafka Consumer Offset手动提交。
• Flink Checkpoint与HDFS容灾,保证Exactly-Once语义。
二、底层原理类题目
题目3:JVM垃圾回收器GC Roots是如何确定的?为什么老年代回收效率比新生代低?
考察点:GC原理、内存模型、对象存活判定
答:
-
GC Roots对象
• 虚拟机栈中的局部变量引用(基本类型除外)。
• 方法区中的静态属性引用(static
字段)。
• 常量池中的符号引用(String.intern()
后的字符串)。
• 本地方法栈中的JNI引用(Native方法调用的对象)。 -
老年代回收效率低的原因
• 标记阶段:需遍历整个堆内存,老年代对象多耗时。
• 整理阶段:标记-整理算法需移动对象,产生STW(Stop-The-World)。
• 碎片问题:CMS收集器无法处理浮动垃圾,Full GC频繁触发。
• 对比新生代:复制算法(Eden→Survivor)无需整理,且对象生命周期短。
题目4:Spring Cloud中Feign的熔断机制是如何实现的?与Hystrix有何区别?
考察点:分布式服务治理、熔断器模式、代码实现
答:
-
Feign熔断实现
• 基于@FeignClient
注解自动集成Resilience4j或Hystrix。
• 默认使用Resilience4j:@CircuitBreaker(name="backendA", fallbackMethod="fallback")
。
• 自定义配置:application.yml
设置超时时间(connectTimeoutMillis
)、重试次数(retry.maxAttempts
)。 -
与Hystrix对比
• 依赖注入:Hystrix需单独@