面经

腾讯PCG-大数据ai平台一面

处女面 50min
面试官人超级好 可惜我真的软脚然后答偏/答不出来还给自己挖坑乱跳....

1.自我介绍
2.有没有用过你刚刚讲过的一些技术去实现一些项目之类的?(java技术栈+常用中间件)
夏柠从这里开始节奏直接爆炸,引到了第二个虽然是自己写过的 但是拷打会很去死的项目
3.你从rpc提到了微服务,你知道有哪些比较常见的微服务架构?
其实我简历上根本没写微服务相关而且我也没学过 引到这里纯粹是节奏爆炸了 答了springcloud
4.springcloud常用的模块?
5.你做的这个rpc项目的框架是怎么做的,你怎么去思考如何做一个rpc项目的(从最小可用开始 服务消费者 -> rpcrequest -> 序列化到注册中心并负载均衡找到一个实例 -> 序列化服务名和方法名反射调用 -> 服务提供者)
6.服务提供者某个节点挂了怎么办?答的主动下线有钩子 被动挂掉有心跳机制
7.如果节点挂掉了,但是心跳机制还没发现这个时间段中间 调用方法正好调用到这个实例怎么办?(设置连接超时请求超时,避免一直卡住。调用失败后触发重试机制,重新选择其他健康实例。配合容错策略,比如快速失败、故障转移或者降级返回。消费端还可以维护一个本地故障节点列表或短期熔断状态,临时避开刚刚调用失败的实例)我当时只答了个降级。。。脑子根本醒不起来
8.怎么样持久化服务?(信息放入注册中心断电崩溃也能恢复,把服务注册信息或配置保存下来,避免重启后状态完全丢失。)
9.提到了同类型项目grpc和dubbo grpc的proto
10.怎么做的负载均衡?(spi去调一致性哈希、轮询、随机)
11.如果你本地缓存ip已经不可达了,那我们怎么办?快速失败+快速摘除+重建缓存+拉一套最新的立即重试 一套打上去
12.什么是降级?你怎么降级的?
13.两级缓存之间怎么同步?(两级缓存纯挖坑 redis其实应该就够抗)
答:两级缓存不能保证强一致,只能保证最终一致,在这里我们的本地缓存应该是商家页面这种不怎么更新的东西。如果真的要去更改redis,我们可以上redis的订阅应对轻量场景,如果是要求较高我们直接上mq广播缓存失效。或者设置短ttl允许一小段的脏数据。我这里面试的时候答的是mq,怀疑过度设计,问真的需要上mq吗
14.请求量很大 请求一个不存在的值(缓存穿透)
15.Redis的数据类型都有什么?(这时候脑袋已经麻了只答出来前五个)
16.ZSet底层?
17.java并发有什么机制?volitale
18.synchronized/可重入锁
19.threadlocal
20.双检锁单例模式/装饰器设计模式
21.agent相关 问了一些知识点 还有agent项目的做法以及细节 引过来根本没有任何准备
22.说的是合同校审agent 问了一点文本切割相关的
23.TCP滑动窗口
24.算法 先给了一道快排 直接软脚 换了一道动规lc300

中厂Java 一面

40min 纯八股盛宴 准备总结 Q3 8 9 14回答的不是很好 记一下

[Q1] 问: 你学习使用的 Java 是什么版本?
答: 项目本身是 Java 8,但也了解过 JDK 8, 11, 17, 21。21 有虚拟线程,8 有 Stream 流,17 的默认回收器是 G1。
正解: Java 8 引入了 Lambda 表达式和 Stream API;Java 11 是长期支持版,引入了 HttpClient;Java 17 是目前主流 LTS 版,将 G1 设为默认 GC;Java 21 引入了虚拟线程(Virtual Threads),极大提升了并发处理能力。

