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