JVM
2021-07-19 17:53:58 1 举报
登录查看完整内容
为你推荐
查看更多
jvm基础知识
作者其他创作
大纲/内容
6.属性的显性初始化、代码块中的初始化、构造器的初始化
5.设置对象头信息
Java虚拟机栈
加载
新创建的Object
可达性分析/根搜索算法
名称
串行/并行/并发
回收算法
适用场景
其他
G1
串行
复制清除&标记整理
新生代&老年代
逻辑上区分新生代和老年代,但是物理层面上不区分
ZGC
JDK11,毫秒级别的垃圾回收器
Shenandoah
JDK12,毫秒级别的垃圾回收器
检查
静态变量池
虚拟机为对象分配内存
连接阶段
为静态变量分配内存,并初始化默认值
线程私有
1.【类加载检查】
文本字符量final常量值基本数据类型值其他类和结构的全限定名字段名称和描述符方法名称和描述符
运行时常量池
C++语言编写负责加载JDK\\jre\\lib下 文件
栈帧n
执行引擎
自定义类加载CustomClassLoader
垃圾回收算法
对象创建的过程
复制算法
3.处理并发问题
2.对象分配内存空间
CodeCacheJIT编译代码产物
栈帧[Stack Frame]
本地方法栈
新生代Young
3.数组长度(只有数组对象才有)
对象引用reference类型
动态链接Dynamic Linking
本地方法接口
加载classpath下的.class文件,编译过后,会访问WEB-INF下的classes目录下
创建对象时内存的分配流程
垃圾回收器GarbageCollection
JVM 简略图
对齐填充padding
新 生 代 回 收 器
1.加载到内存中2.放在方法区里3.在堆里创建对象【该对象封装了类在方法区中的数据结构 】
引用计数法
加载阶段
new 类名()
常量池分为:运行时常量池、Class文件常量池(静态常量池)、字符串常量池】jdk1.6及以前:有永久代,三个常量池都在方法区jdk1.7: 有永久代,字符串常量池移到堆中,运行时常量池和class文件常量池还在方法区jdk1.8无永久代,字符串常量池在堆中,运行时常量池 和 class文件常量池在元空间
标记:从根对象开始遍历所有的对象,然后将所有存活的 对象标记为可达的对象。清除:清除的过程将遍历堆中所有的对象,将没有标记的 对象全部清除掉。 【标记可用,清除不可用】优点:实现简单缺点:两次遍历效率低,大量内存碎片
GC每隔一段时间来回收
类加载器子系统
字节码文件
本地方法栈Native Method Stack[为执行本地方法(Native Method)服务的]
类的信息【类的名称、方法信息、字段信息】
堆 Heap Area :存储对象实例以及数组
方法区
调用对象的init方法
GCROOT:虚拟机栈引用,本地方法栈引用,运行时常量池引用,静态引用,类信息引用
注解抽象语法树
双亲委派机制
将分配的内存初始化为零值
Object Header(对象头)
其 他
returnAddress
语义分析
实例数据Instance data
Eden(8)
词法分析
一些附加信息
线程1
【类加载检查】若未找到引用,则执行类的加载、验证、初始化
应用类加载ApplicationClassLoader
程序员自己创建POJO类并继承ClassLoader抽象类实现的类加载器,主要是重写defineClass来指定到底加载哪个区域的.class文件
1.Mark Word (标记字段)
from(1)
字节码生成器
【1】创建对象时,会先做逃逸分析,是否可以栈上分配。【2】如果无法栈上分配,需要查看对象的大小,是否为大对象,如果是,直接存放到老年代。【3】如果不是大对象,查看TLAB的空间是否可以存放下对象,如果可以,直接放到Eden区中的TLAB里。【4】如果TLAB空间不足,在Eden中开辟一片全新的空间,存储对象。【5】如果Eden空间不足,执行GC,再次尝试存放到Eden去中。【6】Eden空间依然不足,直接放到老年代。【7】如果老年代空间不足,老年代执行GC(Full GC),直接放到老年代。【8】如果老年代空间还是不足,抛出Error,OOM。
符号引用
标记清除法
①指针碰撞②空闲列表③最终常用的是“TLAB本地线程缓冲分配 ”
根据new的参数在常量池中定位--符号引用
准备Preparation
使用
中间代码生成器Intermediate Code Generator
线程共享
类的生命周期
抽象语法树
java虚拟机栈
本地方法库
标记压缩法
. java文件
本地方法接口Native Method Interface
方法返回地址Reruen Address
to(1)
4.属性的默认初始化
加载JDK提供的扩展包内容,负责JDK\\jre\\lib\\ext目录下 文件
自行运行时数据: (哈希值、GC分代年龄、锁状态标志、线程持有锁、偏向线程ID、偏向时间戳)
栈帧1
GC垃圾标记的算法
标记:同标记清除中标记一样压缩:移动所有的可达对象到堆内存的同一个区域中,使他们紧凑的排列在一起,将所有非可达对象释放出来的空闲内存都集中在一起清除。优点:解决了内存碎片的问题缺点:效率最低
程序计数器Program Counter Register当前线程所执行的字节码的行号指示器。
8大基本类型
常量池中符号引用替换为直接引用
卸载执行垃圾回收
堆分为新生代、老年代 新生代适合使用复制算法,老年代适合使用标记清除或标记压缩算法
方法区 Method Area
分析器Profiler
执行类构造器<client>{}
SerialOldGC
标记压缩
单cpu
ParNewOldGC
并行
多cpu
CMS
标记清除
多cpu且与用户线程共存
程序计数器
启动类加载BootstrapClassLoader
执行引擎 Execute Engine
本地方法库NativeMethodLiarbries
类加载器
初始化
2.Klass Pointer(类型指针)类的元数据的指针(D)
堆
分区算法
当前线程
局部变量表Local Variavles
运行时数据区(Runtime Data Areas)
JDK8后被元数据区取代
语法分析
验证Verifiction
JIT编译器 JIT Compiler
目标代码生成器Target Code Generator
根据GCROOT向下搜索,所有检索到的对象,都是可用对象,没有被检索到的对象,就是垃圾。
永久代Perm
操作数栈Operand Stack
对象何时放到老年代:1.当对象过大(通过JVM的参数设置),直接放到老年代2.当新生代的对象,经历了小于等于15次GC之后,依然没有被回收掉,升级到老年代。3. 当创建对象新生代无法存放时,直接存放到老年代。
老年代Old
直接内存它的速度比堆要快,在一些场景下显著提高性能
解析Resolution
运行时数据区
java文件
基本算法
可以与cms配合
SerialGC
复制
是
ParNewGC
ParallelScavengeGC
多cpu且关注吞吐量
否
代码生成器 Code Optimizer
老年 代 回 收 器
[保证对象是8个字节的整倍数]【目的:寻址】
文件格式、元数据、字节码和符号引用等验证
类的加载
引用计数:在对象头中分配一个空间来保存该对象被引用的次数。当前对象被引用,计算器 + 1,如果引用被舍弃,计数器 - 1,当这个对象的计数器是0时,可以标记当前对象位垃圾。
字面量
复制:将原有的内存空间分为大小 相等的两块,每次只用其中的一块,在垃圾回收时,将正在使用的对象复制到另一个 内存空间中缺点:空间利用率差
线程n
扩展类加载ExtensionClassLoader
Object
编译器Interpreter
判断对象对应的类是否加 载、连接、初始化,即加载类元信息 零值初始化(运行时元数据(哈希值,GC分代年龄,锁状态标记等)、类型指针(指向方法区的类信息))
编译器编译后的代码
分代算法
线程2
垃圾回收器对比
.class文件字节码文件
Java 编译器
0 条评论
回复 删除
下一页