JVM前半部分
2022-04-21 13:47:28 0 举报
AI智能生成
111111
作者其他创作
大纲/内容
类加载
类加载器
引导类加载器BootStrapClassLoader,C++
扩展类加载器ExtClassLoader,通过C++调用Java的Launcher 构建
其成员变量parent赋值为ext加载器,构成逻辑上的父子关系
引用类加载器,通过C++调用java的Launcher构建
其成员变量parent赋值为ext加载器,构成逻辑上的父子关系
自定义类加载器
加载步骤
加载:加载类,其成员/关联类也由加载该类的类加载器加载
验证:验证字节码正确性
准备:赋予对象初值、静态final修饰赋值
解析:符号引用转直接引用
初始化:执行静态代码块、执行<init>方法、成员变量赋值、构造方法
使用
卸载
双亲委派
自定义类加载器三部曲
继承ClassLoader
传入路径
重写findClass方法
打破双亲委派
只需要在loadClass方法中自己相关的类不使用parent去加载即可
双亲委派原因
沙箱机制:核心类不被修改
防重复加载类
JVM内存模型
类加载子系统
加载类
执行引擎
运行java代码
运行时数据区
本地方法栈
native方法
虚拟机栈
运行java程序,与线程比例1:1,内部包含多个栈帧
栈帧
局部变量表
实例对象index0存储的是this对象
操作数栈
动态链接
符号引用转直接引用
返回地址
代码执行后的执行地址
附加信息
轻量级锁、sync
堆
几乎所有的实例对象存储在堆,还有Class对象
老年代(默认2/3)
年轻代(默认1/3)
Eden(占8/10)
S0(1/10)
S1(1/10)
大小 -Xmx -Xms
方法区(元空间,JDK8以后与堆并列与内存中,以前在堆中)
类的原数据信息、静态变量、常量
程序计数器
线程私有,记录程序执行到哪行代码,每执行一行,执行引擎就会更新
JVM内存分配
对象创建的主要流程
1、加载类(若未加载则执行加载)
2、分配内存
分配内存方法
指针碰撞
空闲列表
解决冲突
CAS
TLAB(默认开启)
线程创建时,为线程分配一块专属空间
开关 -XX:+/-UseTLAB
大小:-XX:TLABSize
大小:-XX:TLABSize
3、赋初值
4、设置对象头
5、执行<init>方法
对象结构
对象头
mark word 8字节
类型指针(开启指针压缩4字节,否则8字节)
数组(如果有的话就是4字节+类型字节*数量)
实例数据
对齐填充
如果不满8字节,则填充
因为8字节对齐,所以最小也就是1000,最后3位空缺,那么就可以使用起来,存储时左移,使用时右移,就能突破至32G
对象分配
eden区分配(默认)
栈上分配
同时开启逃逸分析与标量替换
JVM分析出对象若不会被方法外部访问到,且栈有足够空间,优先在栈上分配
标量替换
栈无连续空间时,会将成员变量拆分后分散到栈空间上去
标量与聚合量
非基本数据类型则为聚合量
栈大小 -Xss
大对象直接进入老年代
有参数配置,且只在Serial 和 ParNew有效
-XX:PretenureSizeThreshold=1000000
(单位是字节)
-XX:+UseSerialGC
(单位是字节)
-XX:+UseSerialGC
长期存活对象进入老年代
每经过一次GC后,对象年龄+1,达到15后进入老年代
对象头中年龄只留了2字节,最大4位也就是,1111,所以最大15
对象动态年龄判断机制
S区中,当一批对象的年龄之和大于配置阈值时,年龄大于等于这一批对象的最大年龄的对象移入老年代
-XX:TargetSurvivorRatio可
老年代空间分配担保机制
在执行MinorGC之前,首先会判断老年代可用空间是否大于新生代对象(包含垃圾对象)之和
如果不大于,判断是否配置了 -XX:-HandlePromotionFailure
如果没配置,执行FullGC后执行MinorGC
如果配置了,则判断历史MinorGC存活对象的平均值,是否小于老年代可用空间
如果小于,执行MinorGC
如果大于,执行FullGC后执行MinorGC
如果大于,那么执行MinorGc
内存回收
回收算法
引用计数法
很难处理循环引用
可达性分析算法
GC Root:本地方法栈/虚拟机栈局部变量、静态变量。
finalize()方法
对象如果重写了该方法,在回收前会回调一次该方法,可重新将对象重新引用
该方法对同一对象只会回调一次
无用的类判断
类加载器被回收掉
无任何实例对象
无任何反射能调用到该Class类
常见的引用类型
强
软
若
虚
字节码
Class文件结构
(每个小项具体结构参考字节码解析笔记)
(每个小项具体结构参考字节码解析笔记)
魔术
主版本哈
次版本号
类访问权限
类名
父类名
常量池
常量池信息
接口数
接口信息
字段数
字段信息
方法数
方法信息
属性数
属性信息
0 条评论
下一页