十一,面经 - 348052148/learnGraph GitHub Wiki

1. ThreadLocal 有什么缺陷?,在线程池中使用会有什么问题?

answer:各个线程依赖不通的变量值完成操作的场景。 每个线程内部都有ThreadLocalMap,ThreadLocalMap的key是弱引用,如果没有外部强引用,在下一次gc就会释放内存。但是value并不会释放,导致内存泄漏,解决办法,使用后主动remove清理,或者标记private static 为强引用。 线程池是预先分配一组线程,ThreadLocal和线程bind,所以在线程池中使用ThreadLocal可能会使用到同一个。导致ThreadLocal作用的失效

2. 类的加载机制,为什么要用双亲委托?如何打破双亲委托加载机制

类加载流程 find java.lang.Object 第一次检查是否加载 用户自定义 -检查-> 本地加载器 -检查-> 拓展加载器 -检查-> 启动加载器 ,如果检查到都未加载,则从启动加载器开始进行加载。 启动加载器 -加载-> 拓展加载器 -加载-> 本地加载器 -加载-> 用户自定义。 作用:保证JDK核心类的优先加载,和类加载的信任程度 打破双亲加载机制,在重写loadclass的过程中,只要不遵从JVM的规范就行了,不盲目的优先向Parent 的ClassLoader进行查找就行了

3. TreeMap与TreeSet实现原理是什么?

TreeMap 底层使用红黑树, TreeSet 内部是TreeMap 只是做了去重复处理 TreeMap 基于红黑树

4. Array和ArrayList的区别?

Array 固定长度。 ArrayList 可动态增长,且存储也可能是不连续的。

5. JVM的数据区有哪些,作用是什么?

线程私有:

  1. 程序计数器 记录当前线程锁执行的字节码行号指示器。
  2. java虚拟机栈, 存放局部变量,本地方法出口信息。
  3. 本地方法栈,和java虚拟机栈类似,为Nativefunc服务。 线程共享
  4. java 堆, 存放实例化数据
  5. 方法区 ,存放类信息(版本、字段、方法、接口等)、常量、静态变量、即时编译后的代码等数据。
  6. 运行时常量, 存放编译期生成的各种字面量和符号引用
  7. 直接内存,nio,native 分配的内存

6. JVM堆内存结构是怎样的?哪些情况会触发GC?会触发哪些GC?

java堆 分为年轻代 和 老年代,比例为 1 : 3 年轻代 分为 Eden 区, Survivor0 和 Survivor1 区。 一般比例是 8:1:1 新的对象实例在Eden 区诞生,每次gc都会将 Eden 和 Survivor 区的数据进行转移 到另一个空闲的 Survivor区中,并对对象的存活时间+1. 达到一定存活时间,会进入老年代中。 GC 分为 Minor GC 和 Full GC Minor GC 在Eden 申请内存失败的时候进行触发。 Full GC 在以下情况下触发:

  1. 年老代(Tenured)被写满
  2. 持久代(Perm)被写满
  3. System.gc()被显示调用
  4. 上一次GC之后Heap的各域分配策略动态变化

7. synchronization 和Lock有什么区别?

synchronization 是在jvm层面实现的是悲观锁,Lock是代码层实现,CAS 原理。

8. Poll与ePool的区别?

select 每次需要把要监听的 fds 放入内核结构中, 然后监听到有可处理的事件后需要全部取出来轮询得到可处理fd,再重新重新将fds设置进去。 epool 把socket放到epoll文件系统里file对象对应的红黑树上之外,还会给内核中断处理程序注册一个回调函数,告诉内核,如果这个句柄的中断到了,就把它放到准备就绪list链表里。 红黑树,维护监听的fds事件, 双向链表维护已经触发回调的fd。 LT 模式 事件未处理完会一直返回, ET 第一次才返回。

9. BIO与NIO有什么区别?

10. mysql 引擎类型有哪些,各有什么区别,各有什么应用场景?

  1. innodb 支持事务,外键,引入行锁。适合update频繁场景。
  2. myisam 索引和数据单独存储,没有簇类索引,适合查询和insert且不考虑事务的情况。但是频繁到更新删除记录会产生碎片。
  3. memory 存入内存,性能好但是数据容易丢失,时候做缓存类

