jvm相关
2020-04-05 22:35:13 57 举报
jvm
作者其他创作
大纲/内容
source
macos jvm
回收算法进行垃圾回收
Serial+Serial Old
1
局部变量表
复制
符号引用:可以理解为是一种占位符直接引用:可以理解为指向类、字段、方法存储在内存中的实际地址的指针
字节码指令的执行,涉及局部变量表和操作数栈数据的出入
改进
垃圾回收算法
3、标记第二步并发时工作线程产生新的可达对象
4、筛选回收
用户线程3
machine
java方法栈
用户线程1
可预测停顿时间原理:避免在全Java堆进行收集1、将内存划分为大小相等Region2、每个Region记录垃圾堆积大小和所需回收时间3、G1维护一个优先列表,根据允许收集时间回收价值最大的Region
为什么java能跨平台
标记-整理
system os
class二进制流
4、动态对象年龄判断
栈帧n
基本数据类型变量存储真正的值引用类型变量存储是一个地址(指向堆中的某个实例数据)
Extension Classloader
G1
NameAndType
u1 tag;u2 index1;u2 index2;
关注吞吐量
Object4
Object2
Serial/Serial Old 过程
堆
使用
jre
class文件格式
Serial Old
对象实例
APP Classloader
程序计数器
类库
关注停顿时间
jvm
FullGC0、程序代码System.gc()1、方法区空间不够2、大对象分配给老年代3、Minor GC时,可能引起Full GC
new创建的对象实例都在堆区
3
用户线程4
Class
Utf-8
Methodref
用户线程2
栈帧1
groovy
魔数
u1 tag;u2 class_index;u2 name_type_index;
CPU 0
优点:1、解决 碎片化问题2、存活对象少,效率高缺点:3、存活对象多,效率低4、浪费一半空间
1、优先分配在Eden区
CPU 2
方法体执行
回收线程4
linux
栈帧
方法区静态变量引用
可见性
2、并发标记
运行时常量池
java
对象的初始化:1、在new一个对象时,jvm是会执行 实例变量的赋值
访问标志
jdk和jre
4、并发清除垃圾对象
字段说明
surivor区
不允许失败则触发Full GC
Fieldref
年轻代1、存活对象少,经常回收2、可将老年代作为额外存储
异常说明
动态年龄
ParNew+Serial Old
jvm内存分区
工作内存
CMS过程
1、初始标记
以最小停顿时间为目标优点:1、并发手机停顿时间短缺点:1、并发占用部分cpu资源导致工作线程资源短缺2、碎片化空间3、无法收集浮动垃圾,导致concurrent mode failure,此时会切换成使用 Serial Old收集器来GC老年代
Y
Parallel Scavenge+Serial Old
方法区
类卸载
垃圾收集器
解析
对象头
Utf8
u1 tag;u2 length;u1(length) bytes;
类信息
与CMS区别:1、G1可单独使用不需要配合其他年轻代收集器,CMS只适用老年代2、可预测停顿时间3、回收算法不同,不产生空间碎片化
...
mac os
回收线程3
单一
ParNew
静态分派
windows
实际类已确定,需确定方法
验证
groovy编译器
网络二进制流
引用计数法(主流jvm不使用)1、对象头保存引用次数,引用次数为0,则可回收优点:1、简单缺点:1、无法区分强、弱 、虚引用2、无法解决循环引用的问题
操作数栈
3、重新标记
Object1
ParNew+CMS
针对重写场景1、调用实际类型的方法
回收线程1
4
javac等命令工具
类只能看到由其类加载器的委托加载的其他类其类加载器的委托是类的加载器及其所有父类加载器
新生代
load/write
主内存
每经过一次年轻代GC,年龄+1,当年龄等于设置值(默认15),则从survior转到到老年代
类信息(包括)静态变量常量JIT编译后的代码
准备
N
.class本地文件
java编译器
JMM是一个规范,解决多线程在访问共享变量,因 本地工作内存数据不一致(可见性)、编译器指令重排(有序性),处理器乱序执行代码(原子性)而引发的问题
动态分派
jvm类加载和运行
老年代
垃圾回收算法和垃圾收集器
其他二进制流
方法说明
2、大对象直接分配在老年代
Minor GC确保成功
MinorGC前
内存分配策略
46
常量池数量
1、将类成员变量(static修饰)设置初始值(0)
类加载器之双亲委派机制
java线程1
类方法调用执行
方法调用
jvm运行时内存分区
类执行
自定义Classloader
int
方法已确定,需确定实际类
方法返回地址
Minor GC当Eden区满或者创建对象时Eden区剩余空间不够时触发MinorGC
2、标记所有可达对象
windows jvm
GCRoots
Survior区r相同年龄(例如10)的对象所占内存空间之和大于Survior一半空间,则将年龄大于等10的对象转移到老年代
栈帧局部变量表引用
特点:1、Parallel Scavenge的老年代版本
Long
类的初始化:1、jvm会自动生成一个cinit方法,执行类成员变量(static修饰的)赋值 和 static代码片段
2
GC区域:堆和方法区
Object obj = new Object()
初始化
Eden区
其他编译器
G1过程
1、验证class文件格式2、元数据验证3、字节码验证4、符号引用验证
4、并发清除
原子性
常量池
6
大字符串或者大数组对象,所占空间大于设置值时,则直接分配到老年代,避免分配在年轻代导致Eden和Survior发生大量复制
Parallel Scavenge
年轻代
尝试新生代GC,如果失败则触发老年代GC
有效实例
CPU 3
类加载器规则
.....
类加载
linux jvm
CPU 1
可回收
class字节码
标记-清除
java线程2
线程共有
特点:1、多线程2、吞吐量优先3、自适应策略优点:1、在多CPU下,垃圾收集更快缺点:1、在单cpu,浪费线程资源,收集慢场景:1、适合Server模式且后台运算少用户交互
委托
版本
.class
分派
reference
停顿时间:gc时导致暂停工作线程,造成停顿停顿越短,用户体验越好
Object6
Full GC
Serial+CMS
特点:1、serial的老年代版本2、GC时暂停工作线程优点:1、单线程实现简单高效,适合单CPU缺点:1、暂停工作线程导致短暂停顿场景:1、适合Client模式
u1 tag;u1 index;
complier
3、长期存活对象转移到老年代
其他信息
GC区域和GC时机
栈帧2
实例数据
回收线程2
Parallel Old
Serial
1、类加载器通过类名加载class2、将class信息,静态变量、常量加载到方法区3、创建Class对象指向 class信息内存地址
jdk
类加载器的委托对于同一个类只能加载一次
老年代最大连续空间是否大于历次晋升对象平均大小
NameAndTyp
对象死亡判断
检查老年代最大连续空间>新生代所有对象空间之和?
线程私有
基础算法缺点:1、效率低速度慢2、碎片化
重载场景1、参数数量不同:可直接确定2、参数类型不同:根据静态类型确定方法,不关注实际类型3、形参是常量,jvm自动推导形参转化类型,找寻最适合的方法
5
有序性
Bootstrap Classloader
Object3
jvm内存分配
ParNew过程Parallel Scavenge/Parallel Old过程
float
吞吐量=工作线程时间/(工作线程时间+垃圾收集时间)吞吐量越大,工作分配资源越多,适合后台任务
查看jvm参数设置是否允许担保失败
7
Parallel Scavenge+ Parallel Old
连接
本地方法栈
5、空间分配担保
Object5
方法区常量引用
老年代1、存活对象多2、内存大,没有额外空间
1、将类、字段、方法等符号引用解析成对应的直接引用
加载
1、解决碎片化问题2、不会浪费空间
4、暂停工作线程,根据可回收价值排序进行垃圾回收
浮动垃圾:在并发清除阶段,工作线程产生的垃圾对象,本次GC不会收集,下一次GC收集
可达性分析法(主流jvm使用)1、通过GCRoots往下寻找能到达的对象都是有效的,除此之外都是可回收的
Minor GC
CMS
特点:1、单线程2、GC时暂停工作线程优点:1、单线程实现简单高效,适合单CPU缺点:1、暂停工作线程导致短暂停顿场景:1、适合Client模式
java内存模型(JMM)
G1+G1
1、标记GCRoots直接引用对象
栈帧3
1、在类加载的解析阶段,将静态方法、私有方法、构造方法、父类方法的符号引用转为直接引用
垃圾收集器组合
其他语言
特点:serial的多线程版本优点:在多CPU下,垃圾收集更快缺点:在单cpu,浪费线程资源,收集慢场景:适合Server模式
to
确定类方法版本,实际类+ 实际方法 将方法符号引用转为直接引用
0 条评论
下一页