JVM
2021-02-03 15:21:36 0 举报
AI智能生成
从不通的角度来分析来总结JVM
作者其他创作
大纲/内容
JVM
Java虚拟机
什么是Java虚拟机
JVM是JAVA虚拟机(JAVA Virtual Machine)的缩写,是一个虚构出 来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实 现的。
能运行哪些编译语言
VM可以运行任何能编译成符合JVM 字节码规范的字节码。
JAVA 和其他 JVM语言都是要经过编译成字节码之 后运行的。
一次编写,到处运行。经过多年的 发展JVM已经成为一个多元化的平台, 越来越多的语言可以运行在JVM上
JVM运行流程
JVM生命周期
1、JVM实例的诞生
2、JVM实例的运行
3、JVM实例的消亡
JVM JRE JDK三者区别
JDK
JAVA Development Kit: JAVA开发工具
JDK提供了JAVA的开发环境和运行环境(JRE),开发环境主要包含了一些开发 工具,例如常用的JAVAc编译工具、jar打包执行程序、还有一些JVM监控工具等 等
JRE
JAVA Runtime Environment: JAVA运行环境
只要拥有执行JAVA程序
JRE除了包含JVM外还包含一些基础的Java API
JRE是JDK的一部分
JAVA虚拟机:所有Java程序都必须运行在JVM上
JVM是JRE的一部分
三大流行JVM
Sun HotSpot
使用最广泛的JVM,兼容性好,开源,无论使用任何客户端或者服务端都有较好的性能,综合性能比较优秀
2010年被Oracle收购
Bea JRockit
执行效率最优秀的JVM,专注为服务器硬件和服务端应用场景高度优化的虚拟机,占内存,通常使用Bea的中间件产品WebLogic上
2008年被Oracle收购
IBM J9
与HostSpot定位比较接近,只要使用于IBM公司的各种Java产品的执行平台上,例如:IBM WebShere以及在IBM AIX和z/OS这些平台上部署的JAVA应用
JVM体系结构
类加载器
Class Loader
双亲委派模型
类加载过程
加载
加载过程负责找到二进制字节码并加载至JVM中,JVM通过类名、类所在的包名通 过ClassLoader来完成类的加载。
连接
验证
确保被导入类的正确性
准备
为类变量分配内存,并将其初始化为默认值
解析
把类中的符号引用转换为直接引用
初始化
初始化过程即为执行类中的静态初始化代码、构造器代码以及静态属性的初始化, 在四种情况下初始化过程会被触发执行:调用了new;反射调用了类中的方法;子 类调用了初始化;JVM启动过程中指定的初始化类
1、什么是垃圾回收
垃圾回收(Garbage Collection,GC):就是释放垃圾占用的空间,防止内存泄露。对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。
2、垃圾收集器在哪儿?
线程隔离数据区
程序计数器
比较小内存空间
当前线程执行字节码的行号指示器
唯一没有OOM的区域
虚拟机栈
线程私有的、生命周期和线程相同
描述Java方法执行的的内存模型
每个方法执行创建一个栈帧
存储局部变量表
操作栈
动态链接
方法出口等
方法执行和结束对应栈帧的入栈和出栈过程
本地方法栈
主要服务于本地方法也就是Native方法
线程共享数据区
堆
年轻代
Eden
Survivor
from
to
老年代
方法去/元数据区
存放加载的类信息
怎么发现它
引用计数法
每次对对象赋值时均维护引用计数起、且计数器本身也有一定的消耗
较难处理对象的循环应用
可达性分析法
JVM默认寻找垃圾算法
GC ROOT
虚拟机栈(栈帧中本地变量表)中引用的对象
方法区中类静态属性应用
方法区中常量引用的对象
本地方法栈中JNI(即一般说的Native方法)应用的对象
解决了循环引用的问题
四种引用介绍
强引用
就是在程序中普遍存在的,类似“Object a=new Object”这类的引用。只要强引用关系还存在,垃圾回收器就不会回收掉被引用的对象
软引用
用来描述一些还有用但是并非必须的对象。直到内存空间不够时(抛出 OutOfMemoryError 之前),才会被垃圾回收,通过 SoftReference 来实现
弱引用
比软引用还弱,也是用来描述非必须的对象的,当垃圾回收器开始工作时,无论内存是否足够用,弱引用的关联的对象都会被回收 WeakReference
虚引用
它是最弱的一种引用关系,它的唯一作用是用来作为一种通知。采用 PhantomRenference 实现
生存还是死亡
两次标记一次筛选
垃圾回收算法
缺点
标记清除算法
复制算法
标记整理算法
分代算法
核心思想分而治之
三色标记法
白色节点
尚未被标记的对象
黑色节点
已经被标记,且其引用关系已经被处理
灰色节点
已经被标记,但引用关系尚未被处理
垃圾回收器
概念扫盲
吞吐量
CPU 用于运行用户代码的时间与 CPU 总消耗时间的比值。
STW
全称 Stop-The-World,即在 GC 期间,只有垃圾回收器线程在工作,其他工作线程则被挂起。
安全点
从线程角度看,安全点可以理解成是在代码执行过程中的一些特殊位置,当线程执行到这些位置的时候,说明虚拟机当前的状态是安全的。
串行
是指垃圾回收线程在进行垃圾回收工作,此时用户线程处于等待状态
并行
是指用户线程和多条垃圾回收线程分别在不同 CPU 上同时工作
种类
Serial
特点
采用复制算法
单线程收集器
消耗内存小
效率比较慢
场景
单核CPU、新生代较小、对暂停时间要求不高
是Client或者window 32默认选择
ParNew
可以看作Serial的多线程版收集器
效率高
大大减少STW时间
可搭载CMS
Parallel Scavenge
多线程收集器
吞吐量优先
Serial Old
单线程
老年代工作
Parallel Old
标记整理
多线程
CMS
工作流程
初始标记
单线程工作:找出 GC Roots 直接关联的对象,标灰而已(灰色表示自身被标记,但是引用尚未处理),因此速度不慢
并发标记
在初始标记的基础上继续并发地递归,并标记可达对象
重新标记
重扫根集,就是以 GC Roots 为出发点, 完整且并行地 trace 一次,找到所有存活对象并标记之。只有在这个阶段结束之后,剩下的白色对象才能称之为 \"垃圾\"
并发清楚
影响用户线程的执行效率
会产生浮动垃圾
会产生碎片化的空间
使用标记清除算法
目标
以最小的停顿时间为目标的收集器
G1(Garbage-First)
扫描GC Roots,标记直接可达对象并压入扫描栈(marking stack),注意此阶段会与 YGC 共享 STW;
并发递归扫描 marking stack,并标记存活对象,也会扫描SATB pre-write barrier 记录的引用;
最终标记
对标 CMS 的remark阶段,但是本质不同的是,这里remark非常轻量,只需要flush SATB pre-write barrier 的 buffer
筛选回收
清点和重置标记状态,但不拷贝任何对象。重置RSet,盘点活对象,如果没有活对象,就直接回收 Region 到free list
并行与并发
分代收集
空间整合
可预测停顿
内存分配与回收策略
内存分配
old
大对象
长期存活对象
动态对象年龄>15
空间分配担保
Minor GC前、检测老年代最大可用连续空间>新生代对象总和
是
Minor GC 确保安全
否
虚拟机查看HandlePromotionFailure设置是否允许担保失败
允许
继续检查老年代最大可用的连续空间是否大于历次晋升到老年代对象的平均大小
大于
尝试进行一次Minor GC
不大于
进行一次Full GC
不允许
进行Full GC
0 条评论
回复 删除
下一页