跳到主要内容

0423-面试-迈为科技

  • seata:分布式事务
  • sentinel:限流降级
  • canal:基于 MySQL 数据库增量日志解析,提供增量数据订阅和消费
  • Nacos:服务注册中心、配置中心
  1. 简单介绍下 ThreadLocal

ThreadLocal 在每个线程中都会堆该变量创建一个副本,在这个线程内的任何地方都可以使用这个对象,线程之间互不影响。

原理:Thread 类中有一个 ThreadLocal.ThreadLocalMap 的成员变量 threadLocals , threadLocals 负责存储 ThreadLocal 泛型的实例,

ThreadLocalMap 的 Entry 继承了 WeakReference<ThreadLocal<?>>

ThreadLocal 造成内存泄露的问题?

线程池不会销毁线程, Thread 对象有一个强引用 ThreadLocalMap 对象 threadLocals。

ThreadLocal 的应用场景

  1. 每个线程维护一个序列号
  2. session
  3. DateFormat 是线程不安全的,可以在每个线程中创建一个 ThreadLocal<DateFormat> 对象
  1. 线程池的 7 大参数
  • 核心线程数
  • 总线程数
  • 超时时间
  • 超时时间的单位
  • 创建线程的工厂
  • 阻塞队列
  • 拒绝策略
  1. 创建线程的几种方法
  • Runnable
  • Callable
  • Thread
  • 线程池
  1. 堆的结构
  • 新生代,老年代 1:2
  • Eden、Survivor(from,to) 8:1:1 即 survivor 中的一个区占新生代的 10%
  • GC 的过程:新创建的对象放到 Eden 区域,执行 Minor GC 的时候,会把 Eden 存活的对象和 Survivor 的 from 区存活的对象移动到 survivor 的 to 区,将 Survivor 的 from 区 和 to 区对调,即 from 区变成 to 区,to 区变成 from 区。经过 16 minor gc 还存活的对象,会被移动到老年代。如果新生代 Eden 空间不足时,会将新创建的对象直接放到老年代中。survivor 的 to 区无法容纳 eden 区和 survivor from 区存活的对象时,会将对象直接移动到老年代。在 survivor 中的年龄从小到大累加,如果对象总和的大小大于 survivor to 区空间的一半,年龄大于该年龄的对象就直接进入老年代。
  1. RabbitMQ 重复消费、消息丢失解决方案
  • 重复消费
    • 给消息一个 UUID,在消费消息之前,先查询缓存,判断消息是否已经被消费过。
  • 消息丢失
    • 生产者向MQ 推送消息的时候要有一个确认机制
    • MQ 开启持久化
    • 消费者从 MQ 消费消息时,也要有一个确认机制
    • 死信队列,消息出现失败、超时、拒绝等问题时,将消息路由到死信队列,避免消息丢失。
  1. Redis 缓存击穿、雪崩、穿透
  • 击穿:热点 key 失效,使用互斥锁,确保只有一个线程能够构建缓存,
  • 雪崩:大片 key 失效、redis 挂了,key 的有效时间设置成不均匀的,避免同时失效;互斥锁,保证
  • 击穿:访问不存在的 key, 先在redis 中缓存所有的 key ,使用布隆过滤器判断 key 是否存在。
    • 布隆过滤器:有一个数组,对一个 key 有 n 个 hash 函数,得到 n 个下表,将数组中对应下标的值改成 1 ,在判断数据是否存在时,直接找对应下标是否全为 1 .
  1. MySQL 优化
    • 优化案例
      • 开启慢查询日志,找到查询慢的 SQL,查看慢 SQL 的执行计划。
        • 是否走全文检索,如果是全文检索,给过滤条件添加索引。
        • 有索引,但是没有走索引,判断没有走索引的原因。应用最左匹配原则、覆盖索引、索引下推等规则。
    • 如何判断 sql 的执行计划是否有使用到索引
      • type 字段 all 为权限检索
      • possible_key 可能使用到的索引
      • key 使用到的索引
      • key_len 索引的长度,根据这个可以判断,在符合索引中使用到了哪些索引。
        1. 定长字段, int 占用 4 个字节,date 占用 3 个字节。char(n) 占用 n 个字符。
        2. 变长字段 varchar(n) 占用 n 个字符 + 2 个字节。
        3. 不同的字符集,一个字符占用的字节数是不同的。gbk 一个字符占 2 字节,utf-8 一个字符占 3 个字节。
        4. 对于所有的索引字段,如果设置为允许为 null ,则还需要加 1 个字节。(MySQL 需要额外一个字节来表示是否为 null)
  2. Docker 的掌握程度,有没有用 Docker 部署过正式环境
  3. SpringBoot 的自动配置原理(源码)
  4. 有没有使用过 ES 1Vue 的要求:生命周期、插槽集、数组集、参数传递