JVM入门笔记-摘自黑马程序员

JVM笔记

这是一篇JVM小白的入门笔记,适合刚接触JVM的伙伴们入门参考。

笔记是完全按照我看的视频来的,说实话内容不深很好理解,主要的作用就是把所有的知识点串起来让你不会迷茫,就像画画一样先描好轮廓,后面才能画成,画好;入门之后就可以结合博客和书籍进行深入理解补充知识了(书籍是标准答案),看视频的你只需要对着视频对我的笔记加以修改和补充,效率会事半功倍而且体验感很好(这事我自己没少干哈哈)
视频地址:黑马程序员JVM完整教程,全网超高评价,全程干货不拖沓
我也正在全面深入的补充JVM知识,会很快更新为入好门的伙伴们参考。。。
word文档版
提取码:hlgc
–来自百度网盘超级会员V4的分享

JVM概述

img

img

img

img

img

JVM内存结构

程序计数器

img

img

img

虚拟机栈

img

栈:先进后出

多个线程多个虚拟机栈

一个栈由多个栈帧组成

img

img

img

img

2.栈内存分配越大,物理内存反而越来越少,而线程在物理内存中运行,线程会越来越少;栈内存大了通常只是能进行更多次的方法递归调用,而不会提高运行效率,反而会影响线程数目变少

3.方法内的局部变量如果是每个线程私有的,就不会有线程安全问题;方法内的局部变量如果是每个线程共享的(static),就会出现线程安全问题

img

外防输入,内防输出,保证线程安全哈哈

栈内存溢出

img

栈帧过多导致内存溢出(如:方法递归调用时如果处理不当,方法一直调用便会一直产生栈帧,导致栈内存溢出)

栈帧过大导致内存溢出(这种情况一般出现概率很小)

java.lang.StackOverflowError 栈内存溢出异常

img

可通过-Xss设置虚拟机栈内存大小

img

img

有时候在日常写代码时 第三方的库也会导致栈内存溢出

