腾讯cdg 后台开发 一面

腾讯cdg 后台开发 一面
最新回答
晚街听风

2022-04-08 17:16:30

腾讯CDG后台开发一面主要围绕Java核心技术、分布式系统、系统设计及架构等方面展开,考察技术深度与广度。以下是具体问题的详细解答:

1. ThreadLocal实现原理
  • 核心机制:ThreadLocal通过为每个线程维护独立的变量副本(存储在Thread类的ThreadLocalMap中),实现线程隔离的数据访问。
  • 数据结构:ThreadLocalMap以ThreadLocal实例为键,存储线程本地变量,避免多线程竞争。
  • 内存泄漏问题:键为弱引用,但值仍需手动清理(如调用remove()),否则可能因线程复用导致内存泄漏。
2. 常见设计模式及例子
  • 单例模式:如Spring中Bean的默认单例作用域。
  • 工厂模式:JDBC连接池通过工厂创建数据库连接。
  • 观察者模式:GUI事件监听机制(如按钮点击事件)。
  • 策略模式:排序算法中通过策略接口切换不同排序策略。
3. 类加载机制
  • 加载阶段:通过类加载器(ClassLoader)将.class文件加载到JVM内存。
  • 验证阶段:检查文件格式、字节码完整性等。
  • 准备阶段:为静态变量分配内存并设置默认值。
  • 解析阶段:将符号引用转换为直接引用(如方法调用指向具体内存地址)。
  • 初始化阶段:执行静态代码块和静态变量赋值。
  • 双亲委派模型:子加载器优先委托父加载器加载,避免重复加载和安全问题。
4. Java锁的实现原理
  • synchronized:基于JVM实现,通过对象监视器(Monitor)实现互斥,依赖操作系统Mutex锁,存在用户态到内核态切换的开销。
  • ReentrantLock:基于AQS(AbstractQueuedSynchronizer)实现,通过CAS操作和队列管理线程阻塞与唤醒,支持公平锁和非公平锁。
5. 线上问题排查命令
  • CPU占用高:top -Hp <PID>查看线程CPU占用,jstack <PID>导出线程堆栈定位问题代码。
  • 内存泄漏:jmap -heap <PID>查看堆内存分布,jstat -gcutil <PID>监控GC情况,MAT工具分析堆转储文件。
  • 网络问题:netstat -tulnp查看端口占用,tcpdump抓包分析网络通信。
6. JVM垃圾回收算法
  • 标记-清除算法:标记无用对象后直接清除,产生内存碎片。
  • 复制算法:将存活对象复制到另一块内存,适合新生代(如Eden区到Survivor区)。
  • 标记-整理算法:标记后整理存活对象到内存一端,避免碎片,适合老年代。
  • 分代收集:根据对象生命周期分代(新生代、老年代),采用不同算法优化性能。
7. Java动态代理
  • JDK动态代理:基于接口实现,通过Proxy.newProxyInstance()生成代理类,调用处理器InvocationHandler处理方法调用。
  • CGLIB动态代理:通过继承目标类生成子类代理,适用于无接口的类,性能略优于JDK代理。
8. HashMap原理(1.8)
  • 数据结构:数组+链表+红黑树(链表长度≥8时转为红黑树)。
  • 扩容机制:当元素数量超过阈值(容量*负载因子)时,扩容为原来的2倍,并重新哈希。
  • 线程安全问题:非线程安全,多线程下可能导致数据不一致或死循环(1.7中链表倒置问题)。
9. volatile理解
  • 可见性:保证变量修改后立即对其他线程可见(通过MESI缓存一致性协议)。
  • 有序性:禁止指令重排序(通过内存屏障实现)。
  • 不保证原子性:如i++仍需同步机制保证原子性。
10. ConcurrentHashMap原理
  • 1.7版本:分段锁(Segment数组),每个Segment独立加锁,支持并发读写。
  • 1.8版本:CAS+synchronized优化,节点锁替代分段锁,进一步减少锁竞争。
11. 分布式事务
  • 2PC(两阶段提交):协调者发起准备和提交阶段,存在阻塞和单点问题。
  • TCC(Try-Confirm-Cancel):通过业务逻辑拆分实现柔性事务,如扣款操作分为预留、确认、取消。
  • SAGA模式:将长事务拆分为多个本地事务,通过补偿机制保证最终一致性。
12. 异常的继承关系
  • Throwable:所有异常和错误的父类。
  • Error:严重错误(如OutOfMemoryError),通常无需捕获。
  • Exception:分为运行时异常(RuntimeException,如NullPointerException)和检查异常(如IOException)。
13. 常见的安全问题
  • SQL注入:通过预编译语句(PreparedStatement)防止。
  • XSS攻击:对用户输入进行转义或过滤。
  • CSRF攻击:通过Token验证或Referer检查防止。
