
知识整理
一、项目介绍(熟悉项目中用到的中间件及其原理。对目前业务现状有反思,思考可能遇到的问题和解决方案)
二、java基础
三、多线程,并发编程
四、JVM
五、分布式
六、mysql
七、其他。maven git
java 基础
一、集合类
Collections分为List、Set、Map
ArrayList的底层实现原理:ArrayList底层实际上用了一个Object[]来存放数据。你知道ArrayList在实例化时,什么时候才分配大小吗?
LindList的底层实现原理:LindList的底层实际是用了双向链表来实现的。你知道LindList的查找算法是什么吗?
ArrayList和LindList的区别
你直接FailFast机制吗?它的底层实现原理?什么时候会出现FailFast?会抛出什么异常?conrrentmodifiled
Set
HashSet的底层实现原理。其实是基于HashMap来实现的
TreeSet的底层实现原理。其实是基于TreeMap来实现的。采用的哪种数据结构?红黑树
HashSet和TreeSet的区别
List和Set的区别
HashMap的底层实现原理?jdk6和jdk8的区别,冲突怎么解决?两个key的Hashcode相同怎么办?线程不安全,为什么?什么情况下会出现循环链表?
ConcurrentHashMap为什么线程安全?底层实现原理?他是并发容器,怎么理解?为什么相比加锁速度快?它的get操作需要加锁吗?他的size操作怎么实现的?
二、多线程
1、线程的实现方式?几种?
2、线程有几种状态?各个状态是怎么运作的?
3、你知道join()方法和yield()方法吗?
4、线程池的伸缩策略?线程池的几个核心参数:coresize,maxsize,keeplivetime,queue. 拒绝策略有几种。
5、创建线程池的几种方式?静态工厂?
6、你知道CountDownLatch、CyclicBarrier、。你知道它们的实现方式吗?基于AQS实现的。AQS很重要的,一定要明白,JUC包下面的大部分功能都是基于它实现的。
7、你知道Synchionized的底层实现原理吗?moniter对象,moniterenter和moniterexit。你知道Synchionized在1.6都做了哪些优化吗?偏向锁、轻量级锁、重量级锁、锁消除、锁粗化。
8、你知道Synchionized和lock的区别吗?
9、你知道Reentrantlock吗?你知道它的实现原理吗?基于AQS.
10、你知道ReentrantReadWriteLock吗?什么场景用它?底层实现原理
11、Reentrantlock,羊群效应。联想到zookeeper的分布式锁如何解决羊群效应
jvm
一、jvm内存分配
分为两大类:线程私有区,线程共享区
线程私有区:程序计数器、虚拟机栈、本地方法栈
线程共享区:堆、方法区(常量池)
以上的每个区域必须知道里面都存放的什么数据,都干了什么操作。会抛出什么异常。
对象的创建过程:1、遇到new指令之后,会先检查这个指令参数是否能在常量池中定位到一个类的符号引用。。。。
二、垃圾收集算器与内存分配策略
1、判断对象是否需要被回收的算法有哪几种?
引用计数器算法、可达性分析算法。
可以作为GCRoots的对象有哪几种?牢记,被问到过
2、对象有几种引用类型?每种的区别。
3、在可达性分析算法中不可达的对象一定会被回收吗?
看是否实现了finalize()方法,里面都干了什么操作。要了解
4、垃圾收集算法都有几种?
标记清除算法
复制算法
标记整理算法
分代收集算法
每种具体干了什么事情,有什么区别都要了解。
5、垃圾收集器
新生代的:serial收集器、ParNew收集器、Parallel Scavenge收集器(吞吐量优先收集器)
老年代、serial old收集器、Parallel old收集器、CMS收集器(重点在重点)、G1收集器(重点)
CMS收集器(重点在重点)都有哪几步?每步都干了什么事情?哪两步会出现"stop the world"
有哪些缺点?1、无法处理“浮动垃圾”,什么是浮动垃圾?2、内存碎片?什么会有内存碎片?因为CMS采用的是标记清楚算法,不带整理过程。CMS怎么解决的? 第一种:当CMS顶不住要Full GC的时候,会开启内存碎片的合并整理过程。
第二种:执行多少次不带压缩的Full GC后,外带一次压缩整理的过程。
6、内存分配策略
- 对象优先在eden分配
- 大对象直接进入老年代
- 长期存活的对象将进入老年代 默认经过几次minor GC
- 动态对象年龄判定 什么意思 怎么理解
- 空间分配担保(重点) 不允许空间分配担保失败,会执行什么操作?
7、类加载过程,几个阶段
加载、验证、准备、解析、初始化、使用、卸载
每一步都干了什么事情,要了解。
8、双亲委托机制。干了什么事情,解决了什么事情。
9、讲一下一个Class类加载的整个过程。。
10、线上OOM排查步骤
- jps -mlvV 找出当前java进程号1234
- jstat -gcutil 1234 1000 10
从这一步查出,full gc次数频繁,由此可见原因是老年代空间不足 dump内存 接下来就是排查问题最重要的一步,dump内存最容易想到的是 - jmap -dump:format=b,file=heap.hprof 1234。
使用eclipse MAT或者visaul VM查看dump文件分析原因
11、 一次load飙高排查过程 - ps -ef | grep java
找出Java进程ID,得到进程ID为21711 - top -Hp 21711
找出该进程内最耗费CPU的线程,TIME列就是各个Java线程耗费的CPU时间,CPU时间最长的是线程ID为21742的线程,用printf "%x\n" 21742,得到21742的十六进制值为54ee,下面会用到。 - jstack 21711 | grep 54ee
它用来输出进程21711的堆栈信息,然后根据线程ID的十六进制值grep。有时这一步并不能从整体上查看性能消耗在哪, 要用jstack 21711 > jstack.txt查看整体情况。