(如:两个类之间的循环引用导致json引用时出现StackOverflowError 栈内存溢出异常,解决:在json转换时打破这种循环引用,比如让一方中断,加上@JsonIgnore

img

线程运行诊断

img

img

img

img

img

img

img

img

img

img

img

img

img

img

第一个线程一上来就锁住了对象a,休眠2s后会尝试锁住对象b

在第一个线程开始休眠1s后第二个新的线程来了,

第二个线程一上来就锁住了对象b,接着想尝试锁住对象a,这时时间已经过去了1s,但是a已经被线程一锁住了,线程二要等待线程一释放对象a,继续等待1s,线程一会尝试锁住对象b,但是b已经被线程二锁住了,线程一只能等待线程二释放对象b,拿不到对象b导致无法释放对象a;这样两个线程一直在等待对方释放对象,造成死锁

本地方法栈

img

为本地方法的运行提供内存空间

上面的程序计数器,虚拟机栈,本地方法栈都是线程私有的

堆以及下面的方法区都是线程共享的

jvm堆分为:新生代(一般是一个Eden区,两个Survivor区),老年代(old区)

常量池属于 PermGen(方法区)

img

堆内存溢出

堆有垃圾回收机制为什么还会产生内存溢出呢,

当有对象不断地在产生并且这些对象在不断地被使用,那么这些对象就不能当做垃圾被回收,就有可能造成内存溢出

java.lang.OutOfMemoryError:Java heap space 堆内存溢出异常

img

img

可通过-Xmx设置堆内存大小

堆内存诊断

堆内存诊断工具

img

jmap工具:jmap -heap 进程id

img

jconsole工具

img

img

img

img

img

img

img

img

img

排查出肯定是student对象和ArrayList占用内存比较高

并且对象是长时间使用的导致垃圾回收无法回收它们的内存

img

方法区

img

方法区:所有java虚拟机线程共享的区域,它存储了跟类的结构有关的信息,如运行时常量池,类的成员变量,方法数据,成员方法和构造器方法的代码部分;方法区在虚拟机启动时被创建,逻辑上是堆的组成部分,永久代和元空间都是方法区的实现。方法区如果申请内存时发现不足,会让虚拟机抛出OutMemoryError异常,也就是方法区也会导致内存溢出错误

img

方法区内存溢出

img

java.lang.OutfMemoryError:Metaspace 元空间内存溢出异常

img

img

可通过-XX:MaxMetaspaceSize设置元空间内存大小

java.lang.OutfMemoryError:PermGen space 永久代内存溢出异常

img

img

可通过-XX:MaxPermSize设置永久代内存大小

元空间使用的是系统内存(本地内存)便相对充裕很多,不会像永久代一样垃圾回收效率非常的低,导致内存溢出

img

实际场景中使用动态加载类,动态生成类,使用不当都会导致方法区的内存溢出

运行时常量池

img

常量池中的信息,都会被加载到运行常量池中

StringTable(还需要看一下)

StringTable常量池与串池的关系(详情见:https://www.bilibili.com/video/BV1yE411Z7AP?p=28)

StringTable字符串变量拼接

img

img

img

StringTable特性

img

img

img

img

img

img

StringTable位置

img

假如不断地往StringTable内存空间中放入字符串对象,并且用一个长时间存活的对象来应用这些字符串对象,势必会造成内存空间不足,环境下运行如果在1.6环境下运行,便会触发永久代内存运行不足,如果在1.8环境下运行,它触发的内存不足是堆空间不足,

img

img

1.8串池用的是堆空间

1.6串池用的是永久代

运行时常量池存放什么?
存放编译期生成的各种字面量和符号引用;(字面量和符号引用不懂的同学请自行查阅)
运行时常量池中包含多种不同的常量,包括编译期就已经明确的数值字面量,也包括到运行期解析后才能够获得的方法或者字段引用。 此时不再是常量池中的符号地址了,这里换为真实地址。

运行时常量池与字符串常量池?(可能有同学把他俩搞混)
字符串常量池:在JVM中,为了减少相同的字符串的重复创建,为了达到节省内存的目的。会单独开辟一块内存,用于保存字符串常量,这个内存区域被叫做字符串常量池.

StringTable垃圾回收
StringTable调优

img

案例:比如有大量的用户地址信息存储占用大量的内存空间,那么采用字符串intern()方法,可以去除重复的地址,相同的地址在串池中只会存储一份,这样就能减少字符串对于内存空间的占用

直接内存

img

使用direct memory进行大文件的读写效率会非常的高

基本使用

文件读写流程

img

由于java代码访问不到存在系统缓存区中的数据,所以还要转存到java缓存区中才能读到,这样就造成了不必要的数据复制,使读取效率降低

使用direct memory进行文件读写流程

img

使用direct memory在操作系统内直接划出一块缓冲区,这样使得系统和java代码都能访问,大大提高了数据读写效率

内存溢出

java.lang.OutOfMemoryError:Direct buffer memory 直接内存溢出

img

释放原理

img

直接内存 释放通过Unsafe对象管理的(手动调用释放)

java内存 释放通过垃圾回收释放(自动调用释放)

分配和回收原理

img

img

使用-XX:+DisableExplicitGC禁用内存直接回收

垃圾回收

如何判断对象可以回收
引用计数法

img

容易造成内存泄漏

可达性分析算法

img

通过Memory Analyer工具分析堆

img

img

先运行该程序 到1,然后jps命令

img

img

jmap抓取堆的运行状态转储为一个文件

img

选择 Java Basics–》GC Roots 查看根对象

img

img

四种引用

严格来说一般有下面五种引用

强引用

软引用

弱引用

虚引用

终结器引用

img

img

强引用

img

软引用

img

弱引用

img

垃圾回收算法
标记清除算法

Mark Sweep 先标记后清除

优点:速度快 缺点:容易产生内存碎片(空间不连续)

img

标记整理算法

Mark Compact 先标记后整理

优点:没有什么内存碎片 缺点:速度慢

img

复制算法

Copy 先标记后复制

优点:没有什么内存碎片 缺点:会占用双倍的内存空间

img

分代垃圾回收

把堆内存区域划分成了两大区域:新生代和老年代

新生代中存放用完就会丢弃了的对象,老年代中存放长期使用的对象

所以新生代中的垃圾回收发生的比较频繁,老年代中垃圾回收长时间才发生一次

img

新生代垃圾回收:Minor GC

老年代垃圾回收:Full GC

img

相关VM参数

img

读垃圾回收日志

下面是没有运行任何代码时堆内存的使用情况

img

加个7MB的数组

img

如:新生代GC后回收前,新生代的内存占用1984k,回收后的内存占用667k,新生代的总内存大小是9216k,垃圾回收耗时0.0028851 secs

堆的回收前内存占用1984k,回收后的内存占用667k,堆的总内存大小是19456k,垃圾回收耗时0.0029666 secs

GC:新生代发生的垃圾回收

FULL GC:老年代发生的垃圾回收

如果放入的对象太大,新生代和伊甸园都容纳不下时,就不会触发新生代垃圾回收了,对象会直接晋升到老年代

img

如果放入的对象太大,新生代和伊甸园甚至老年代都容纳不下时,会抛出堆内存溢出异常

img

垃圾回收器

img

串行垃圾回收器

Serial工作在新生代 采用的是复制算法

SerialOld工作在老年代 采用的是标记整理算法

img

吞吐量优先垃圾回收器

-XX:+UseParallelGC 工作在新生代的垃圾回收器

-XX:+UseParallelOldGC 工作在老年代的垃圾回收器

可开启多个线程同时进行垃圾回收

-XX:GCTimeRatio=ratio 调整垃圾回收时间和总时间的占比(吞吐量)

-XX:+UseAdaptiveSizePolicy 调整新生代大小堆大小等等

-XX:MaxGCPauseMills=ms 最大暂停毫秒数(垃圾回收时的暂停时间)它和上面的参数时对立的,比如上面堆大小调大,吞吐量会提升,那么每次垃圾回收暂停时间会增长;上面堆大小调小,每次垃圾回收暂停时间会减小,那么吞吐量会降低

-XX:ParallelGCThreads=n 调整垃圾回收的线程数

img

响应时间优先垃圾回收器

concurrent并发:比如用户线程和垃圾回收线程是可以同时运行的

并行:比如多个垃圾回收线程运行期间用户线程不能同时运行

-XX:+UseConcMarkSweepGC 工作在老年代的垃圾回收器,在某些时候可以和用户线程并发执行

-XX:+UseParNewGC =n工作在新生代的垃圾回收器

-XX:ParallelGCThreads=threads 并行线程参数 -XX:ConcGCThreads 并发线程参数

-XX:CMSInitiatingOccupancyFraction=percent 控制何时进行垃圾回收

-XX:+CMSScavengBeforeRemark 在重新标记之前进行新生代的垃圾回收,减轻重新标记的压力

该垃圾回收器的bug是:如果内存碎片过多会造成并发失败,退回到垃圾串行回收,导致时间响应变长造成不好的用户体验

img

G1(垃圾回收器)

img

G1垃圾回收阶段

img

Young Collection 新生代回收阶段

G1把堆内存划分成了一个个大小相等的区域,每个区域都可以独立作为 伊甸园,幸存区和老年代

白色部分是空闲区,一开始分配的对象都会放在伊甸园绿色部分

当伊甸园区域被占满,便会触发新生代的一次垃圾回收

img

幸存的对象会复制到幸存区蓝色部分

img

再工作一段时间,当幸存区的对象也比较多了或者幸存区的对象超过了一定时间,便会再触发新生代的垃圾回收,幸存区的一部分对象会晋升到老年代橙色部分,没有超过时间的对象被复制到新的幸存区中,当然也有一些新生代的对象复制到新的幸存区中

img

Young Collection+CM 新生代垃圾回收和并发标记阶段

img

不会STW:不会停止用户线程

当老年代占到整个堆空间的45%时,就会进行并发标记

E绿色:伊甸园区 S蓝色:幸存区 O橙色:老年代区

img

Mixed Collection 混合收集阶段

img

-XX:MaxGCPauseMillis 垃圾回收时的最大暂停时间

垃圾回收后E中的幸存对象会复制到新S区,别的在S中不够年龄的对象也会被复制到新S区,符合晋升条件的对象也会被复制到O中

在有限的暂停时间内,也会从老年代区中选取回收价值最高的区(O红色部分)进行垃圾回收,复制到新的老年代区中

img

Full GC

img

当垃圾回收速度大于新产生的垃圾的速度时,进行并发收集,响应时间短

当垃圾回收速度小于新产生的垃圾的速度时,并发收集失败,退化成串行收集 full gc,导致响应时间变长

Young Collection 跨带引用

img

新生代垃圾回收过程:首先找到根对象,根对象可达性分析找到存活对象,存活对象复制到幸存区

那么有一个问题:有一些根对象是在老年代中找的,如果遍历整个老年代去寻找根对象效率是非常低的;因此解决这个问题采用卡表技术,把老年代再进行细分,成为多个card。每个card大约是512k;如果老年代中有一个card引用了新生代的对象,那么就把这个card标记为脏card,找根对象时在这些标记的脏card中找就行了,提高了扫描根对象的效率

img

img

Remark

并发标记时对象的处理状态

img

黑色:已经处理完成 灰色:正在处理中 白色:还未处理

有强引用在引用(黑色箭头)变成黑色后最终会存活,而没有被引用的最终会被垃圾回收掉

JDK 8u20 字符串去重

img

原理:让两个字符串对象引用同一个char[]数组

-XX:+UseStirngDeduplication 开启字符串去重功能

JDK 8u40 并发标记类卸载

img

JDK 8u60 回收巨型对象

img

img

巨型对象的垃圾回收有所不同:G1不会对巨型对象进行拷贝,回收时会优先回收巨型对象

当老年代中有card引用了巨型对象,那么这个card标记为脏card,当老年代中没有card引用巨型对象,那么这个巨型对象会在新生代垃圾回收中被回收掉

JDK 9 并发标记起始时间

img

-XX:InitiatingHeapOccupancyPercent 老年代和堆内存的占比阈值 超过阈值时并发垃圾回收开始,阈值默认是45%,实际过程中阈值大了有可能产生full gc,小了会频繁的做并发标记和混合收集,JDK 9以后可以动态的调整这个阈值,尽可能的避免并发垃圾回收退化成串行垃圾回收full gc

JDK 9 更高效的回收

img

垃圾回收调优

image

image-20210722153944206

调优领域

image

确定目标

image

高吞吐量垃圾回收器:ParallelGC

响应时间快垃圾回收器:CMS,G1,ZGC

最快的GC是不发生GC

image

新生代调优

image

我们在做内存调优时一般都从新生代优化,因为新生代的调优空间更大一些

可通过调大新生代内存大小来达到内存优化

-Xmn 设置新生代内存大小

如果新生代内存划得太大,那么垃圾回收时便容易触发老年代垃圾回收,老年代垃圾回收会消耗更长的时间

建议新生代内存占整个堆内存的比例为 大于1/4,小于1/2

image

image

image

新生代最大容量(理想状态):一次请求和响应中产生的对象*并发量

并发量:同一时刻有多少用户访问

老年代调优

image

CMS:低响应时间,并发的垃圾回收器

在垃圾回收时,用户线程运行产生的新的垃圾叫做浮动垃圾,如果浮动垃圾过多导致内存不足便会引发并发失败,退化到串行老年代垃圾回收器,那么效率就变得非常低了,响应时间变得非常长

所以给老年代划分内存空间时会划得大一点,避免浮动垃圾引发并发失败

案例

image

类加载与字节码技术

类文件结构

image

magic 魔数:

image

所有的文件都有自己的特定类型,不同的文件都有自己的魔数信息,如.png和.jpg的魔数信息就不一样

所以魔数用来标识不同文件的类型

版本 version:

image

常量池 constant_pool:(查表没怎么听懂)

image

image-20210722171006133

访问标识与继承信息:

image

image

成员变量 fields:

image

方法 methods:

image-20210722172322077

image-20210722172413515

附加属性:

image

字节码指令

image-20210722173345039

image-20210722173241527

image

图解运行流程

准备:

image-20210722174108762

image-20210722174218910

把class文件中的常量池信息载入到运行时常量池

image-20210722174452429

image-20210722174531462

a赋值:

image-20210722174626788

image-20210722174720529

image-20210722174821777

a被赋值10

剩余:

image-20210722174918216

t

istore_1:把操作数栈栈顶数据弹出来存入到局部变量表中1号槽位

istore_2:把操作数栈栈顶数据弹出来存入到局部变量表中2号槽位

image-20210722175123415

image-20210722175157737

image-20210722175358642

iload_1:把局部变量1槽位的数据读到操作数栈上

iload_2:把局部变量2槽位的数据读到操作数栈上

image-20210722175431555

image-20210722175548738

iadd +操作

将操作数栈中的两个变量弹出,将结果存入到操作数栈

image-20210722175613695

image-20210722175818818

istore_3:把操作数栈栈顶数据弹出来存入到局部变量表中3号槽位

a+b赋值给c

image-20210722175850580

image-20210722180319380

getstatic #4:到常量池中找到成员变量的引用,进而找到其在堆中的对象,最后将堆中的对象引用的地址放入到操作数栈中

image-20210722180401133

image-20210722180417895

iload_3:把局部变量3槽位的数据读到操作数栈上

image-20210722180506776

image-20210722180613326

image-20210722180635026

image-20210722180858754

image-20210722180852357

image-20210722180947933

iload 运算 iinc 自增

bipush:把10放入到操作数栈中

image-20210722181057319

istore_1:把操作数栈栈顶数据弹出来存入到局部变量表中1号槽位

相当于把10赋值给a

image-20210722181207560

iload_1:把局部变量1槽位的数据读到操作数栈上

iinc 1,1:对1槽位自增1

相当于a++ 先运算再自增

image-20210722181441654

这个动作在局部变量表中发生,并没有影响到操作数栈

image-20210722181638132

image-20210722181801633

iinc 1,1:对1槽位自增1

iload_1:把局部变量1槽位的数据读到操作数栈上

相当于++a 先自增再运算

image-20210722181827783

iadd +操作

将操作数栈中的两个变量弹出,将结果存入到操作数栈

image-20210722182021528

image-20210722182043973

iload_1:把局部变量1槽位的数据读到操作数栈上

iinc 1,-1:对1槽位自减1

相当于a-- 先运算再自减

image-20210722182212248

image-20210722182258834

相当于完成了a++ + ++a + a–操作

条件判断指令

image-20210722182549774

image-20210722182702216

image

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

循环控制指令

image

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

这样不断的循环

image

image

image

先自增,a加载到操作数栈,然后将10加载到操作数栈,

如果0<10,跳转到2,否则继续执行

判断结果

image-20210722151925873

iload_x:把局部变量x槽位的数据0读到操作数栈上

iinc x,1:对x槽位自増1 变成了1

相当于x++ 先运算再自増

然后进行赋值操作 将x++赋值给x,也就是将操作数栈中的0赋值给局部变量表中的x,相当于0又覆盖了局部变量表中的值1,所以无论循环多少次,x的值最终还是0

构造方法

()V 整个类的构造方法

image-20210723141738567

image-20210723142002318

()V 每个实例对象的构造方法

image-20210723142204086

image-20210723142519220

image-20210723142614004

结果 S3,30

方法调用

image-20210723143042060

image-20210723143116398

new:给对象在堆空间分配内存,然后把对象的引用放入操作数栈

dup:把栈顶的地址(对象引用的地址)复制一份

invokespecial:根据栈顶的对象引用调用对应的构造方法,调用结束后清除这个对象引用

astore_1:把剩余的对象引用(b变量)出栈存储到局部变量表中

aload_1:从局部变量表中找出刚刚的对象引用(b变量)

invokespecial:调用b变量的私有方法

invokevirtual:调用b变量的final方法

invokestaitc:调用b变量的static方法(static方法不需要对象来调用,所以上面的aload_1和pop是多余的步骤)

多态的原理

image-20210723154739342

image-20210723154649674

image-20210723155101001

image-20210723154845386

HSDB分析多态的查找过程(没有看懂)

image-20210723160228274

异常处理

image-20210723160429806

image-20210723160500009

image-20210723160736439

监测2到5行(有头无尾)代码的运行

如果2到5行(有头无尾)发生Excepton异常

2:bipush 10

4:istore_1

则跳转到第8行 8:astore_2

image-20210723160815558

image-20210723160914062

image-20210723161137837

监测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

image-20210723161840565

image-20210723161944215

image-20210723162336956

监测0到22行(有头无尾)代码的运行

如果0到22行(有头无尾)发生异常,都跳转到第25行

image-20210723162701521

image-20210723164813973

image-20210723165240894

finally面试题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uvlV9WKO-1630314383148)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210728144615031.png)]