[Q2] 问: 请说一下 CMS 和 G1 垃圾回收器的区别。
答: CMS 使用标记-清除算法,会产生内存碎片,初始标记需要停顿,后续并发查找。G1 使用标记-整理算法,将内存划分为区域(Region),包括 Eden、Survivor、Old 和大对象(Humongous)状态,碎片更少。
正解:

  1. 内存结构:CMS 属于传统的物理分代(年轻代/老年代);G1 将堆拆分为多个大小相等的 Region
  2. 算法:CMS 采用标记-清除(产生碎片);G1 在局部使用复制算法,宏观上是标记-整理(无碎片)。
  3. 停顿预测:G1 支持可预测的停顿时间模型,可以指定在 M 毫秒内垃圾回收时间不超过 N 毫秒。

[Q3] 问: G1 的 Mixed GC 有什么操作?
正解: Mixed GC(混合回收) 是 G1 特有的。它不仅回收所有的 Young Region,还会回收部分 Old Region。当老年代占用率达到阈值(InitiatingHeapOccupancyPercent)时触发,目的是在有限的时间内优先回收价值最高的区域。

[Q4, 5] 问: Java 的双亲委派机制是什么?如何打破它?
答: 它是为了防止类重复加载或恶意篡改,加载类时先向上找父类加载器,父类不行再由自己加载。打破它需要重写 ClassLoaderloadClass 方法。
正解:

  1. 定义:当一个类加载器收到类加载请求,它首先将请求委派给父类加载器,直到顶层的启动类加载器(Bootstrap ClassLoader)。只有当父类无法加载时,子类才尝试加载。
  2. 打破方式:重写 loadClass 方法(如 Tomcat 为实现 Web 应用隔离)或使用线程上下文类加载器(Thread Context ClassLoader,如 JDBC 驱动加载)。

[Q6] 问: Lock(ReentrantLock)是基于什么实现的?
答: 基于 AQS(AbstractQueuedSynchronizer),它维护了一个 state 变量和一个等待队列。
正解: 正确。AQS 利用 CAS 操作修改 state 状态位,并配合 FIFO 队列(双向链表)管理竞争锁失败的线程。

[Q7] 问: synchronized 的锁升级流程是怎样的?
答: 无锁 -> 偏向锁 -> 轻量级锁 -> 重量级锁。偏向锁通过线程 ID 记录,轻量级锁使用 CAS,竞争激烈后升级为重量级锁。
正解: 正确。这是 JVM 为了优化 synchronized 性能引入的机制:

  1. 偏向锁:减少无竞争情况下的同步原语。
  2. 轻量级锁:利用自旋和 CAS 避免线程切换开销。
  3. 重量级锁:依赖操作系统的 Mutex Lock,会引起线程阻塞和切换。

[Q8] 问: MySQL 8.0 在可重复读(RR)隔离级别下,解决了幻读问题吗?
答: 只能解决一部分,要完全解决需要串行化(Serializable)。
正解: 在 InnoDB 引擎中,RR 级别通过 MVCC(多版本并发控制) 解决快照读的幻读,通过 Next-Key Locks(记录锁+间隙锁) 解决当前读(Select...for update)的幻读。在绝大多数场景下已经解决了幻读,但在某些极端重叠事务操作下仍可能出现。

[Q9] 问: SELECT ... FOR UPDATE 是什么操作?会加锁吗?
答: 读最新数据(当前读)
正解: 这属于当前读(Current Read)。它会主动加锁(通常是排他锁 X 锁),以保证读取的是数据库中最新的记录,并防止其他事务修改该数据。

[Q10] 问: 有联合索引 (A, B),查询条件是 WHERE B=... AND A=... 会生效吗?
答: 会生效,因为 MySQL 有优化器。
正解: 生效。虽然联合索引遵循最左匹配原则,但 MySQL 的查询优化器会自动调整 WHERE 子句中条件的顺序,使其匹配索引定义(A, B)。

[Q11, 12] 问: Redis ZSet 的底层结构是什么?为什么选跳表?
答: 底层是跳表(SkipList),也用过压缩列表。跳表可以减少查询次数,时间复杂度是 O(logN)。
正解: ZSet 底层由 ziplist(压缩列表,新版为 listpack)skiplist(跳表)+ dict(哈希表) 实现。选择跳表是因为它支持高效的范围查询,且实现比红黑树更简单、更易于扩展。

