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)]

JVM入门笔记-摘自黑马程序员相关推荐

  1. 机器学习入门笔记 人工智能 黑马程序员

    机器学习入门笔记 前言 这个是根据"黑马程序员"的一套机器学习课程编写的博客.这篇博客上的案例均为课程里面的,但并没有包含所有案例,只是记录了部分. B站视频地址 文章目录 机器学 ...

  2. JAVA基础语法笔记(黑马程序员系列)

    1. Java概述 1.1 Java语言发展史(了解) 语言:人与人交流沟通的表达方式 计算机语言:人与计算机之间进行信息交流沟通的一种特殊语言 Java语言是美国Sun公司(Stanford Uni ...

  3. jQuery学习笔记【黑马程序员】

    文章目录 前言 JQury学习 1.引入JQury 2.jqury简介 3.jQuery入口函数 4.dom对象与jQuery对象 4.1.dom对象 4.2.jQuery对象 4.3.jQuery对 ...

  4. 学习笔记:黑马程序员C++从0到1(3~4)

    黑马程序员C++从0到1入门编程 3 运算符 3.1 算术运算符 3.2 赋值运算符 3.3 比较运算符 3.4 逻辑运算符 4 程序流程结构 4.1 选择结构 4.1.1 If 语句 4.1.1.1 ...

  5. 【Python飞机大战游戏实战+笔记】黑马程序员Python教程项目实战记录【超详细】

    博主在哔哩哔哩上学习了黑马程序员的python教程,并且完成了老师讲的项目实战,为了巩固知识点通过这篇博客来记录一下. 目录 1. 创建python项目+pygame模块下载 1.1 创建项目 1.2 ...

  6. 深度学习入门笔记,三流程序员如何凭借实力逆袭高薪?你不服不行!

    最近经常有朋友提及,想要入门深度学习,该如何学习? 关于深度学习,网上的资料很多,不过貌似大部分都不太适合初学者. 我曾经是一名三流程序员,每天的工作内容就是在前人留下的 bug 上写新的bug,我以 ...

  7. JavaScript学习笔记--【黑马程序员】

    目录 一.编程语言 1.1 编程 1.2 计算机语言 1.3 编程语言 1.4 翻译器 1.5 编程语言和标记语言区别 总结 二.计算机基础 2.1 计算机组成 2.2.数据存储 2.3 数据存储单位 ...

  8. Uni-App从入门到实战-黑马程序员【uniapp基础知识讲义笔记】

    想要课程资料的同学可以留言,留下你的邮箱哦 ####uni-app的基本使用 课程介绍: 基础部分: 环境搭建 页面外观配置 数据绑定 uni-app的生命周期 组件的使用 uni-app中样式学习 ...

  9. C++入门学习(黑马程序员课程讲义)——第一阶段

    1 C++初识 1.1 编写C++程序步骤 四个:创建项目.创建文件.编写代码.运行程序 1.2 注释 单行注释://描述信息 (通常放在一行代码的上方,或者一条语句的末尾) 多行注释:/描述信息/ ...

最新文章

  1. 介绍一个效率爆表的数据采集框架
  2. ucint核心边缘分析_5G、云计算、物联网与边缘计算的相辅相承
  3. 《水泥公司信息管理系统》Access学习心得
  4. Java基础教程:反射基础
  5. python3随笔-梯度下降法
  6. linux ifconfig route ip 网络相关命令
  7. 网易纯净邮箱5元一个月,有点贵啊
  8. 【数据结构作业—02】双链表
  9. [ASP.NET Core 3框架揭秘] 跨平台开发体验: Mac OS
  10. 分数转小数C语言,这是把小数转换成分数的程序,可是输入0.6666无限循环
  11. lib so 中查找函数
  12. Nginx 常见应用技术指南
  13. 掌握好这几点方法学习Linux,一定比别人更快入门运维!
  14. java实现希尔排序(交换法、移位法) 图解+代码推导
  15. 搞清clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop
  16. 【矩阵论】对称矩阵特征值的性质与直积
  17. Snipaste 截图工具快捷键大全
  18. 自己做一个小项目python_【Python】第一个微信小项目
  19. Nginx配置带www域名转向无www域名
  20. jira迁移问题解决(实践篇)

热门文章

  1. HQChart实战教程30-A股日K线数据对接-uniapp版本
  2. LC串联和并联电路汇总(转)
  3. 怎样在电脑上登录微信,福利到,如何登录电脑微信
  4. iOS开发 搭建视频直播系统,基于LFLiveKit+ijkplayer+rtmp(iOS端)
  5. 智能化选煤厂基础自动化
  6. Transformer40~
  7. B2B2C多用户商城系统运营的小技巧
  8. unity面试n问总结
  9. linux+tomcat+mysql项目中的备份命令
  10. OutLook 2007使用图文教程