京东健康Java开发一面面经
面试题目
- 为什么喜欢java开发
- 项目是开源的吗
- Redis适合的场景
- Redis vs Mysql
- Redis如何实现分布式锁
- 一致性哈希算法
- Elasticsearch
- spring 注入对象 用什么注解注入
- 什么样的对象会直接进入到老年代?
- 定义线程池的核心参数,核心线程数是4,最大线程数是8,什么时候起第五个线程池?(配合无界队列)
- 有没有遇到过包冲突的问题
- 写代码有没有用过通义灵码
参考解析
1. Redis如何实现分布式锁:通常使用 SET key value NX PX milliseconds 命令,利用其原子性实现加锁,并设置过期时间防止死锁。释放锁时需校验 value,确保删除的是自己持有的锁。
2. Redis vs MySQL:Redis 是内存型 KV 数据库,支持高并发读写,适合缓存和高性能计算;MySQL 是关系型数据库,基于磁盘存储,支持 ACID 特性和复杂 SQL 查询,适合持久化核心业务数据。
3. 什么样的对象会直接进入到老年代?:大对象(如很长的字符串或数组)直接进入老年代以避免在新生代内存复制;长期存活的对象(经历多次 Minor GC 后年龄超过阈值);或在 Survivor 区相同年龄对象大小之和大于 Survivor 区一半时,大于该年龄的对象直接进入。
4. 线程池参数与执行逻辑:核心参数包含 corePoolSize、maximumPoolSize、keepAliveTime、workQueue 等。若使用无界队列,当核心线程满时,任务会进入队列,因此最大线程数设置将失效,永远不会启动第五个线程。