JVM笔记
这是一篇JVM小白的入门笔记,适合刚接触JVM的伙伴们入门参考。
笔记是完全按照我看的视频来的,说实话内容不深很好理解,主要的作用就是把所有的知识点串起来让你不会迷茫,就像画画一样先描好轮廓,后面才能画成,画好;入门之后就可以结合博客和书籍进行深入理解补充知识了(书籍是标准答案),看视频的你只需要对着视频对我的笔记加以修改和补充,效率会事半功倍而且体验感很好(这事我自己没少干哈哈)
视频地址:黑马程序员JVM完整教程,全网超高评价,全程干货不拖沓
我也正在全面深入的补充JVM知识,会很快更新为入好门的伙伴们参考。。。
word文档版
提取码:hlgc
–来自百度网盘超级会员V4的分享
JVM概述
JVM内存结构
程序计数器
虚拟机栈
栈:先进后出
多个线程多个虚拟机栈
一个栈由多个栈帧组成
2.栈内存分配越大,物理内存反而越来越少,而线程在物理内存中运行,线程会越来越少;栈内存大了通常只是能进行更多次的方法递归调用,而不会提高运行效率,反而会影响线程数目变少
3.方法内的局部变量如果是每个线程私有的,就不会有线程安全问题;方法内的局部变量如果是每个线程共享的(static),就会出现线程安全问题
外防输入,内防输出,保证线程安全哈哈
栈内存溢出
栈帧过多导致内存溢出(如:方法递归调用时如果处理不当,方法一直调用便会一直产生栈帧,导致栈内存溢出)
栈帧过大导致内存溢出(这种情况一般出现概率很小)
java.lang.StackOverflowError 栈内存溢出异常
可通过-Xss设置虚拟机栈内存大小
有时候在日常写代码时 第三方的库也会导致栈内存溢出
(如:两个类之间的循环引用导致json引用时出现StackOverflowError 栈内存溢出异常,解决:在json转换时打破这种循环引用,比如让一方中断,加上@JsonIgnore
线程运行诊断
第一个线程一上来就锁住了对象a,休眠2s后会尝试锁住对象b
在第一个线程开始休眠1s后第二个新的线程来了,
第二个线程一上来就锁住了对象b,接着想尝试锁住对象a,这时时间已经过去了1s,但是a已经被线程一锁住了,线程二要等待线程一释放对象a,继续等待1s,线程一会尝试锁住对象b,但是b已经被线程二锁住了,线程一只能等待线程二释放对象b,拿不到对象b导致无法释放对象a;这样两个线程一直在等待对方释放对象,造成死锁
本地方法栈
为本地方法的运行提供内存空间
堆
上面的程序计数器,虚拟机栈,本地方法栈都是线程私有的
堆以及下面的方法区都是线程共享的
jvm堆分为:新生代(一般是一个Eden区,两个Survivor区),老年代(old区)
常量池属于 PermGen(方法区)
堆内存溢出
堆有垃圾回收机制为什么还会产生内存溢出呢,
当有对象不断地在产生并且这些对象在不断地被使用,那么这些对象就不能当做垃圾被回收,就有可能造成内存溢出
java.lang.OutOfMemoryError:Java heap space 堆内存溢出异常
可通过-Xmx设置堆内存大小
堆内存诊断
堆内存诊断工具
jmap工具:jmap -heap 进程id
jconsole工具
排查出肯定是student对象和ArrayList占用内存比较高
并且对象是长时间使用的导致垃圾回收无法回收它们的内存
方法区
方法区:所有java虚拟机线程共享的区域,它存储了跟类的结构有关的信息,如运行时常量池,类的成员变量,方法数据,成员方法和构造器方法的代码部分;方法区在虚拟机启动时被创建,逻辑上是堆的组成部分,永久代和元空间都是方法区的实现。方法区如果申请内存时发现不足,会让虚拟机抛出OutMemoryError异常,也就是方法区也会导致内存溢出错误
方法区内存溢出
java.lang.OutfMemoryError:Metaspace 元空间内存溢出异常
可通过-XX:MaxMetaspaceSize设置元空间内存大小
java.lang.OutfMemoryError:PermGen space 永久代内存溢出异常
可通过-XX:MaxPermSize设置永久代内存大小
元空间使用的是系统内存(本地内存)便相对充裕很多,不会像永久代一样垃圾回收效率非常的低,导致内存溢出
实际场景中使用动态加载类,动态生成类,使用不当都会导致方法区的内存溢出
运行时常量池
常量池中的信息,都会被加载到运行常量池中
StringTable(还需要看一下)
StringTable常量池与串池的关系(详情见:https://www.bilibili.com/video/BV1yE411Z7AP?p=28)
StringTable字符串变量拼接
StringTable特性
StringTable位置
假如不断地往StringTable内存空间中放入字符串对象,并且用一个长时间存活的对象来应用这些字符串对象,势必会造成内存空间不足,环境下运行如果在1.6环境下运行,便会触发永久代内存运行不足,如果在1.8环境下运行,它触发的内存不足是堆空间不足,
1.8串池用的是堆空间
1.6串池用的是永久代
运行时常量池存放什么?
存放编译期生成的各种字面量和符号引用;(字面量和符号引用不懂的同学请自行查阅)
运行时常量池中包含多种不同的常量,包括编译期就已经明确的数值字面量,也包括到运行期解析后才能够获得的方法或者字段引用。 此时不再是常量池中的符号地址了,这里换为真实地址。
运行时常量池与字符串常量池?(可能有同学把他俩搞混)
字符串常量池:在JVM中,为了减少相同的字符串的重复创建,为了达到节省内存的目的。会单独开辟一块内存,用于保存字符串常量,这个内存区域被叫做字符串常量池.
StringTable垃圾回收
StringTable调优
案例:比如有大量的用户地址信息存储占用大量的内存空间,那么采用字符串intern()方法,可以去除重复的地址,相同的地址在串池中只会存储一份,这样就能减少字符串对于内存空间的占用
直接内存
使用direct memory进行大文件的读写效率会非常的高
基本使用
文件读写流程
由于java代码访问不到存在系统缓存区中的数据,所以还要转存到java缓存区中才能读到,这样就造成了不必要的数据复制,使读取效率降低
使用direct memory进行文件读写流程
使用direct memory在操作系统内直接划出一块缓冲区,这样使得系统和java代码都能访问,大大提高了数据读写效率
内存溢出
java.lang.OutOfMemoryError:Direct buffer memory 直接内存溢出
释放原理
直接内存 释放通过Unsafe对象管理的(手动调用释放)
java内存 释放通过垃圾回收释放(自动调用释放)
分配和回收原理
使用-XX:+DisableExplicitGC禁用内存直接回收
垃圾回收
如何判断对象可以回收
引用计数法
容易造成内存泄漏
可达性分析算法
通过Memory Analyer工具分析堆
先运行该程序 到1,然后jps命令
jmap抓取堆的运行状态转储为一个文件
选择 Java Basics–》GC Roots 查看根对象
四种引用
严格来说一般有下面五种引用
强引用
软引用
弱引用
虚引用
终结器引用
强引用
软引用
弱引用
垃圾回收算法
标记清除算法
Mark Sweep 先标记后清除
优点:速度快 缺点:容易产生内存碎片(空间不连续)
标记整理算法
Mark Compact 先标记后整理
优点:没有什么内存碎片 缺点:速度慢
复制算法
Copy 先标记后复制
优点:没有什么内存碎片 缺点:会占用双倍的内存空间
分代垃圾回收
把堆内存区域划分成了两大区域:新生代和老年代
新生代中存放用完就会丢弃了的对象,老年代中存放长期使用的对象
所以新生代中的垃圾回收发生的比较频繁,老年代中垃圾回收长时间才发生一次
新生代垃圾回收:Minor GC
老年代垃圾回收:Full GC
相关VM参数
读垃圾回收日志
下面是没有运行任何代码时堆内存的使用情况
加个7MB的数组
如:新生代GC后回收前,新生代的内存占用1984k,回收后的内存占用667k,新生代的总内存大小是9216k,垃圾回收耗时0.0028851 secs
堆的回收前内存占用1984k,回收后的内存占用667k,堆的总内存大小是19456k,垃圾回收耗时0.0029666 secs
GC:新生代发生的垃圾回收
FULL GC:老年代发生的垃圾回收
如果放入的对象太大,新生代和伊甸园都容纳不下时,就不会触发新生代垃圾回收了,对象会直接晋升到老年代
如果放入的对象太大,新生代和伊甸园甚至老年代都容纳不下时,会抛出堆内存溢出异常
垃圾回收器
串行垃圾回收器
Serial工作在新生代 采用的是复制算法
SerialOld工作在老年代 采用的是标记整理算法
吞吐量优先垃圾回收器
-XX:+UseParallelGC 工作在新生代的垃圾回收器
-XX:+UseParallelOldGC 工作在老年代的垃圾回收器
可开启多个线程同时进行垃圾回收
-XX:GCTimeRatio=ratio 调整垃圾回收时间和总时间的占比(吞吐量)
-XX:+UseAdaptiveSizePolicy 调整新生代大小堆大小等等
-XX:MaxGCPauseMills=ms 最大暂停毫秒数(垃圾回收时的暂停时间)它和上面的参数时对立的,比如上面堆大小调大,吞吐量会提升,那么每次垃圾回收暂停时间会增长;上面堆大小调小,每次垃圾回收暂停时间会减小,那么吞吐量会降低
-XX:ParallelGCThreads=n 调整垃圾回收的线程数
响应时间优先垃圾回收器
concurrent并发:比如用户线程和垃圾回收线程是可以同时运行的
并行:比如多个垃圾回收线程运行期间用户线程不能同时运行
-XX:+UseConcMarkSweepGC 工作在老年代的垃圾回收器,在某些时候可以和用户线程并发执行
-XX:+UseParNewGC =n工作在新生代的垃圾回收器
-XX:ParallelGCThreads=threads 并行线程参数 -XX:ConcGCThreads 并发线程参数
-XX:CMSInitiatingOccupancyFraction=percent 控制何时进行垃圾回收
-XX:+CMSScavengBeforeRemark 在重新标记之前进行新生代的垃圾回收,减轻重新标记的压力
该垃圾回收器的bug是:如果内存碎片过多会造成并发失败,退回到垃圾串行回收,导致时间响应变长造成不好的用户体验
G1(垃圾回收器)
G1垃圾回收阶段
Young Collection 新生代回收阶段
G1把堆内存划分成了一个个大小相等的区域,每个区域都可以独立作为 伊甸园,幸存区和老年代
白色部分是空闲区,一开始分配的对象都会放在伊甸园绿色部分
当伊甸园区域被占满,便会触发新生代的一次垃圾回收
幸存的对象会复制到幸存区蓝色部分
再工作一段时间,当幸存区的对象也比较多了或者幸存区的对象超过了一定时间,便会再触发新生代的垃圾回收,幸存区的一部分对象会晋升到老年代橙色部分,没有超过时间的对象被复制到新的幸存区中,当然也有一些新生代的对象复制到新的幸存区中
Young Collection+CM 新生代垃圾回收和并发标记阶段
不会STW:不会停止用户线程
当老年代占到整个堆空间的45%时,就会进行并发标记
E绿色:伊甸园区 S蓝色:幸存区 O橙色:老年代区
Mixed Collection 混合收集阶段
-XX:MaxGCPauseMillis 垃圾回收时的最大暂停时间
垃圾回收后E中的幸存对象会复制到新S区,别的在S中不够年龄的对象也会被复制到新S区,符合晋升条件的对象也会被复制到O中
在有限的暂停时间内,也会从老年代区中选取回收价值最高的区(O红色部分)进行垃圾回收,复制到新的老年代区中
Full GC
当垃圾回收速度大于新产生的垃圾的速度时,进行并发收集,响应时间短
当垃圾回收速度小于新产生的垃圾的速度时,并发收集失败,退化成串行收集 full gc,导致响应时间变长
Young Collection 跨带引用
新生代垃圾回收过程:首先找到根对象,根对象可达性分析找到存活对象,存活对象复制到幸存区
那么有一个问题:有一些根对象是在老年代中找的,如果遍历整个老年代去寻找根对象效率是非常低的;因此解决这个问题采用卡表技术,把老年代再进行细分,成为多个card。每个card大约是512k;如果老年代中有一个card引用了新生代的对象,那么就把这个card标记为脏card,找根对象时在这些标记的脏card中找就行了,提高了扫描根对象的效率
Remark
并发标记时对象的处理状态
黑色:已经处理完成 灰色:正在处理中 白色:还未处理
有强引用在引用(黑色箭头)变成黑色后最终会存活,而没有被引用的最终会被垃圾回收掉
JDK 8u20 字符串去重
原理:让两个字符串对象引用同一个char[]数组
-XX:+UseStirngDeduplication 开启字符串去重功能
JDK 8u40 并发标记类卸载
JDK 8u60 回收巨型对象
巨型对象的垃圾回收有所不同:G1不会对巨型对象进行拷贝,回收时会优先回收巨型对象
当老年代中有card引用了巨型对象,那么这个card标记为脏card,当老年代中没有card引用巨型对象,那么这个巨型对象会在新生代垃圾回收中被回收掉
JDK 9 并发标记起始时间
-XX:InitiatingHeapOccupancyPercent 老年代和堆内存的占比阈值 超过阈值时并发垃圾回收开始,阈值默认是45%,实际过程中阈值大了有可能产生full gc,小了会频繁的做并发标记和混合收集,JDK 9以后可以动态的调整这个阈值,尽可能的避免并发垃圾回收退化成串行垃圾回收full gc
JDK 9 更高效的回收
垃圾回收调优
调优领域
确定目标
高吞吐量垃圾回收器:ParallelGC
响应时间快垃圾回收器:CMS,G1,ZGC
最快的GC是不发生GC
新生代调优
我们在做内存调优时一般都从新生代优化,因为新生代的调优空间更大一些
可通过调大新生代内存大小来达到内存优化
-Xmn 设置新生代内存大小
如果新生代内存划得太大,那么垃圾回收时便容易触发老年代垃圾回收,老年代垃圾回收会消耗更长的时间
建议新生代内存占整个堆内存的比例为 大于1/4,小于1/2
新生代最大容量(理想状态):一次请求和响应中产生的对象*并发量
并发量:同一时刻有多少用户访问
老年代调优
CMS:低响应时间,并发的垃圾回收器
在垃圾回收时,用户线程运行产生的新的垃圾叫做浮动垃圾,如果浮动垃圾过多导致内存不足便会引发并发失败,退化到串行老年代垃圾回收器,那么效率就变得非常低了,响应时间变得非常长
所以给老年代划分内存空间时会划得大一点,避免浮动垃圾引发并发失败
案例
类加载与字节码技术
类文件结构
magic 魔数:
所有的文件都有自己的特定类型,不同的文件都有自己的魔数信息,如.png和.jpg的魔数信息就不一样
所以魔数用来标识不同文件的类型
版本 version:
常量池 constant_pool:(查表没怎么听懂)
访问标识与继承信息:
成员变量 fields:
方法 methods:
附加属性:
字节码指令
图解运行流程
准备:
把class文件中的常量池信息载入到运行时常量池
a赋值:
a被赋值10
剩余:
istore_1:把操作数栈栈顶数据弹出来存入到局部变量表中1号槽位
istore_2:把操作数栈栈顶数据弹出来存入到局部变量表中2号槽位
iload_1:把局部变量1槽位的数据读到操作数栈上
iload_2:把局部变量2槽位的数据读到操作数栈上
iadd +操作
将操作数栈中的两个变量弹出,将结果存入到操作数栈
istore_3:把操作数栈栈顶数据弹出来存入到局部变量表中3号槽位
a+b赋值给c
getstatic #4:到常量池中找到成员变量的引用,进而找到其在堆中的对象,最后将堆中的对象引用的地址放入到操作数栈中
iload_3:把局部变量3槽位的数据读到操作数栈上
iload 运算 iinc 自增
bipush:把10放入到操作数栈中
istore_1:把操作数栈栈顶数据弹出来存入到局部变量表中1号槽位
相当于把10赋值给a
iload_1:把局部变量1槽位的数据读到操作数栈上
iinc 1,1:对1槽位自增1
相当于a++ 先运算再自增
这个动作在局部变量表中发生,并没有影响到操作数栈
iinc 1,1:对1槽位自增1
iload_1:把局部变量1槽位的数据读到操作数栈上
相当于++a 先自增再运算
iadd +操作
将操作数栈中的两个变量弹出,将结果存入到操作数栈
iload_1:把局部变量1槽位的数据读到操作数栈上
iinc 1,-1:对1槽位自减1
相当于a-- 先运算再自减
相当于完成了a++ + ++a + a–操作
条件判断指令
iconst_0:得到0这个常量(表示数-1~5之间的数)
istore_1:存入到a变量
iload_1:从局部变量表中把a加载进来放入操作数栈进行比较
ifne 12 :如果操作数栈中的数不等于0,跳转到12行
bipush 20:给操作数栈上放入一个20
istore_1:(将20)存入到a变量
ifne 12 :如果操作数栈中的数等于0,继续往下走
bipush 10:给操作数栈上放入一个10
istore_1:(将10)存入到a变量
goto 15:跳转到末行号15 return
循环控制指令
iconst_0:得到0这个常量(表示数-1~5之间的数)
istore_1:存入到a变量
iload_1:从局部变量表中把a加载进来放入操作数栈进行比较
bipush 20:给操作数栈上放入一个10
if_icmpge 14:比较两个整数,0是否大于等于10,如果是则跳转到14行,否则继续往下走
iinc 1,1:将变量a自增
goto 2:跳转到行号2
这样不断的循环
先自增,a加载到操作数栈,然后将10加载到操作数栈,
如果0<10,跳转到2,否则继续执行
判断结果
iload_x:把局部变量x槽位的数据0读到操作数栈上
iinc x,1:对x槽位自増1 变成了1
相当于x++ 先运算再自増
然后进行赋值操作 将x++赋值给x,也就是将操作数栈中的0赋值给局部变量表中的x,相当于0又覆盖了局部变量表中的值1,所以无论循环多少次,x的值最终还是0
构造方法
()V 整个类的构造方法
()V 每个实例对象的构造方法
结果 S3,30
方法调用
new:给对象在堆空间分配内存,然后把对象的引用放入操作数栈
dup:把栈顶的地址(对象引用的地址)复制一份
invokespecial:根据栈顶的对象引用调用对应的构造方法,调用结束后清除这个对象引用
astore_1:把剩余的对象引用(b变量)出栈存储到局部变量表中
aload_1:从局部变量表中找出刚刚的对象引用(b变量)
invokespecial:调用b变量的私有方法
invokevirtual:调用b变量的final方法
invokestaitc:调用b变量的static方法(static方法不需要对象来调用,所以上面的aload_1和pop是多余的步骤)
多态的原理
HSDB分析多态的查找过程(没有看懂)
异常处理
监测2到5行(有头无尾)代码的运行
如果2到5行(有头无尾)发生Excepton异常
2:bipush 10
4:istore_1
则跳转到第8行 8:astore_2
监测2到5行(有头无尾)代码的运行
如果2到5行(有头无尾)发生ArithmeticException异常
2:bipush 10
4:istore_1
则跳转到第8行 8:astore_2
如果2到5行发生NullPointerException异常,则跳转到第15行 15:astore_2
如果2到5行发生Exception异常,则跳转到第22行 22:astore_2
监测0到22行(有头无尾)代码的运行
如果0到22行(有头无尾)发生异常,都跳转到第25行
finally面试题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uvlV9WKO-1630314383148)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210728144615031.png)]
有没有异常都返回finally的20,finally中的return吞掉了异常
结果为10
synchronized代码块
monitorenter 加锁
monitorexit 解锁
编译期处理
语法糖–默认构造器
语法糖–自动拆装箱
语法糖–泛型集合取值
语法糖–可变参数
语法糖–foreach循环
语法糖–switch字符串
语法糖–switch枚举
语法糖–枚举类
语法糖–try-with-resource
语法糖–方法重写时的桥接方法
语法糖–匿名内部类
类加载阶段
分以下三个阶段:
加载
链接
验证字节码的格式是否符合规范
1.7之前:static变量跟着instanceKlass存储在元空间中
1.7及以后:static变量跟着Person.class类对象存储在堆中
赋值发生在初始化阶段类的构造方法中
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9FvFQbj-1630314383214)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811100937753.png)]
初始化
初始化阶段实际上就是去执行类的构造方法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fMlSXjd7-1630314383216)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811105158831.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FromH5mg-1630314383218)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811161204080.png)]
练习
看有没有初始化就看静态代码块有没有执行
不会导致类初始化的情况:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NdJvpO6m-1630314383219)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811161938854.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wBGj1Jie-1630314383221)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811161959861.png)]
5种情况都不会执行静态代码块中的内容a init 或b init,即没有导致类初始化
会导致类初始化的情况:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-D14pvOfI-1630314383222)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811162357239.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t8vq6zQ1-1630314383223)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811162436922.png)]
4种情况都会执行静态代码块中的内容a init 或b init,即导致类初始化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1uRIT91w-1630314383227)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811162625791.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RlI7h6if-1630314383228)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811163104260.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BpDBWvXZ-1630314383230)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811163327869.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8q0QvpuM-1630314383231)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811163431377.png)]
类加载器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-foiLZLEv-1630314383232)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811164314602.png)]
启动类加载器
扩展类加载器
应用程序类加载器
启动类加载器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HPtFoPsz-1630314383233)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811164647499.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FrU15IvI-1630314383234)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811165218556.png)]
结果是null,说明是启动类加载器(因为其无法直接访问java代码)
拓展类加载器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zljSN226-1630314383236)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811165357122.png)]
输出AppClassLoader应用程序类加载器
当应用程序类加载器想要加载G这个类文件的时候,它要问它的上级扩展类加载器同不同意,如果扩展类加载器在自己的类路径下找到了同名的类文件G,那么扩展类加载器就会加载这个类文件G,应用程序类加载器就没有机会去加载文件了
那么这时便会输出 ExtClassLoader扩展类加载器
双亲委派模式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GlKGXEt3-1630314383238)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811170956524.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-khqeykI9-1630314383239)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811171338049.png)]
1.首先检查本类类加载器中有没有加载过这个类,如果没有,就看它有没有上级,如果有的话就递归调用上级类加载器的loadClass方法完成类加载,直到没有上级了;没有上级的类加载器便是启动类加载器;如果上级也没有,就回到本类类类加载器中找,如果找到了,就返回对应的值,如果没找到就返回class not find错误
线程上下文类加载器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MmZqyBYX-1630314383240)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811172808264.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FhrWTEkT-1630314383241)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811174007494.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6TX2mTTt-1630314383242)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811172828788.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CMWgsdv4-1630314383243)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811172934178.png)]
JDK打破了双亲委派模式,在DriverManager类初始化的时候,理应启用启用类加载器所有与它相关联的类的加载,实际上却使用了应用程序类加载器
所以JDK在某些情况下需要打破双亲委派模式,有时候会使用应用程序类加载器进行类加载,否则有些类是找不到的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Uy06eewE-1630314383245)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811174935356.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZK27Bwht-1630314383246)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811175041238.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ISTknfnN-1630314383247)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811175158658.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kE70mU34-1630314383248)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811175337448.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fb7MGIz5-1630314383249)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811175450429.png)]
线程上下文类加载器默认是应用程序类加载器
自定义类加载器
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OmbmX96g-1630314383251)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811175714627.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QNTnd6h2-1630314383252)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811180514018.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qalWXvoB-1630314383254)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811180414761.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cK8UGdO9-1630314383255)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811180635831.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-laKDzKAP-1630314383257)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811181015967.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-63gxo82q-1630314383259)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811181156196.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-daxK4VEA-1630314383262)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811181139315.png)]
多次执行类加载器方法,实际上类文件只会加载一次,不会重复的类加载
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cLqlChmb-1630314383264)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811181357156.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AnfNLIXg-1630314383266)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811181413414.png)]
不同的类加载器对象加载同一个类,结果是不同的类
运行期优化
逃逸分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L9wM8Gny-1630314383268)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812100854556.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dCupCrLN-1630314383270)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812101514586.png)]
即时编译器JIT将反复执行的代码编译成机器码,存储在代码缓存当中,下次再遇到这种代码时,就不会吧它解释成为机器码了,而是从代码缓存中将编译好的机器码直接拿来用,这样代码的执行效率就会很高
C1:做一些基本的优化,需要做信息统计操作profiling,在代码运行期间收集字节码运行状态的数据;如果发现某个方法被频繁的调用了,那么就会上升为C2编译器
C2:做一些更完全更彻底的优化
发现频繁执行频繁调用的代码并加以优化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-epha13VT-1630314383272)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821093504588.png)]
分析new Object()对象会不会在循环外被用到
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yqu73PHH-1630314383273)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821094046471.png)]
关闭了即时编译器就没法进入到C2优化层面了
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wI494soC-1630314383275)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821094333436.png)]
方法内联
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BAK4baJv-1630314383277)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821094640948.png)]
外层循环:统计内层循环每调用1000次的执行时间
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HGq6fjrb-1630314383278)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821095131046.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-67A6mIJW-1630314383280)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821095323624.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qwjqk3vf-1630314383281)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821095445023.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s0l24Z34-1630314383283)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821095649582.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qXFmRaAj-1630314383285)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821095938186.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VQ959jt0-1630314383286)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821100120195.png)]
中间有优化,但时间再也不能下降到0了
字段优化
针对成员变量或静态成员变量读写操作的优化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8DovULwC-1630314383287)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821100457105.png)]
编写基准测试代码
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UEwAkgm9-1630314383289)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821100901771.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ybuF6vhO-1630314383290)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821101231193.png)]
INLINE允许方法内联
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0ZpsOpw6-1630314383291)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821101529051.png)]
接下来禁用doSum方法内联
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HEotw6h8-1630314383292)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821101749298.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-07MTtMZo-1630314383293)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821102028978.png)]
反射优化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gJHJtwvW-1630314383294)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210821103816599.png)]
内存模型
java内存模型
它与多线程更多的相关联
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PoyHtA12-1630314383296)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812103333388.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SVQwiYEc-1630314383297)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812103520261.png)]
通过加锁操作保证同一时刻只能有一个线程进入代码块
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8YhyifPA-1630314383298)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812154129636.png)]
用synchronize对对象加锁的力度建议要大一些
i++ 4条虚拟机指令作为一个整体来进行加锁,循环5万次(加锁解锁5万次),非常耗时
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Io9cAQWA-1630314383299)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812160325227.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U0tyreyH-1630314383301)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812160744352.png)]
20万条虚拟机指令作为一个整体来进行加锁,循环1次,非常耗时
减少了加锁解锁次数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LWQYAl1A-1630314383302)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812164309257.png)]
原子性
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x8uElmSv-1630314383304)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812164524713.png)]
结果不一定是0,结果很随机
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s6OggyQ4-1630314383305)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812164644244.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-F3pHtXrh-1630314383306)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812165123826.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ocp0Dcs7-1630314383307)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812165226480.png)]
在多线程情况下由于指令交错产生的问题的分析
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pq44TjEM-1630314383308)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812172546531.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yCpQRFuw-1630314383309)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812172924588.png)]
可见性
退不出的循环
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7nTHV3Oo-1630314383311)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812173206214.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-o8SXkDP3-1630314383312)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812173316062.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-a8pS77zT-1630314383314)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812173338988.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IIT0hbEd-1630314383316)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812173409817.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aeFwTWR3-1630314383317)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812173512416.png)]
volatile修饰的变量每次是到主存中去读取的,保证了线程读取到的是最新的结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cbm7GSLo-1630314383320)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812173909174.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1qjxNXu1-1630314383321)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812174257054.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oZ0o36f6-1630314383323)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812174614991.png)]
因为println底层中有synchronize关键字,可以防止当前线程从高速缓存中获取值,让线程从主存中读取最新值
有序性
诡异的结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-52RnnJwW-1630314383324)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812175358037.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vtOe6Ul4-1630314383325)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812175618451.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eLNLoxZf-1630314383328)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812175720695.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GIuWoa6y-1630314383329)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812180229958.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4NJUXnTb-1630314383331)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812180319514.png)]
volatile修饰的变量,可以禁用指令重排
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-11WHzvp1-1630314383332)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812180414470.png)]
没有0的结果出现了
有序性理解
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-S53VSfH4-1630314383333)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812180725364.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IxuNHUis-1630314383334)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812180819052.png)]
双重检查锁由于指令重排造成的问题
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-92eUTYXp-1630314383335)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812181305751.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vBXFba5n-1630314383336)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812181951325.png)]
happens-before
描述了哪些写操作对读操作是可见的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4MzkYAG8-1630314383337)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812182313367.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vrFTbT2Q-1630314383339)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812182534674.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Si8G70cK-1630314383340)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812182703169.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yaGYWA37-1630314383341)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210812182740857.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lznB196A-1630314383343)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813090800862.png)]
CAS与原子类
CAS
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FcbTEOEC-1630314383344)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813091513682.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ga52pFkJ-1630314383345)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813093952820.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3ZwkcFgv-1630314383346)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813094027349.png)]
乐观锁与悲观锁
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EdLu3fHB-1630314383348)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813100556248.png)]
原子操作类
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-khz8PFJb-1630314383349)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813100651560.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tw7B6V2g-1630314383351)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813100752610.png)]
synchronize优化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VvDoO9Dl-1630314383352)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813100858040.png)]
轻量级锁
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XxpqEwQ4-1630314383353)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813101253537.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HFYCfk45-1630314383354)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813111008954.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mDXL2F9X-1630314383355)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813111310011.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lTXeRdeF-1630314383357)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813111551844.png)]
加锁:将Mark Word加入到锁记录中
解锁:将锁记录中的Mark Word还回去
00:轻量级锁
01:重量级锁
锁膨胀
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EA1jBDA8-1630314383358)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813112355293.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BKq7ui8j-1630314383359)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813112458469.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NLNKMLnj-1630314383360)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813112605507.png)]
重量锁
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cExHZLgR-1630314383361)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813113123988.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6gDjGYoD-1630314383362)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813112808739.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ygxGxSP-1630314383364)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813112948648.png)]
偏向锁
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GNU6Lckf-1630314383366)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813113714916.png)]
其他优化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5kwcdWa9-1630314383367)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813114012874.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9zUq1o1a-1630314383370)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813114147425.png)]
1630314383324)]
[外链图片转存中…(img-vtOe6Ul4-1630314383325)]
[外链图片转存中…(img-eLNLoxZf-1630314383328)]
[外链图片转存中…(img-GIuWoa6y-1630314383329)]
[外链图片转存中…(img-4NJUXnTb-1630314383331)]
volatile修饰的变量,可以禁用指令重排
[外链图片转存中…(img-11WHzvp1-1630314383332)]
没有0的结果出现了
有序性理解
[外链图片转存中…(img-S53VSfH4-1630314383333)]
[外链图片转存中…(img-IxuNHUis-1630314383334)]
双重检查锁由于指令重排造成的问题
[外链图片转存中…(img-92eUTYXp-1630314383335)]
[外链图片转存中…(img-vBXFba5n-1630314383336)]
happens-before
描述了哪些写操作对读操作是可见的
[外链图片转存中…(img-4MzkYAG8-1630314383337)]
[外链图片转存中…(img-vrFTbT2Q-1630314383339)]
[外链图片转存中…(img-Si8G70cK-1630314383340)]
[外链图片转存中…(img-yaGYWA37-1630314383341)]
[外链图片转存中…(img-lznB196A-1630314383343)]
CAS与原子类
CAS
[外链图片转存中…(img-FcbTEOEC-1630314383344)]
[外链图片转存中…(img-ga52pFkJ-1630314383345)]
[外链图片转存中…(img-3ZwkcFgv-1630314383346)]
乐观锁与悲观锁
[外链图片转存中…(img-EdLu3fHB-1630314383348)]
原子操作类
[外链图片转存中…(img-khz8PFJb-1630314383349)]
[外链图片转存中…(img-tw7B6V2g-1630314383351)]
synchronize优化
[外链图片转存中…(img-VvDoO9Dl-1630314383352)]
轻量级锁
[外链图片转存中…(img-XxpqEwQ4-1630314383353)]
[外链图片转存中…(img-HFYCfk45-1630314383354)]
[外链图片转存中…(img-mDXL2F9X-1630314383355)]
[外链图片转存中…(img-lTXeRdeF-1630314383357)]
加锁:将Mark Word加入到锁记录中
解锁:将锁记录中的Mark Word还回去
00:轻量级锁
01:重量级锁
锁膨胀
[外链图片转存中…(img-EA1jBDA8-1630314383358)]
[外链图片转存中…(img-BKq7ui8j-1630314383359)]
[外链图片转存中…(img-NLNKMLnj-1630314383360)]
重量锁
[外链图片转存中…(img-cExHZLgR-1630314383361)]
[外链图片转存中…(img-6gDjGYoD-1630314383362)]
[外链图片转存中…(img-2ygxGxSP-1630314383364)]
偏向锁
[外链图片转存中…(img-GNU6Lckf-1630314383366)]
其他优化
[外链图片转存中…(img-5kwcdWa9-1630314383367)]
[外链图片转存中…(img-9zUq1o1a-1630314383370)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A7qowyoI-1630314383372)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210813114317770.png)]