JVM全家桶 (图文详解均在注释,图片需要时间加载)
2023-06-30 14:57:52 0 举报
AI智能生成
JVM知识大全,结构清晰明了,知识点解析充分,简约而不简单。
作者其他创作
大纲/内容
类相关
类加载过程
1、加载
2、验证<br>
3、准备<br>
4、解析
5、初始化
6、使用<br>
7、卸载<br>
类加载器<br>
启动类加载器-Bootstrap ClassLoader<br>
扩展类加载器-Extension ClassLoader<br>
应用程序类加载器-Application ClassLoader<br>
用户自定义类加载器-User ClassLoader<br>
双亲委托机制<br>
好处<br>
确保安全,避免java核心类库被修改<br>
避免重复加载<br>
保证类的唯一性<br>
如何破坏双亲委派机制<br>
重写 loadClass()<br>
不打破双亲委派而重写加载方法<br>
重写findClass()
自定义类加载器
继承ClassLoader<br>
覆盖loadClass()或者findClass()方法<br>
java内存模型<br>
jvm内存结构<br>
内存区域划分
私有区<br>
虚拟机栈<br>
栈布局
压栈出栈过程<br>
局部变量表
压栈图示
栈内存
局部变量表<br>
操作数栈<br>
方法返回地址<br>
动态链接<br>
虚拟机栈的特点<br>
本地方法栈
程序计数器
公有区<br>
堆
堆的特点
对象在堆中的分配方式<br>
指针碰撞:内存规整时使用
空闲列表:内存不规整时使用
TLAB:本地线程缓冲区<br>
对象分配过程<br>
Full GC /Major GC 触发条件<br>
四种引用方式<br>
元空间<br>
常量池
构成<br>
字面量<br>
符号引用<br>
作用<br>
运行时常量池<br>
符号地址变为真实地址<br>
对象的创建过程
本机直接内存<br>
内存回收
如何判断对象能否回收?<br>
GC Root<br>
内存分配与回收策略<br>
短期存活、长期存活<br>
大对象直接进入老年代<br>
动态对象年龄判定<br>
老年代空间担保机制<br>
什么情况下对象会进入老年代?<br>
为什么需要分新生代和老年代?<br>
为什么要年轻代要分2个survivor区?<br>
Minor GC vs Major GC/Full GC<br>
触发Full GC的情况<br>
回收算法<br>
复制算法(新生代)<br>
标记-清除算法
标记-整理算法(老年代)<br>
优缺点
分代收集算法
垃圾收集器
收集器特点
分类
serial<br>
serial old<br>
parNew<br>
parallel scavenge,<font color="#f44336"><b>追求 CPU 吞吐量</b></font><br>
吞吐量 = 运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)
parallel old<br>
CMS<br>
四个阶段
初始标记<br>
并发标记<br>
重新标记<br>
并发清除<br>
缺点
1、并发收集会占用CPU资源<br>
2、会产生浮动垃圾<br>
3、产生碎片空间<br>
总结
设计目的<br>
最求最短垃圾回收暂停时间
回收过程<br>
初始标记、并发标记、并发预处理、重新标记和并发清除<br>
弊端<br>
会产生内存碎片、需要空间预留、<b><font color="#f44336">停顿时间是不可预知的</font></b>
被弃用的原因
1、CPU占用不可控
2、退化成SerialOld,暂停用户线程,单线程回收,性能下降
3、停顿时间不可预知
G1
基本原理<br>
如何做到可预测的停顿时间?<br>
Java堆进行Region拆分
追踪每个Region的回收价值<br>
建立可预测的停顿时间模型<br>
大对象处理<br>
新生代垃圾回收<br>
1个eden和2个survivor<br>
示例
老年代垃圾回收<br>
是一种<font color="#f44336"><b>复制算法,</b></font>不会产生碎片<br>
新老年混合回收<br>
G1回收失败时的Full GC<br>
什么时候使用G1?<br>
各种收集器使用场景
jvm调优
0 条评论
下一页