基础题复习

1.jvm内存模型

问题:

“你有没有处理过 JVM 相关的问题?”
“如何排查内存溢出 OOM?”
“堆内存溢出的常见原因和解决办法?”
“JVM 内存模型中,堆内存的作用是什么?”
答:之前项目启动时出现过 OOM,我通过添加 JVM 参数让它自动生成内存快照,分析后发现是初始化阶段加载了大量医嘱静态数据,导致堆内存不足。后来优化了初始化逻辑,只加载核心数据,启动就正常了。

细节补充:

堆内存是 JVM 中存储对象实例的区域
JVM 内存结构分线程私有和线程共享两部分。
线程私有包括程序计数器、虚拟机栈、本地方法栈,线程共享包括堆和方法区。
堆是最大的区域,存对象实例,分新生代和老年代,新生代有 Eden 区和 Survivor 区,短期对象先在 Eden 区,多次 GC 后存活的进老年代。
方法区存类信息、常量等,比如护理模块的类定义就在这里。虚拟机栈记录方法调用,调用方法时会创建栈帧入栈。
当时排查 OOM 时,可能用了 jmap 命令导出堆内存快照,然后用 MAT 工具分析,发现大量护理记录对象堆积在老年代,追溯到查询方法没有分页。也可能通过 JVM 参数 - XX:+HeapDumpOnOutOfMemoryError,让 OOM 时自动生成快照,再定位到具体代码行。

历史知识回顾:

OutofMemerryError是堆内存空间不足,但是最终抛出错误的地方,还是在栈里面
经典案例——
1、分页查询 没有加分页参数 一次性查询1000万条数据;(确实空间不足)
2、频繁操作string 没有 用 stringBuffer 或者 sringBuilder;(内存泄漏)
3、读写的stream 流、连接...开辟了资源没有释放,只管开辟,不管回收;
4.微服务启动,springcloud 很多组件,IOC很多bean实例;
StackOverflow是栈溢出 方法栈溢出,方法里面的引用、深度、太多了
经典案例——
1、无限递归;
设置大小
-Xmx=2G(设置最大内存) -Xmn500m(设置新生代内存,一般为3/8),
-xms=2G(设置初始内存,与最大内存一样,避免每次垃圾回收完成后重新分配JVM内存),-xss=128k(堆栈大小,jdk1.5之后为1M,这个值越大,创建线程越少)

HashMap 和 ConcurrentHashMap 核心区别与面试话术

1. 并发控制方式

  • JDK7 ConcurrentHashMap:采用分段锁。
  • JDK8 ConcurrentHashMap:通过 CAS + synchronized 关键字实现并发,锁粒度更细,性能更好。

2. JDK8 ConcurrentHashMap 的 put 操作并发控制流程

  1. 计算 key 的 hash 值,定位到对应桶;
  2. 若桶为空,直接用 CAS 插入节点;
  3. 若桶非空,检查头节点 hash 是否为 MOVED;
  4. 若头节点 hash 不是 MOVED,对桶头节点加 synchronized 锁,遍历链表/红黑树,有 key 则更新 value,无则插入新节点;
  5. 最后通过 CAS 更新 size,若超过阈值则触发扩容。

3. ConcurrentHashMap 的并发问题及解决

  • 常见问题
    • 迭代器遍历时有弱一致性,可能读到旧数据;
    • “先 get 后 put”的复合操作非原子性,导致数据不一致。
  • 解决方式
    • 复合操作可用 putIfAbsent 保证原子性;
    • 若需强一致性,可改用 Collections.synchronizedMap

4. 底层数据结构区别

  • HashMap:JDK8 为“数组 + 链表/红黑树”。
  • ConcurrentHashMap
    • JDK7:Segment 数组 + HashEntry 数组 + 链表;
    • JDK8:Node 数组 + 链表/红黑树。

HashMap 底层原理

底层结构

JDK1.7是数组+链表
JDK 1.8 之后为数组 + 列表 + 红黑树结构。

存储流程

  1. 计算 key 的哈希值,定位到数组中的对应桶位置。
  2. 若桶为空,直接插入元素。
  3. 若桶不为空,将元素放入该索引下的列表中。

树化条件

当列表长度超过 8,且数组长度超过 64 时,列表会转换为红黑树。

扩容机制

  1. 数组初始长度为 16,负载因子约为 0.75。
  2. 当数组中元素个数超过负载因子乘以当前数组长度时,触发扩容。
  3. 扩容时数组长度翻倍,如从 16 扩为 32,再到 64 等。
  4. 扩容到 64 后,再检查列表长度是否超过 8,满足则转红黑树。

260516:

