快手日常实习二面8.29
基础 & 自我介绍
- 介绍一下自己。(项目外卖点评)
- 你们导师对你们实习什么态度呢?(本科生没导师)
- 那你的实习计划怎么样呢?(六个月,五天)
- 开学以后是要回学校去上课吗?还是说还可以继续呢?(继续实习)
- 之前有实习经验吗?(无)
Java 基础与 JVM
- 讲一讲 Java 中对象的创建过程。(类加载检查->分配内存->初始化->对象头设置->构造函数)
- 对象初始化的过程大概是什么样子的?(初始化零值,面试官可能觉得不太够引导我子类父类那一块)
- Java 的三大特性是啥?(继承,封装,多态,没细问)
- 在对象初始化过程中,遇到继承关系时初始化顺序是怎么样的?
- 内存分配的两种方式是?(提到指针碰撞、空闲列表)
- 当分配内存空间出现竞争时,解决方案是什么?(TLAB+CAS失败重试)
- CAS 有什么问题?(自选开销大+ABA问题)
Spring / 注解(没背过Spring这一块,基本上没答出来)
-
Spring 注解 和 Lombok 注解有什么异同?
Spring 注解是运行时处理的,由 Spring 容器解析和反射实现;Lombok 注解是编译时处理的,通过 APT 在编译阶段生成字节码。Spring 注解改变的是运行时的 Bean 行为,Lombok 注解只是减少样板代码。
-
Spring 注解的大致工作原理/机制是什么?写了注解就能生效吗?
Spring 注解的本质只是标记,它能生效的前提是 Spring 容器扫描并解析注解。容器在启动时会把注解信息转化为 BeanDefinition,并在实例化过程中用反射/AOP来实现依赖注入或增强。如果离开了 Spring 容器,写注解是不会生效的。
-
在类上写了注解以后,为什么能 work?需要哪些流程?
写了注解本身没用,Spring 在启动时会扫描这些注解,把它们注册成 BeanDefinition,实例化时通过反射创建对象,再在依赖注入阶段用反射把 @Autowired 的依赖注入进去。对于像 @Transactional 这样的注解,还需要通过 AOP 动态代理来增强方法行为。所以能生效的关键,是 Spring 容器的扫描、解析和后置处理机制。
面向对象
- 除了 new 关键字,还有哪些方式可以生成对象?(反射、克隆、序列化等)
并发与线程池
-
介绍一下 JDK 自带线程池的工作模式。
线程池是“核心线程优先 → 队列缓存 → 非核心线程补充 → 拒绝策略兜底”。
-
JDK 常见的线程池类型有哪些?
-
常见的任务队列有哪些?
-
如果项目中需要用多线程,你会如何配置线程池?
1.线程数配置公式 CPU 密集型任务:核心线程数 = CPU核数 + 1 IO 密集型任务:核心线程数 = CPU核数 * 2(因为 IO 会阻塞,适合多线程并发)。 2.队列大小 有界队列(防止 OOM)。 一般设置成 几百到几千,取决于业务需求。 3.拒绝策略 推荐使用 CallerRunsPolicy(任务交给调用者线程执行,起到限流作用)。 4.线程工厂(ThreadFactory) 自定义线程名,方便排查问题。
-
(场景题)在你项目中,如何使用线程池?
核心线程数 = CPU * 2 队列大小 = 1000 拒绝策略 = CallerRunsPolicy 线程名 = order-worker-%d
-
多线程里听过“生产者消费者模型”吗?通信机制是什么?
1.模型解释: 生产者:不断产生任务(消息)。 消费者:不断从队列里取任务处理。 队列:连接生产者和消费者的中间缓冲区。 2.通信机制: 阻塞队列(BlockingQueue):最常见的方式,比如 LinkedBlockingQueue。 put() 没有空间时阻塞,take() 没有数据时阻塞。 wait/notify(低层次实现) 使用 synchronized + wait/notify 来做线程间通信。 Lock + Condition 使用 AQS 提供的 Condition await/signal。
项目 & 技术栈(不太会)
-
你在项目中用的 Nginx,是用来解决什么问题的?
在项目里主要用 Nginx 做 反向代理和负载均衡,保证多实例的服务能均衡处理请求,同时也用它来做静态资源分发,减少后端压力。
-
什么是反向代理?
正向代理(Forward Proxy): 客户端 → 代理服务器 → 访问外部资源。 举例:VPN、科学上网。客户端知道代理服务器,但目标服务不知道客户端是谁。 反向代理(Reverse Proxy): 客户端请求 → 代理服务器(Nginx) → 转发到后端服务。 客户端不知道后端有哪些服务,只和代理交互。
-
Nginx 出现之前一般用什么?
Apache HTTP Server:老牌 Web 服务器,功能强但性能偏低(基于多进程/多线程模型)
-
Nginx 能承载的 QPS 大概是多少?
单机 Nginx 在普通服务器上能轻松支撑 几万级 QPS,经过优化和高配硬件环境可以达到 几十万 QPS。这也是它广泛用于高并发场景的原因。
登录 & 安全
- 你项目中实现的短信登录是怎么做的?
- 在真实环境下(如快手)短信登录会考虑哪些点?
- 要不要考虑多端登录?
- 如果同一账号在不同设备同时登录,如何处理?
- 短信登录涉及成本(发短信要钱),如何进行品控/成本控制?
- 验证码 5 分钟有效,如果一个账号多人共用怎么处理?
Redis & 缓存
- Redis 内存淘汰机制是怎样的?
- 淘汰机制具体是如何运行起来的?(定时扫描还是随机取样?)
JVM & GC
- JVM 内存结构和垃圾回收是怎么工作的?
- 堆内存越来越大时,如何保证 GC 高效?
- G1 回收器的工作机制?
- 什么情况下对象会直接晋升到老年代?
- 跨代引用是怎么处理的?
设计题
- 如何设计一个直播排行榜(复合函数将看的时间和刷的金额复合作为score进行排序)?
算法题
实现LRU,直接默写出来了
反问
结果啥时候能出,面试官说一两周吧,估计是排序了,nginx和spring完全没背八股,基本答不上来,登录场景也是说的依托,线程池场景设计说的也是依托,其他基本上都答出来了
#日常实习面试##java##后端#