Java基础知识图谱
2021-12-16 15:18:06 0 举报
AI智能生成
登录查看完整内容
Java基础知识图谱
作者其他创作
大纲/内容
虚拟机栈
局部变量表
操作数栈
动态连接
返回地址
本地方法栈
程序计数器
线程独享
复制
对象有地方引用,引用计数+1,引用失效-1,无法解决循环引用
引用计数法
通过GC ROOT向下查找引用链,不可达的为可回收
虚拟机栈种引用的对象
本地方法栈引用的对象
方法区中常量引用的对象
类static修饰的对象
GC ROOT:
可达性分析法
标记阶段:
老年代对新生代对象的引用,将老年代卡页标记为dirty,新生代回收时优先读卡页,快速查出新生代被引用的对象。
跨代引用
标记-清除
标记-整理
算法
Serial
Parnew
Parrel Scanvenge
CMS
G1
回收器
垃圾回收
作用?
堆
永久代
metaSpace
方法区
线程共享
内存结构
内存模型(JMM)
JVM
双亲委派
BootStrap ClassLoader
Ext ClassLoader
App ClassLoader
Custom ClassLoader
类加载器
加载
验证
准备
解析
初始化
加载流程
类加载机制
线程状态
corePoolSize
maxPoolSize
workQueue
queueSize
丢弃任务,抛出异常
abortPolicy
丢弃任务,不抛出异常
discardPolicy
丢弃最老的任务,即队列头节点的任务,不抛出异常
discardOldPolict
任务交给提交任务的线程处理
callerRunsPolicy
rejectPolicy
线程存活超过该时间,销毁线程
keepAliveTime+时间单位
计算密集型:核数的1-2倍
IO密集型:CPU 核心数 *(1+平均等待时间/平均工作时间)
核心线程数设定:
LinkedBlockingQueue
FixedThreadPool
SingleThreadExecutor
synchronousQueue
CachedThreadPool
delayedWorkQueue
ScheduledThreadPool
SingleThreadScheduledExecutor
ForkJoinPool
线程池类型
线程池
synchronize
用法不同。syn可加在方法上、代码块上。lock必须由锁对象加解锁
加解锁顺序不同,lock1、lock2的加解锁顺序自定义,syn如果锁嵌套,必须内层先解锁
syn不够灵活,A线程获得锁之后,B想获得只能阻塞,lock则在tryLock之后做其他操作
syn只能被1个线程拥有。lock没限制,比如读写锁的读锁,可以被多个线程持有
原理区别。syn是jvm内置锁,有锁升级过程。lock根据实现不同有不同原理,比如reentrantLock是AQS实现的
ReentrantLock可以设置公平、非公平,syn不能
synchronize与lock区别:
reentrantLock
lock
MESI是怎么保证缓存一直性的呢?举个栗子:
LoadLoad屏障:对于这样的语句Load1; LoadLoad; Load2,在Load2及后续读取操作要读取的数据被访问前,保证Load1要读取的数据被读取完毕。StoreStore屏障:对于这样的语句Store1; StoreStore; Store2,在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。LoadStore屏障:对于这样的语句Load1; LoadStore; Store2,在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。StoreLoad屏障:对于这样的语句Store1; StoreLoad; Load2,在Load2及后续所有读取操作执行前,保证Store1的写入对所有处理器可见。它的开销是四种屏障中最大的。
在每个volatile写操作的前面插入一个StoreStore屏障。在每个volatile写操作的后面插入一个StoreLoad屏障。在每个volatile读操作的前面插入一个LoadLoad屏障。在每个volatile读操作的后面插入一个LoadStore屏障。
volatile
是一个用于构建锁、同步器等线程协作工具类的框架
状态(volatile int state)
队列
期望协作工具类去实现的获取/释放等重要方法
核心三部分
AQS
CountdownLatch
Semaphore
cyclibarrier
偏向锁/轻量级锁/重量级锁;可重入锁/非可重入锁;共享锁/独占锁;公平锁/非公平锁;悲观锁/乐观锁;自旋锁/非自旋锁;可中断锁/不可中断锁。
锁的分类:
保存每个线程独享的对象
每个线程内需要独立保存信息,以便供其他方法更方便的获取该信息
应用场景
一个thread只有一个threadLocalMap,一个threadLocalMap可以有很多个threadLocal
threadLocalMap的每个entry都是一个对key的弱引用,但entry包含了一个对value的强引用
threadLocal
多线程
源码分析:扩容情况下线程不安全,put方法中有modCount++操作,导致扩容期间取出的值不准确
同时put碰撞导致数据丢失
可见性问题无法保证
扩容时可能发生死循环,导致CPU 100%
Hashmap
Hashset
Concurrent Hashmap
ArrayList
Linkedlist
集合类
对应的引用等传递
传入void方法中,操作对象后会影响原方法中引用的对象值
引用传递
String/基本类型/包装类型 都是值传递
传入void方法中,操作值后不影响原方法中的值
值传递
引用传递/值传递
Java
0 条评论
回复 删除
下一页