尚硅谷2020最新版宋红康JVM教程更新至中篇(java虚拟机详解,jvm从入门到精通)

目录

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

类的加载第一步----loading

在这里插入图片描述

加载“.class”文件的方式:

在这里插入图片描述

类的加载第二步----linking在这里插入图片描述

类的加载第三步----Initialization

在这里插入图片描述

  • clinit只有在有静态变量,静态代码块出现的时候才有。会将静态变量和静态代码块的语句合并起来。按先后顺序,顺序执行。【在linking的prepare阶段都已经赋为默认值了】
  • <clinit>()方法加锁了。如果多线程都想加载这个类,但是一个线程在加载的过程中阻塞了。那么所有的线程都会阻塞。

类的加载器分类:

在这里插入图片描述
在这里插入图片描述

Bootstrap ClassLoader

在这里插入图片描述

Extension ClassLoader

在这里插入图片描述

AppClassLoader

在这里插入图片描述

用户自定义类加载器 | 实现步骤

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

获取ClassLoader的途径

在这里插入图片描述

双亲委派机制 以及 优势

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

类的主动使用(类初始化)

在这里插入图片描述

开始运行时数据区的学习

在这里插入图片描述

  • 下图:红色的一个进程一份(和JVM生命周期一致);灰色的和线程的生命周期一致。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

JVM中的主要线程

在这里插入图片描述

PC寄存器

  • 存下一个指令的地址。
    在这里插入图片描述

虚拟机栈和栈帧

在这里插入图片描述

可以设置VM栈的大小

在这里插入图片描述
在这里插入图片描述

栈帧里面有什么?

在这里插入图片描述

栈帧中的“局部变量表”

在这里插入图片描述
在这里插入图片描述

局部变量表的基本单元-----变量槽(slot)

在这里插入图片描述

静态方法中不能引用this-----用局部变量表来解释

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

我对局部变量表和操作数栈的理解

  • 局部变量表就是一个仓库。存着各个变量的值。
  • 操作数栈是配合class中方法指令来的。相当于一个寄存器。一个栈的结构。

动态链接【栈帧的组成部分之一】【目的是减小空间占用】

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

虚方法与非虚方法

在这里插入图片描述
在这里插入图片描述

虚方法表:

在这里插入图片描述

栈帧的另一个结构----方法返回地址

在这里插入图片描述

本地方法接口

  • 下图中画红框的部分:在这里插入图片描述

什么是本地方法:

在这里插入图片描述
在这里插入图片描述

本地方法栈

在这里插入图片描述

JAVA堆

在这里插入图片描述

堆空间 分代收集理论

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

  • jdk1.8
    在这里插入图片描述
  • jdk1.7
    在这里插入图片描述

java堆的进一步细分

在这里插入图片描述

调整年轻代和老年代的内存比例

在这里插入图片描述

  • 默认的比例【年轻代:老年代 = 1:2】
    在这里插入图片描述

调整年轻代中,(Eden区)和(两个幸存者区)的内存大小比例

在这里插入图片描述
在这里插入图片描述

  • 为什么上图新生代的三个区并不是8:1:1呢?因为JVM有自适应。
  • 用第三个命令来关闭自适应。【并不好使…必须显示设置】
    在这里插入图片描述
  • 显示设置【可以了】
    在这里插入图片描述
    在这里插入图片描述

年轻代与老年代的转换:

在这里插入图片描述
在这里插入图片描述

新对象申请和GC流程

在这里插入图片描述

Minor GC、Major GC、Full GC

在这里插入图片描述

Minor GC触发机制

在这里插入图片描述
在这里插入图片描述

Major GC / Full GC触发机制

在这里插入图片描述
在这里插入图片描述

内存分配策略

在这里插入图片描述
在这里插入图片描述

TLAB(Thread Local Allocation Buffer)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

空间分配担保

  • jdk1.7之前可以调参。含及以后就不能调了。
    在这里插入图片描述

在这里插入图片描述

堆是分配对象存储的唯一选择吗?(不是)

在这里插入图片描述

逃逸分析概述:

在这里插入图片描述

使用逃逸分析,编译器可以对代码做出以下优化:

在这里插入图片描述

同步省略 / 锁消除

在这里插入图片描述
在这里插入图片描述

  • 字节码仍然有锁的身影。如果有逃逸分析会在字节码去运行时进行省略:
    在这里插入图片描述