14. HTTPS握手过程
  • 客户端发起请求:发送支持的加密套件和随机数。
  • 服务端响应:返回证书和随机数,确定加密套件。
  • 密钥交换:通过非对称加密交换对称密钥(如RSA或ECDHE)。
  • 数据传输:使用对称密钥加密通信内容。
15. Dubbo架构原理及注册发现机制
  • 架构:分为服务提供者(Provider)、消费者(Consumer)、注册中心(Registry)、监控中心(Monitor)。
  • 注册发现:Provider启动时向Registry注册服务,Consumer从Registry订阅服务地址,通过RPC调用Provider。
  • SPI机制:Dubbo通过SPI扩展点实现自定义组件(如负载均衡策略)。
  • 粘包问题:通过定义消息边界(如固定长度、分隔符、头部标识长度)解决。
16. ZooKeeper选举
  • ZAB协议:通过投票选举Leader,确保数据一致性。
  • 选举过程:节点发起投票,比较ZXID(事务ID)和myid,ZXID大者优先成为Leader。
17. ZooKeeper节点类型
  • 持久节点:创建后一直存在,除非手动删除。
  • 临时节点:会话结束后自动删除。
  • 顺序节点:节点名后自动追加递增序号。
18. 缓存选型
  • 本地缓存:如Caffeine,适合单机高并发场景。
  • 分布式缓存:如Redis,支持持久化、集群和高可用。
  • 多级缓存:结合本地缓存和分布式缓存,减少网络开销。
19. 高并发系统设计
  • 限流:通过令牌桶或漏桶算法控制请求速率。
  • 降级:非核心服务降级,保证核心服务可用。
  • 熔断:当依赖服务故障时,快速失败并返回默认值。
20. 系统设计原则
  • 单一职责原则:每个模块只负责一个功能。
  • 开闭原则:对扩展开放,对修改关闭。
  • 依赖倒置原则:依赖抽象而非具体实现。
21. NIO、BIO、AIO
  • BIO:同步阻塞IO,每个连接对应一个线程。
  • NIO:同步非阻塞IO,通过Channel和Buffer实现高效IO。
  • AIO:异步非阻塞IO,基于事件驱动,适合高延迟场景。
22. CAP理论
  • 一致性(C):所有节点数据一致。
  • 可用性(A):系统始终可响应请求。
  • 分区容忍性(P):网络分区时系统仍能运行。
  • 权衡:通常只能满足CP或AP,如ZooKeeper选择CP,Eureka选择AP。
23. Spring生命周期及自定义Bean注册
  • 生命周期:实例化→属性注入→初始化(@PostConstruct)→使用→销毁(@PreDestroy)。
  • 自定义注册:通过BeanDefinitionRegistryPostProcessor或@Bean注解实现。
24. 优化if-else代码
  • 策略模式:将不同条件封装为策略类。
  • 状态模式:根据状态切换行为。
  • 表驱动法:通过Map或配置文件替代条件判断。
25. 简易流程编排实现
  • 思路:定义流程节点和流转规则,通过责任链模式或工作流引擎(如Activiti)实现。
  • 技术栈:Spring StateMachine、Flowable、规则引擎(如Drools)。
26. 云原生与Serverless
  • 云原生:基于容器、微服务、DevOps和持续交付的架构风格。
  • Serverless:无服务器架构,开发者只需关注业务逻辑,由云平台动态管理资源(如AWS Lambda)。
27. 反应式编程及RxJava背压问题
  • 反应式编程:基于异步数据流和事件驱动的编程模型(如Reactor、RxJava)。
  • 背压问题:当生产者速度大于消费者时,通过背压策略(如缓冲、丢弃、限流)解决。
28. 系统架构设计考虑因素
  • 需求分析:明确功能和非功能需求(如性能、可用性)。
  • 技术选型:根据场景选择合适的技术栈(如数据库、缓存、消息队列)。
  • 扩展性:设计可水平扩展的架构(如分库分表、微服务)。
29. 直播架构设计
  • 推流端:通过RTMP协议将音视频数据推送到服务器。
  • 服务端:使用CDN分发流数据,减少延迟。
  • 点赞/弹幕:通过WebSocket实现实时通信,使用消息队列(如Kafka)缓冲高并发消息。
30. 秒杀抢购流程
  • 前端限流:通过按钮置灰、验证码减少无效请求。
  • 队列削峰:将请求放入消息队列,后台异步处理。
  • 库存扣减:使用Redis原子操作或分布式锁保证库存一致性。
31. 分布式锁实现
  • Redis实现:通过SETNX命令和过期时间实现简单锁,或使用Redlock算法保证高可用。
  • ZooKeeper实现:通过临时顺序节点和Watcher机制实现分布式锁。