[Q13, 14] 问: 排行榜中如果分数相同,如何按“先达到该分数的人排前面”实现? 答: 建议把分数和时间戳捏在一起进行计算或排序。
正解: 常见方案是复合分数值。例如:score = 原始分数 * 10^10 + (最大时间戳 - 当前时间戳)。这样分数相同时,时间戳越小(越早达成)的记录,最终生成的 score 值越大(在 ZSet 逆序排列时靠前)。

[Q15] 问: 请简述 RPC 注册发现的流程。
答: 服务提供者启动后在注册中心注册地址;消费者通过注册中心获取地址;通过序列化、反序列化和反射进行远程调用。
正解:

  1. Provider 启动:将服务名、IP、端口等信息注册到 Registry。
  2. Consumer 订阅:向 Registry 获取并缓存 Provider 列表。
  3. 负载均衡:Consumer 从缓存列表中按策略选择一个 Provider。
  4. 远程调用:通过动态代理封装请求,经序列化和网络传输发送至 Provider,Provider 处理后返回。


[Q16] 问: 请简述 Spring注册bean的方式。

Spring 中注册 Bean 的方式主要有几种:
第一,使用 @Component@Service@Controller@Repository 等注解配合组件扫描自动注册;
第二,使用 @Configuration 配合 @Bean 方法手动注册;
第三,使用 XML 的 <bean> 标签配置;
第四,使用 @ImportImportSelectorImportBeanDefinitionRegistrar 等方式导入和动态注册;
第五,使用 FactoryBean 让 Spring 通过工厂创建 Bean;
第六,直接通过 BeanDefinitionRegistry 等底层 API 手动注册 BeanDefinition。

Read more

Agent Ai全栈开发记录

Agent Ai全栈开发记录

持续更新 star感谢! GitHub - xianingawa-wq/context-verify-agent: Contract Review AgentContract Review Agent. Contribute to xianingawa-wq/context-verify-agent development by creating an account on GitHub.GitHubxianingawa-wq 关于该Agent系统的想法 该系统灵感由大创项目而来 具体目标是 RAG + MCP 的合同校审Agent 我将该项目扩大为公司内部合同校审的SaaS平台 写完这一版后把后端平台重构为Java来承接 并尝试使用RPC进行调用 这样我的RPC也有了真实的使用场景 模型(现在先调api 以后美美白嫖老师的服务器用ollama): Qwen-max Qwen-text-embedding-v4 Qwen-rerank-v3 关于基础 看了一点hello agent 也多了解了一下概念之类的东西 觉得亲手做更好更沉浸理解本质 所以开始做 我认为这种就是

By XnLemon
测试数据报告/Day7

测试数据报告/Day7

关于我简历内数据吞吐量“2-3”倍怎么来的这回事 一、测试目标 * 验证本项目秒杀接口在“异步链路(Kafka)”与“同步链路(直落库)”下的性能差异。 * 在可接受延迟目标下评估可用吞吐量。 * 本轮最终对比口径采用:HTTP p95 < 300ms。 二、测试对象 * 接口:POST /voucher-order/seckill/{id} * 券ID:voucher_id=1 * 压测脚本:k6_seckill_ab.js 三、测试环境 * 时间:2026-03-18(本地) * 后端:hmdp-core-service 本地 java -jar 启动,端口 8085 * 中间件:Docker 启动

By XnLemon

Day4 / 5

这两天脑子昏昏的 感觉就是笔试题害怕出hot100之外然后写不上然后被卡 但是越刷脑子越昏越不想思考 是不是有点太累了 day4去了招聘会 感觉能碰到门槛的其他厂也挺不错的 好像不一定要冲很高。 想了一会打算回去更新一波简历让各位大佬能看到确实有不一样的地方 那就足够了 我的代码能力可能是真的很差?已经在保持手感了刷一次忘一次是真的很难过 我觉得更应该去理解开发流程和项目 正常开发时候代码量什么的也不会很爆炸...? 打算今天把脑子放松一会

By XnLemon