- JVM
- java虚拟机:程序计数器,虚拟机栈(栈针),本地方法栈,堆(对象分配),运行时常量池。
- 类加载:(字节码)验证-准备-解析-初始化-使用-卸载;类和类加载器唯一确定类;类加载的双亲委派-委派父类加载的的层级加载模型。
- 对象:检查-分配内存-内存初始化-设置-对象初始化;分配:指针碰撞和空闲列表;定位:句柄和直接指针(java使用);存活:引用计数器和可达性分析(java使用);引用:强引用;软引用(OOM);弱引用(GC)虚引用。
- 垃圾回收:算法:标记清除,复制算法,标记整理算法,分代收集算法G1,ZGC;回收器:并行和串行;CMS老年代标记清除算法(产生碎片),ParNew 新生代复制算法。老年代GC其他都为标记整理算法。
- JMM
- 内存模型:对象,本地内存,主内存的共享内存模型。
- as-if-serial:串行处理结果的正确性;happens-before:一个操作对另外一个操作的可见性。
- 重排:内存屏障:loadload,loadstore,storestore,storeload(全功能),临界区(加锁)。
- volatile的内存语义:写时本地内存刷新至主内存,内存屏障storestore,storeload,使用CPU的lock指令;读时本地内存失效从主内存读取,loadload,loadstore。
- 锁的内存语义:释放锁时本地内存刷新至主内存,获取锁时本地内存失效从主内存获取数据,synchronizeds关键字CPU指令monitortext和monitorexit。
- final的内存语义:final域写入和对象引用使用不能重排,读final域和读对象引用不能重排。
- 锁的四种状态:无锁,偏向锁,轻量级锁(CAS),重量级锁;乐观锁和悲观锁。
- 池化技术:连接池;线程池
- 核心参数:核心数,最大数,核心存活时间,阻塞队列,工厂类,饱和策略(抛异常,当前线程,FIFO,丢弃)。
- AQS和锁
- AQS是通过先入先出的等待队列实现阻塞锁和同步器的框架;该框架volatile int state变量来保存锁的状态;通过模板方tryAcquire(), tryRelease(),tryAcquireShared(),tryReleaseShared()实现独占或共享锁及同步器。
- 公平锁和非公平锁:每个线程抢占锁的顺序为先后调用lock方法的顺序依次获取锁为公平锁,反之为非公平锁。
- 锁:lock范式,可重入锁,读写锁,信号量,回环栅栏,门闩。
- CAS和线程安全类
- CAS(Compare And Swap)java虚拟机调用处理器CAS指令保证这是一个原子操作。
- ABA问题:版本戳,CAS改进:longAdder分段迁移CAS。
- ConcurrentHashMap:用table+链表+红黑树的形式存储数据。当key值相等的元素形成的链表中元素个数超过8个的时候链表转红黑树, 当key值相等的元素形成的链表中元素个数低于6个的时候红黑树转链表;Map的默认大小是16,每次扩容翻倍,负载因子为0.75(数组超过0.75的负载之后进行扩容);ConcurrentHashMap主要利用CAS方法保证了线程的安全性。
- Collections.synchronizedList(new ArrayList<>());Collections.synchronizedSet(new TreeSet<>());
- 流式编程
- 并行流:基于forkjoin分而治之和工作觅取框架实现。
- 其他
- 深拷贝和浅拷贝:只拷贝基本类型;拷贝基本类型和引用类型。
- yield (让出),await(等待),notify(唤醒),sleep(暂停),join(插入)
- 进程是系统分配资源的最小单位;线程是CPU调度的最小单位;协程属于线程,由用户调度。
- 死锁:两个及以上进程因资源竞争或彼此通信而造成的阻塞现象;简单死锁:执行顺序;动态死锁:内在排序;活锁(相互谦让)随机休眠。