目录

  • 类的加载第一步----loading
  • 加载“.class”文件的方式:
  • 类的加载第二步----linking![在这里插入图片描述](https://img-blog.csdnimg.cn/20210101202341316.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01hc29uOTc=,size_16,color_FFFFFF,t_70)
  • 类的加载第三步----Initialization
  • 类的加载器分类:
  • Bootstrap ClassLoader
  • Extension ClassLoader
  • AppClassLoader
  • 用户自定义类加载器 | 实现步骤
  • 获取ClassLoader的途径
  • 双亲委派机制 以及 优势
  • 类的主动使用(类初始化)
  • 开始运行时数据区的学习
  • JVM中的主要线程
  • PC寄存器
  • 虚拟机栈和栈帧
  • 可以设置VM栈的大小
  • 栈帧里面有什么?
  • 栈帧中的“局部变量表”
  • 局部变量表的基本单元-----变量槽(slot)
  • 静态方法中不能引用this-----用局部变量表来解释
  • 我对局部变量表和操作数栈的理解
  • 动态链接【栈帧的组成部分之一】【目的是减小空间占用】
  • 虚方法与非虚方法
  • 虚方法表:
  • 栈帧的另一个结构----方法返回地址
  • 本地方法接口
  • 什么是本地方法:
  • 本地方法栈
  • JAVA堆
  • 堆空间 分代收集理论
  • java堆的进一步细分
  • 调整年轻代和老年代的内存比例
  • 调整年轻代中,(Eden区)和(两个幸存者区)的内存大小比例
  • 年轻代与老年代的转换:
  • 新对象申请和GC流程
  • Minor GC、Major GC、Full GC
  • Minor GC触发机制
  • Major GC / Full GC触发机制
  • 内存分配策略
  • TLAB(Thread Local Allocation Buffer)
  • 空间分配担保
  • 堆是分配对象存储的唯一选择吗?(不是)
  • 逃逸分析概述:
  • 使用逃逸分析,编译器可以对代码做出以下优化:
  • 同步省略 / 锁消除
  • 标量替换的例子。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的练习题:
  • intern()的作用:
  • 垃圾回收的面试题:
  • 什么是垃圾?
  • 引用计数算法:
  • 可达性分析 | 根搜索算法 | 追踪性垃圾收集
  • GC Roots有哪些?
  • Stop the World
  • finalize()方法:
  • 判定是否回收需经两次标记过程:
  • finalize()方法的缺点:
  • 标记清除算法:
  • 复制算法:
  • 新生代中就采用了复制算法。
  • 标记压缩/整理算法:
  • System.gc()
  • 内存泄漏
  • 内存泄漏的例子:
  • Stop The World
  • 串行、并行的垃圾回收器
  • 安全点:
  • 强软弱虚引用:
  • 弱引用
  • 虚引用的构造
  • 守护线程的意义:【当不存在非守护线程,守护线程也结束】















类的加载第一步----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

串行、并行的垃圾回收器


安全点:

强软弱虚引用:

弱引用

虚引用的构造

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

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

  1. 尚硅谷2020最新版宋红康JVM教程-中篇-第3章类的加载过程(类的生命周期)详解-4-过程三:Initialization(初始化)阶段

    static与final的搭配问题 初始化阶段,简言之,为类的静态变量赋予正确的初始值. 具体描述 类的初始化是类装载的最后一个阶段.如果前面的步骤都没有问题,那么表示类可以顺利装载到系统中.此时,类 ...

  2. 尚硅谷2020最新版宋红康JVM教程-16-垃圾回收相关概念

    转载: https://www.bilibili.com/video/BV1PJ411n7xZ 参考: https://gitee.com/moxi159753/LearningNotes/tree/ ...

  3. 尚硅谷2020最新版宋红康JVM教程-中篇-第4章:再谈类的加载器-02和03-类的加载器分类

    引言 JVM支持两种类型的类加载器,分别为引导类加载器(Bootstrap ClassLoader)和自定义类加载器(User-Defined ClassLoader). 从概念上来讲,自定义类加载器 ...

  4. 尚硅谷2020最新版宋红康JVM教程-10-对象实例化内存布局与访问定位

    转载: https://www.bilibili.com/video/BV1PJ411n7xZ 参考: https://gitee.com/moxi159753/LearningNotes/tree/ ...

  5. 尚硅谷2020最新版周阳SpringCloud(H版alibaba)框架开发教程 学习笔记

    前言:今天看到周阳老师出了新课,十分欣喜,很喜欢周阳老师的讲课风格,内容也充实,我也算是周阳老师忠实粉丝啦. 新出的springcloud第二版很符合我现阶段的学习需求.但美中不足的是,目前只有视频资 ...

  6. 尚硅谷2020最新版SpringCloud(H版alibaba)框架开发教程全套完整版从入门到精通

    01_前言闲聊和课程说明 02_零基础微服务架构理论入门 03_第二季Boot和Cloud版本选型 04_Cloud组件停更说明 05_父工程Project空间新建 06_父工程pom文件 07_复习 ...

  7. JVM从入门到精通(尚硅谷宋红康)

    不动笔墨不读书,先把书读厚,再把书读薄是我学习方式. 所以等理解了再整理一次笔记,目前笔记和视频一一对应. 笔记连载中 <尚硅谷2020最新版宋红康JVM> 第1章:JVM与Java体系结 ...

  8. 尚硅谷 宋红康 JVM教程_02_字节码与类的加载篇

    本系列相关链接 尚硅谷 宋红康 JVM教程_01_内存与垃圾回收篇--01 (20210103-20210110) https://blog.csdn.net/wei198621/article/de ...

  9. 【MySQL入门到高级之基础篇(参考尚硅谷宋红康老师2022版)】

    文章目录 第一章数据库概述 为什么要使用数据库 数据库与数据库管理系统 数据库的相关概念 数据库与数据库管理系统的关系 常见的数据库管理系统排名(DBMS) 常见的数据库介绍 MySQL介绍 概述 M ...

最新文章

  1. 全文翻译(二): TVM: An Automated End-to-End Optimizing Compiler for Deep Learning
  2. 【超详细】一文学会链表解题
  3. “认知计算”如何有效释放数据价值
  4. 统计_statistics_不同的人_大样本_分析_统计方法_useful ?
  5. 插入排序Insertion sort 2
  6. 图片变成暗灰色的html,暗灰色的圆形按钮.html
  7. hdu 6579 Operation (在线线性基)
  8. 二、MyBatis常用对象分析 封装工具类
  9. 2020年线上农产品消费趋势报告
  10. 【RMQ问题】求数组区间最大值,NYOJ-1185-最大最小值
  11. 二叉树 -- 5.1.1 Binary Tree Level Order Traversal-1 -- 图解
  12. android studio高考倒计时,高考倒计时app排行榜
  13. HTML签名生成图片+可加水印
  14. python情绪识别_人脸情绪识别 测试心得(示例代码)
  15. java所有单词_JAVA常用英语单词列表
  16. 程序员课外拓展001:EI收录号Accession number中的数字的含义
  17. eNSP不同网段主机互联-DHCP
  18. 机器学习隐私保护-MPC通用编译器
  19. 创业赢利模式之一 鱼模式
  20. C语言中.h开头文件的书写和用法

热门文章

  1. 5.5. Modifying Tables
  2. 2023 届秋招回顾,寒气逼人。。。
  3. 机器学习 -- 信用卡评分模型 -- 互联网金融风控
  4. c:计算零件数有一堆零件(100--1000之间),如果分成4个零件一组的若干组,则多2个零件;如果分成7个零件一组的若干组,则多3个零件;如果分成9个零件一组的若干组,则多5个零件。编程计算满足上
  5. stylus插件的图片
  6. 台式电脑计算机的内存叫什么,电脑内存和硬盘有什么区别 电脑内存和硬盘区别介绍【详解】...
  7. Problem Q 蜜蜂找房子
  8. https://blog.csdn.net/qq_28175337/article/details/47336777 ( KMP )
  9. GameFramework教程✨十四、AB包资源初始化(单机模式),与资源预加载
  10. Lego MindStorms NXT 井字棋机器人算法讨论