image-20210728144652692

有没有异常都返回finally的20,finally中的return吞掉了异常

image-20210728145244239

image-20210728145544233

image-20210728145830378

结果为10

synchronized代码块

image-20210728150516406

image-20210728150618039

image-20210728152130564

monitorenter 加锁

monitorexit 解锁

编译期处理

image-20210728152807605

语法糖–默认构造器

image-20210728152827960

语法糖–自动拆装箱

image-20210728153232348

语法糖–泛型集合取值

image-20210728155512836

image-20210728160733049

image-20210728161339812

语法糖–可变参数

image-20210728161403183

image-20210728161559134

语法糖–foreach循环

image-20210728161713052

image-20210728161921283

image-20210728162017296

语法糖–switch字符串

image-20210728162137499

image-20210728162159324

image-20210728162521626

image-20210728162545221

image-20210728162622221

语法糖–switch枚举

image-20210728164301575

image-20210728164349728

image-20210728164504830

语法糖–枚举类

image-20210728165049066

image-20210728165141162

语法糖–try-with-resource

image-20210728165310592

image-20210728165556224

image-20210728165656719

image-20210728170129465

image-20210728170212845

语法糖–方法重写时的桥接方法

image-20210728170256333

image-20210728170646985

语法糖–匿名内部类

image-20210728170748545

image-20210728171014190

image-20210728171221417

image-20210728171338992

类加载阶段

分以下三个阶段:

加载

image-20210810163847742

image-20210810164230168

链接

验证字节码的格式是否符合规范

image-20210810164623861

1.7之前:static变量跟着instanceKlass存储在元空间中

1.7及以后:static变量跟着Person.class类对象存储在堆中

image-20210811084848680

赋值发生在初始化阶段类的构造方法中

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f9FvFQbj-1630314383214)(C:\Users\LENOVO-LX\AppData\Roaming\Typora\typora-user-images\image-20210811100937753.png)]

image-20210810165511827

初始化

初始化阶段实际上就是去执行类的构造方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李莲花*

多谢多谢,来自一名大学生的感谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值