一、事务相关
**

  1. 事务传播行为(常考 3 种)
    REQUIRED(默认):有事务则加入,无则新建
    SUPPORTS:有事务则跟随,无则非事务运行
    REQUIRES_NEW:新建独立事务,不受外层影响

  2. 事务失效场景
    方法非 public(AOP 无法切入)
    同类内部调用(绕开代理)
    异常被 catch 未抛出(框架无感知)
    异步线程调用(脱离事务上下文)
    数据库引擎不支持(如 MyISAM)
    传播行为配置不当、只读事务写数据

  3. 事务四大特性(ACID)
    A(原子性):要么全成,要么全回滚
    C(一致性):事务前后数据状态合法
    I(隔离性):多事务互不干扰
    D(持久性):提交后数据永久保存

  4. 事务隔离级别(MySQL 默认可重复读)
    级别
    特点
    读未提交
    读未提交数据,脏读 / 不可重复读 / 幻读都有
    读已提交
    读已提交数据,解决脏读
    可重复读
    同一事务查询一致,解决脏读 + 不可重复读
    串行化
    无并发问题,性能最差

  5. 脏读 / 不可重复读 / 幻读区别
    脏读:读其他事务未提交数据
    不可重复读:同一事务查同一条数据,内容变了
    幻读:同一事务按条件查,数据条数变了
    二、Redis 相关

  6. 五种基本数据类型 + 场景
    类型
    特点
    场景
    String
    通用,存文本 / 数值
    缓存、验证码、计数器
    List
    有序可重复,两头快
    消息队列、时间轴
    Set
    无序去重
    好友交集、抽奖、去重
    Hash
    字段式存对象
    用户 / 商品信息(省内存)
    ZSet
    带权重有序去重
    排行榜、积分排名

  7. Redis 为什么快?
    纯内存操作
    单线程模型(无锁竞争)
    IO 多路复用(高并发)
    C 语言编写(执行高效)
    数据结构优化

  8. 缓存三大问题解决方案
    问题
    原因
    解决办法
    穿透
    查不存在数据,直打 DB
    缓存空值、布隆过滤器、接口校验
    击穿
    热点 Key 失效,海量请求 DB
    永不过期、互斥锁、定时刷新
    雪崩
    大批量缓存同时失效
    过期时间加随机值、集群高可用

  9. 一级缓存 vs 二级缓存
    特性
    一级缓存(默认开启)
    二级缓存(需配置)
    作用域
    SqlSession 级别
    Mapper 级别
    共享性
    单会话私有
    跨会话共享
    失效时机
    会话关闭 / 增删改
    手动配置 / 过期

三、MySQL 相关

  1. 索引失效场景
    like 以 % 开头(% xxx、% xxx%)
    索引列做运算、调用函数
    隐式类型转换(字段与值类型不一致)
    or 前后字段未都建索引
    联合索引不遵循最左前缀原则
    not in、!=、is not null
    数据量过大,MySQL 选全表扫描

  2. 垃圾回收算法
    新生代:复制算法(Eden+From/To 区,存活率低,效率高)
    老年代:标记清除(有碎片)、标记整理(无碎片,存活率高)
    四、Spring 相关

  3. Spring Bean 生命周期
    实例化(反射创建对象)
    属性填充(依赖注入)
    初始化前置(BeanPostProcessor 前置)
    初始化(@PostConstruct、init-method)
    初始化后置(BeanPostProcessor 后置)
    就绪使用
    销毁(@PreDestroy、destroy-method)

  4. IOC 与 AOP
    IOC(控制反转):对象创建、依赖管理交给 Spring 容器,解耦
    AOP(面向切面):基于动态代理,横向抽取公共逻辑(日志、权限、事务)
    五、其他高频考点

  5. 设计模式(实战场景)
    模式
    场景
    单例模式
    连接池、工具类、配置类
    工厂模式
    支付方式(微信 / 支付宝)
    策略模式
    优惠券规则、订单状态处理
    代理模式
    AOP 日志、权限校验
    观察者模式
    注册后发短信 / 积分

  6. Dubbo 调用流程
    提供者注册服务到注册中心(Nacos/ZK)
    消费者订阅服务
    注册中心推送服务地址
    消费者负载均衡选节点
    远程通信调用
    提供者返回结果
    注册中心心跳检测

  7. 跨域解决方案
    注解:@CrossOrigin(控制器 / 接口级)
    全局配置:实现 WebMvcConfigurer
    网关层:SpringCloud Gateway 统一配置
    前端:本地代理 proxy

  8. Restful 风格规范
    用 HTTP 方法表示操作:GET(查)、POST(增)、PUT(全量改)、DELETE(删)
    路径用名词(/user 而非 /getUser)
    统一返回格式 + 状态码

  9. JVM 内存区域划分
    线程私有:程序计数器(无 OOM)、虚拟机栈(局部变量)、本地方法栈(native 方法)
    线程共享:堆(对象 / 数组,GC 核心)、方法区(类结构、常量、静态变量)

  10. 线上卡顿 / 接口慢排查流程
    查日志(项目日志、错误日志、第三方日志)
    拆分代码耗时(定位瓶颈模块)
    排查慢 SQL(explain 分析执行计划)
    检查第三方依赖(Redis、MQ、远程接口)
    服务器 / JVM 监控(CPU、内存、GC、死锁)
    优化:SQL / 缓存 / 异步 / 限流

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容