JVM
2020-08-21 17:07:25 0 举报
AI智能生成
JVM
作者其他创作
大纲/内容
垃圾收集
垃圾收集算法(方法论)
标记清除算法
标记复制算法
标记整理算法
分代收集算法
垃圾收集器(实现)
Serial收集器
Serial Old收集器
parallel Scavenge收集器(默认)
parallel Old收集器(默认)
ParNew收集器
CMS收集器
流程
初始标记
并发标记
重新标记
并发清理
并发重置
缺点
CPU敏感
浮动垃圾
空间碎片
收集失败
GC roots
核心参数
三色标记
颜色
黑色
灰色
白色
多标-浮动垃圾
漏标-读写屏障
增量更新
原始快照(SATB)
写屏障
增量更新实现
SATB实现
读屏障
不同垃圾收集齐的解决方案
CMS
G1,Shenandoah
ZGC
CMS和G1不同选择的原因
记忆集
卡表
G1收集器
新概念
Region
新生代
老年代
Humongous区
流程
初始标记(STW)
并发标记
重新标记(STW)
筛选回收(STW)
优先列表
特点
并行与并发
分代收集
空间整合
可预测的停顿
期望值思考
三种GC
Young GC
Mixed GC
Full GC
参数设置
优化
适用场景
安全点
安全区域
对比CMS
选择
优化
调优工具
jmap
-histo
-dump
jstack
jinfo
jstat
JVM运行情况预估
年轻代对象增长速率
Young GC的触发频率和每次耗时
每次Young GC后有多少对象存活和进入老年代
Full GC出发频率和每次耗时
优化思路
子主题
类加载
jvm启动过程
java命令执行
调用jvm.dll生成jvm虚拟机
jvm创建启动类加载器
启动类加载器加载Luncher类
Luncher创建扩展和应用程序类加载器
加载我们指定的主类
jvm执行main方法
加载过程
加载
验证
准备
解析
初始化
类加载器
启动类加载器
扩展类加载器
应用程序类加载器
自定义加载器
双亲委派机制
自定义类加载器
内存模型
堆
新生代
Eden区
From区
To区
老年代
参数
-XX:Xms
-XX:Xmx
-XX:Xmn
方法区
常量
静态变量
类信息
即时编译器编译后的代码缓存
常量池
栈
栈帧
局部变量表
操作数栈
动态链接
方法出口
程序计数器
本地方法栈
字节码执行引擎
对象
结构
对象头
对象自身运行时数据
Hash码
分代年龄
锁住状态标示
线程持有的锁
偏向锁ID
偏向时间戳
类型指针
指针压缩
是什么
jdk6 update14开始在64bit操作系统中,JVM支持指针压缩
jvm配置参数:UseCompressedOops,compressed压缩、oop(ordinary object pointer)对象指针
启用指针压缩:XX:+UseCompressedOops(默认开启),禁止指针压缩:XX:UseCompressedOops
为什么
大指针
减少内存消耗
通过压缩的方式支撑更大空间
小于4G不用开启
32G的限制
数组长度(只有数组有)
实例数据
对齐填充
创建
检查类是否存在
分配内存
划分方式
指针碰撞(默认)
空闲列表
并发问题的解决方法
CAS
本地线程分配缓冲(TLAB,默认)
初始化
设置对象头
执行Init方法
内存分配流程
判断是否栈内分配
在栈内分配
判断是否是大对象
在老年代分配
通过TLAB或者CAS的方式在Eden区分配
逃逸分析
栈内分配
标量替换
内存分配和回收策略
优先在Eden区分配对象
Minor GC/Young GC
Major GC/Full GC
大对象直接进入老年代
长期存活的对象进入老年代
动态年龄判断机制
空间分配担保机制
0 条评论
下一页