十一,面经 - 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的数据区有哪些,作用是什么?
线程私有:
- 程序计数器 记录当前线程锁执行的字节码行号指示器。
- java虚拟机栈, 存放局部变量,本地方法出口信息。
- 本地方法栈,和java虚拟机栈类似,为Nativefunc服务。 线程共享
- java 堆, 存放实例化数据
- 方法区 ,存放类信息(版本、字段、方法、接口等)、常量、静态变量、即时编译后的代码等数据。
- 运行时常量, 存放编译期生成的各种字面量和符号引用
- 直接内存,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 在以下情况下触发:
- 年老代(Tenured)被写满
- 持久代(Perm)被写满
- System.gc()被显示调用
- 上一次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 引擎类型有哪些,各有什么区别,各有什么应用场景?
- innodb 支持事务,外键,引入行锁。适合update频繁场景。
- myisam 索引和数据单独存储,没有簇类索引,适合查询和insert且不考虑事务的情况。但是频繁到更新删除记录会产生碎片。
- memory 存入内存,性能好但是数据容易丢失,时候做缓存类
11. mysql事务隔离级别有哪些,举例说明各自的情况?
- 读未提交, 会产生脏读
- 读已提交, 会产生不可重复读问题
- 可重复读, 会在insert的时候产生幻读,(innodb 通过间隙锁,避免了这个问题
- 序列化
12. 数据库锁有哪几种?有什么区别?
- 行锁,表锁,页锁
- X锁, S锁。 X锁独占,S锁共享
13. mysql 有那几种索引,各有什么区别?
- 全文索引
- Hash 只适合等值匹配。不适合范围查询 O(1)
- Btree 适合范围和等值查询 O(nlogn)
- 普通索引
- 唯一索引
- 主键索引
- 组合索引 为什么是最左匹配原则?建立联合索引的适合是按 col1,col2 排序插入的。跟B+tree结构有关,单独看 col2 就是无序的了
14. 什么是悲观锁和乐观锁,说说他们的特点和应用场景?
悲观锁,认为数据会被别人修改,实施互斥。 访问量不大,写入操作比较频繁的情况。 乐观锁,认为不会有人修改数据,在更新的适合判断数据是否是原来的。(CAS) 乐观锁适用于读比较大写比较少的情况下
15. 分别说下行级锁和表级锁?update t1 set a = xx for update (a字段不是主键,也没加索引),是行级锁还是表级锁?为什么?
- 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
- 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 表锁,innodb是基于索引加锁的。如果不建索引,直接锁表
16. mysql和redis都搭建主从和高可用,你在项目中redis一般在什么场景下使用?
17. synchronized和volatile有什么区别,各自有什么应该场景?
并发安全需要保证,原子性,可见性,有序性 synchronized 可以保证代码区域的原子性和内存可见性 会导致线程阻塞 volatile 用来修饰变量,保证内存可见性,但不具备原子性 不会阻塞线程
18. 如何解决死锁
造成死锁的原因:
- 循环等待条件
- 请求与保持条件 (保证加锁的顺序一致就可以避免
- 互斥
- 不可抢占 (可以增加超时释放机制 死锁文章
19. 谈谈你对JMM、CAS和AQS的理解,CAS下ABA问题及优化方案?
20. 说说单点登录和oauth2协议的流程,它们有什么区别?
21. 如何实现限流?限流常用有哪些算法?各自有什么应用场景?
限流模块以拦截器的方式进行工作 常用限流算法
- 计数
- 漏桶
- 令牌桶
22. aop 控制反转 依赖注入
23. 讲讲你对reactor模式的理解?
24. 请写出你了解的并发模型/模式(例如:生产者消费者模式)?
- 生产者消费者
- worker模式 并行模式
- pipeline tee 扇入 扇出
- fork join
- 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. 简述分布式事务的原理。
一致性模型:
- 弱一致性
- 最终一致性
- 强一致性