文档索引页
README
JVM与Java体系结构
前言
架构师每天都在思考什么?
为什么要学习JVM
Java vs C++
推荐书籍
Java生态圈
字节码
多语言混合编程
Java发展的重大事件
虚拟机与Java虚拟机
虚拟机
Java虚拟机
JVM的位置
JVM整体结构
Java代码执行流程
JVM的架构模型
举例
字节码反编译
总结
栈
JVM生命周期
虚拟机的启动
虚拟机的执行
虚拟机的退出
JVM发展历程
Sun Classic VM
Exact VM
HotSpot VM
JRockit
IBM的J9
KVM和CDC / CLDC Hotspot
Azul VM
Liquid VM
Apache Marmony
Micorsoft JVM
Taobao JVM
Dalvik VM
Graal VM
总结
类加载子系统
概述
类加载器子系统作用
类的加载过程
加载阶段
加载class文件的方式
链接阶段
准备 Prepare
解析 Resolve
初始化阶段
类加载器的分类
虚拟机自带的加载器
扩展类加载器(Extension ClassLoader)
应用程序类加载器(系统类加载器,AppClassLoader)
用户自定义类加载器
查看根加载器所能加载的目录
关于ClassLoader
双亲委派机制
工作原理
双亲委派机制举例
沙箱安全机制
双亲委派机制的优势
其它
如何判断两个class对象是否相同
类的主动使用和被动使用
运行时数据区概述及线程
前言
线程
JVM系统线程
程序计数器
介绍
作用
代码演示
使用PC寄存器存储字节码指令地址有什么用呢?
PC寄存器为什么被设定为私有的?
CPU时间片
虚拟机栈
虚拟机栈概述
Java虚拟机栈是什么
生命周期
作用
栈的特点
开发中遇到哪些异常?
设置栈内存大小
栈的存储单位
栈中存储什么?
栈运行原理
栈帧的内部结构
局部变量表
关于Slot的理解
Slot的重复利用
静态变量与局部变量的对比
操作数栈
概念
代码追踪
栈顶缓存技术
动态链接
方法调用:解析与分配
链接
绑定机制
早晚期绑定的发展历史
虚方法和非虚方法
invokednamic指令
动态类型语言和静态类型语言
方法重写的本质
方法的调用:虚方法表
方法返回地址
一些附加信息
栈的相关面试题
本地方法接口
什么是本地方法
为什么使用Native Method?
与Java环境的交互
与操作系统的交互
Sun's Java
现状
本地方法栈
本地方法栈
堆
堆的核心概念
堆内存细分
设置堆内存大小与OOM
OutOfMemory举例
年轻代与老年代
图解对象分配过程
概念
图解过程
思考:幸存区区满了后?
对象分配的特殊情况
代码演示对象分配过程
常用的调优工具
总结
Minor GC,MajorGC、Full GC
Minor GC
Major GC
Full GC
GC 举例
堆空间分代思想
内存分配策略
为对象分配内存:TLAB
问题:堆空间都是共享的么?
为什么有TLAB?
什么是TLAB
TLAB分配过程
小结:堆空间的参数设置
堆是分配对象的唯一选择么?
逃逸分析
栈上分配
同步省略
分离对象和标量替换
代码优化之标量替换
逃逸分析的不足
小结
方法区
前言
栈、堆、方法区的交互关系
方法区的理解
HotSpot中方法区的演进
设置方法区大小与OOM
jdk7及以前
JDK8以后
如何解决这些OOM
方法区的内部结构
类型信息
域信息
方法(Method)信息
non-final的类变量
全局常量
运行时常量池 VS 常量池
常量池
运行时常量池
方法区使用举例
方法区的演进细节
为什么永久代要被元空间替代?
StringTable为什么要调整位置
静态变量存放在那里?
方法区的垃圾回收
总结
常见面试题
对象实例化内存布局与访问定位
对象实例化
面试题
对象创建方式
创建对象的步骤
初始化分配到的内存
设置对象的对象头
执行init方法进行初始化
对象实例化的过程
对象内存布局
对象头
实例数据(Instance Data)
小结
对象的访问定位
图示
对象访问的两种方式
直接内存
非直接缓存区和缓存区
存在的问题
执行引擎
执行引擎概述
执行引擎的工作流程
Java代码编译和执行过程
什么是解释器(Interpreter)
什么是IT编译器
为什么Java是半编译半解释型语言
机器码、指令、汇编语言
机器码
指令
指令集
汇编语言
高级语言
C、C++源程序执行过程
字节码
解释器
解释器分类
现状
JIT编译器
Java代码的执行分类
问题来了
HotSpot JVM执行方式
案例
概念解释
热点探测技术
方法调用计数器
热点衰减
回边计数器
HotSpotVM 可以设置程序执行方法
HotSpotVM中 JIT 分类
C1 和 C2编译器不同的优化策略
分层编译策略
总结
AOT编译器
写到最后
StringTable
String的基本特性
为什么JDK9改变了结构
String的不可变性
面试题
注意
String的内存分配
为什么StringTable从永久代调整到堆中
String的基本操作
字符串拼接操作
底层原理
拼接操作和append性能对比
intern()的使用
intern的空间效率测试
面试题
new String("ab")会创建几个对象
new String("a") + new String("b") 会创建几个对象
intern的使用:JDK6和JDK7
扩展
总结
StringTable的垃圾回收
G1中的String去重操作
描述
实现
开启
垃圾回收概述
概念
什么是垃圾
什么是垃圾?
磁盘碎片整理
大厂面试题
为什么需要GC
早期垃圾回收
Java垃圾回收机制
优点
担忧
GC主要关注的区域
垃圾回收相关算法
标记阶段:引用计数算法
循环引用
举例
小结
标记阶段:可达性分析算法
概念
思路
GC Roots可以是哪些?
注意
对象的finalization机制
注意
生存还是死亡?
具体过程
代码演示
MAT与JProfiler的GC Roots溯源
MAT是什么?
命令行使用 jmap
使用JVIsualVM
使用MAT打开Dump文件
JProfiler的GC Roots溯源
如何判断什么原因造成OOM
清除阶段:标记-清除算法
执行过程
什么是清除?
缺点
清除阶段:复制算法
背景
核心思想
优点
缺点
注意
清除阶段:标记-整理算法
背景
执行过程
标清和标整的区别
标整的优缺点
小结
分代收集算法
增量收集算法
概述
缺点
分区算法
写到最后
垃圾回收相关概念
System.gc()的理解
手动GC来理解不可达对象的回收
内存溢出
内存泄漏
举例
Stop The World
垃圾回收的并行与并发
并发
并行
并发和并行对比
垃圾回收的并行与并发
安全点与安全区域
安全点
安全区域
再谈引用
再谈引用:强引用
举例
总结
再谈引用: 软引用
再谈引用:弱引用
再谈引用:虚引用
案例
终结器引用
垃圾回收器
GC分类与性能指标
垃圾收集器分类
评估GC的性能指标
性能指标:吞吐量
性能指标:暂停时间
吞吐量vs暂停时间
不同的垃圾回收器概述
垃圾回收器发展史
7种经典的垃圾收集器
7款经典收集器与垃圾分代之间的关系
垃圾收集器的组合关系
如何查看默认垃圾收集器
Serial回收器:串行回收
总结
ParNew回收器:并行回收
Parallel回收器:吞吐量优先
参数配置
CMS回收器:低延迟
CMS为什么不使用标记整理算法?
优点
缺点
设置的参数
小结
JDK后续版本中CMS的变化
G1回收器:区域化分代式
既然我们已经有了前面几个强大的GC,为什么还要发布Garbage First(G1)?
为什么名字叫 Garbage First(G1)呢?
G1垃圾收集器的优点
G1垃圾收集器的缺点
G1参数设置
G1收集器的常见操作步骤
G1收集器的适用场景
分区Region:化整为零
G1垃圾回收器的回收过程
Remembered Set(记忆集)
G1回收过程-年轻代GC
G1回收过程-并发标记过程
G1回收过程 - 混合回收
G1回收可选的过程4 - Full GC
G1回收的优化建议
垃圾回收器总结
怎么选择垃圾回收器
面试
GC日志分析
verbose:gc
PrintGCDetails
补充
Young GC图片
FullGC图片、
GC回收举例
垃圾回收器的新发展
Open JDK12的Shenandoash GC
革命性的ZGC
AliGC
本书使用 GitBook 发布
README
介绍
来源Bilibili尚硅谷宋红康老师JVM教程:
硅谷2020最新版宋红康JVM教程
目录
内存与垃圾回收篇
JVM与Java体系结构
类加载子系统
运行时数据区概述及线程
程序计数器
虚拟机栈
本地方法接口
本地方法栈
堆
方法区
对象实例化内存布局与访问定位
直接内存
执行引擎
StringTable
垃圾回收概述
垃圾回收相关算法
垃圾回收相关概念
垃圾回收器
字节码与类的加载篇
性能监控与调优篇
大厂面试篇
results matching "
"
No results matching "
"