目录
-
- 类的加载第一步----loading
- 加载“.class”文件的方式:
- 类的加载第二步----linking
- 类的加载第三步----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
串行、并行的垃圾回收器