11. mysql事务隔离级别有哪些,举例说明各自的情况?

  1. 读未提交, 会产生脏读
  2. 读已提交, 会产生不可重复读问题
  3. 可重复读, 会在insert的时候产生幻读,(innodb 通过间隙锁,避免了这个问题
  4. 序列化

12. 数据库锁有哪几种?有什么区别?

  1. 行锁,表锁,页锁
  2. X锁, S锁。 X锁独占,S锁共享

13. mysql 有那几种索引,各有什么区别?

  1. 全文索引
  2. Hash 只适合等值匹配。不适合范围查询 O(1)
  3. Btree 适合范围和等值查询 O(nlogn)
  1. 普通索引
  2. 唯一索引
  3. 主键索引
  4. 组合索引 为什么是最左匹配原则?建立联合索引的适合是按 col1,col2 排序插入的。跟B+tree结构有关,单独看 col2 就是无序的了

14. 什么是悲观锁和乐观锁,说说他们的特点和应用场景?

悲观锁,认为数据会被别人修改,实施互斥。 访问量不大,写入操作比较频繁的情况。 乐观锁,认为不会有人修改数据,在更新的适合判断数据是否是原来的。(CAS) 乐观锁适用于读比较大写比较少的情况下

15. 分别说下行级锁和表级锁?update t1 set a = xx for update (a字段不是主键,也没加索引),是行级锁还是表级锁?为什么?

  1. 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
  2. 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 表锁,innodb是基于索引加锁的。如果不建索引,直接锁表

16. mysql和redis都搭建主从和高可用,你在项目中redis一般在什么场景下使用?

17. synchronized和volatile有什么区别,各自有什么应该场景?

并发安全需要保证,原子性,可见性,有序性 synchronized 可以保证代码区域的原子性和内存可见性 会导致线程阻塞 volatile 用来修饰变量,保证内存可见性,但不具备原子性 不会阻塞线程

18. 如何解决死锁

造成死锁的原因:

  1. 循环等待条件
  2. 请求与保持条件 (保证加锁的顺序一致就可以避免
  3. 互斥
  4. 不可抢占 (可以增加超时释放机制 死锁文章

19. 谈谈你对JMM、CAS和AQS的理解,CAS下ABA问题及优化方案?

20. 说说单点登录和oauth2协议的流程,它们有什么区别?

21. 如何实现限流?限流常用有哪些算法?各自有什么应用场景?

限流模块以拦截器的方式进行工作 常用限流算法

  1. 计数
  2. 漏桶
  3. 令牌桶

22. aop 控制反转 依赖注入

23. 讲讲你对reactor模式的理解?

24. 请写出你了解的并发模型/模式(例如:生产者消费者模式)?

  1. 生产者消费者
  2. worker模式 并行模式
  3. pipeline tee 扇入 扇出
  4. fork join
  5. csp actor

25. 简述Java的类加载机制,并回答一个JVM中可否存在两个相同的类。

不存在,java类加载是由类加载器+包名+类名来判断的

26. 关系型数据库中表T有A、B、C、D,两个索引idx1(B字段),组合索引idx2(A+B+C字段),查询语句select * From T where B=? and A=? and C=? 会使用哪个索引?并说明理由。

会使用 idx1 和 idx2(a) 补充 or 两边都要有索引

27. 关系型数据库锁的类型及粒度。

整体:共享 和 互斥锁 意向锁 细节:插入意向锁,记录锁,主键锁,间隙锁,临键锁

28. 分片结构的数据库,动态增加分片的解决方案(提示:数据如何迁移)

29. 简述分布式事务的原理。

一致性模型:

  1. 弱一致性
  2. 最终一致性
  3. 强一致性

30. 1T的日记文件,在一台物理机上,用Java写个程序,统计文件中每条日志的重复次数。

31. 请设计一个抢票系统,能够做到先到先得,总数量可配置,抢购记录持久化。至少产出如下工件:领域对象模型、核心模块划分、部署模型 。

32. 简述CAP定理、Base理论。