标量替换的例子。point不能逃逸。直接把他分解。

在这里插入图片描述
在这里插入图片描述

堆是分配对象存储的唯一选择吗?NO->YES

在这里插入图片描述
在这里插入图片描述

  • 我们可以说对象就是分配在堆的。(视频中的效果来自标量替换)

从线程共享与否来看数据区各个结构

在这里插入图片描述

开始方法区的学习

栈、堆、方法区的交互关系

在这里插入图片描述

方法区隶属于堆区吗?(名义上属于)

在这里插入图片描述

方法区的基本理解:

在这里插入图片描述

方法区 | 永久代 | 元空间

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

设置方法区的大小:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

方法区的内存结构:

在这里插入图片描述

方法区存储什么?

在这里插入图片描述

类型信息:

在这里插入图片描述

运行时常量池:

在这里插入图片描述

运行时常量池 vs 常量池

在这里插入图片描述
在这里插入图片描述

常量池中有什么?

在这里插入图片描述

运行时常量池:

在这里插入图片描述

一个例子展示:class文件中的字节码指令,class文件中的常量池,JVM栈中栈帧中的操作数栈,JVM栈中栈帧中的本地变量表,程序计数器的联动。

在这里插入图片描述

在这里插入图片描述

方法区的演进细节:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

为什么要将字符串常量池和静态变量放到堆中?

在这里插入图片描述

方法区垃圾收集哪两部分内容?

在这里插入图片描述

小结 | 常见的面试题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对象实例化开始

美团和蚂蚁金服有关对象实例化的面试题:

在这里插入图片描述

创建对象的六种方式:

在这里插入图片描述

对象的实例化过程:【一共6个步骤】

在这里插入图片描述

对象布局:

在这里插入图片描述
在这里插入图片描述

如果通过栈帧中的对象引用访问到对象实例?

在这里插入图片描述

对象访问的主要两种方式:

在这里插入图片描述

句柄访问图示:

在这里插入图片描述

直接指针的图示:

在这里插入图片描述

直接分配内存的代码演示:

在这里插入图片描述

执行引擎:

在这里插入图片描述

java代码编译和执行的过程:

在这里插入图片描述

什么是解释器?什么是JIT编译器?

在这里插入图片描述

高级语言,汇编语言,机器指令的关系

在这里插入图片描述

解释器和JIT及时编译器的图示:

在这里插入图片描述

解释器 和 JIT编译器 的作用:(编译器相当于大招,有前摇)

在这里插入图片描述

何时解释执行?何时JIT编译执行?

在这里插入图片描述

热度衰减:

在这里插入图片描述

String的内存分配:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

字符串的拼接:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

intern的作用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

new String(“ab”) 和 new String(“a”) + new String(“b”)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

String的intern()的使用总结:

在这里插入图片描述

intern的练习题:

jdk6中:true,false
jdk7中:true,true
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

intern()的作用:

  • intern()能够大量节省内存空间。
  • 其实就是循环利用了,不用每次都开辟内存。
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

垃圾回收的面试题:

在这里插入图片描述

什么是垃圾?

在这里插入图片描述

引用计数算法:

在这里插入图片描述

  • 内存泄漏(循环引用)
    在这里插入图片描述

可达性分析 | 根搜索算法 | 追踪性垃圾收集

在这里插入图片描述

GC Roots有哪些?

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

Stop the World

在这里插入图片描述

finalize()方法:

在这里插入图片描述

判定是否回收需经两次标记过程:

在这里插入图片描述

finalize()方法的缺点:

  • https://www.liangzl.com/get-article-detail-127434.html
    在这里插入图片描述

标记清除算法:

在这里插入图片描述
在这里插入图片描述

复制算法:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

新生代中就采用了复制算法。

在这里插入图片描述

在这里插入图片描述

标记压缩/整理算法:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

System.gc()

在这里插入图片描述

内存泄漏

在这里插入图片描述
在这里插入图片描述

内存泄漏的例子:

在这里插入图片描述

Stop The World

在这里插入图片描述

串行、并行的垃圾回收器

在这里插入图片描述
在这里插入图片描述

安全点:

在这里插入图片描述

强软弱虚引用:

在这里插入图片描述

弱引用

在这里插入图片描述

虚引用的构造

在这里插入图片描述

守护线程的意义:【当不存在非守护线程,守护线程也结束】

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/Mason97/article/details/111878019
今日推荐