JVM原理图
2020-04-08 11:51:07 0 举报
JVM原理图
作者其他创作
大纲/内容
True
筛选回收
Old区:存放年龄大的对象
线程共享
引用计数法:根据对象是否被引用作为判断依据--弊端:AB相互引用的对象,导致永远无法回收
新生代复制算法
装载(Load)
(1)通过一个类的全限定名获取定义此类的二进制字节流
本地方法栈
JVM回收不活跃的对象
方法返回地址
重新标记
对象回收
准备(Prepare)
局部变量表
类加载子系统
实例数据
老年代标记-整理算法
加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar 或 -Djava.ext.dirs指定目录下的jar包
标记-清除(Mark-Sweep)
Old区是否有足够空间
Major GC或者Full GC
非堆
虚拟机栈肯定是线程私有的,独有的,随着线程的创建而创建
常量池
CMS
CMS收集器
GC
堆 Heap
解析(Resolve)
本地方法栈Native Method Stacks
垃圾对象判断方法
垃圾收集算法
新对象申请内存空间
False
加载classpath中指定的jar包及 Djava.class.path 所指定目录下的类和jar包。
程序计数器
ParNew收集器可理解为Serial收集器的多线程版本优点:在多CPU时,比Serial效率高。缺点:收集过程暂停所有应用程序线程,单CPU时比Serial效率差。算法:复制算法适用范围:新生代应用:运行在Server模式下的虚拟机中首选的新生代收集器
虚拟机栈Java Virtual Machine Stacks
Class Pointer指向对象对应的类元数据的内存地址64位系统:8字节
应用程序线程
初始化(Initialize)
Custom ClassLoader
6.堆-内存模型
类信息
并发收集器[停顿时间优先]
虚拟机启动时创建,被所有线程共享Java对象实例以及数组都在堆上分配
1.源文件编译为字节码(class)文件
栈
栈帧
Eden是否有足够空间
使用(use)
Eden区:一般地,新创建对象被分配到Eden区,每一次GC,对象会被复制到Survivor区
G1特点:并行与并发;分代收集(仍然保留了分代的概念);空间整合(整体上属于“标记-整理”算法,不会导致空间碎片);可预测的停顿(比CMS更先进的地方在于能让使用者明确指定一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒)
结束
动态链接
包含对象的所有成员变量,大小由各个变量类型决定boolean/byte: 1short/char: 2int/float: 4long/double: 8reference: 8
Extension ClassLoader
编译器
引用计数法
Serial Old
对象能否被回收
复制(Copying)
Parallel Scavenge收集器是一个新生代收集器,它也是使用复制算法的收集器,又是并行的多线程收集器,看上去和ParNew一样,但是Parallel Scanvenge更关注 系统的吞吐量
链接(Link)
卸载(Unload)
运行用户代码时间/(运行用户代码时间+垃圾收集时间)
装载3
ParNew收集器
方法区Method Area
Eden区
s0
Minor GC或者Full GC
(3)在Java堆中生成一个代表这个类的java.lang.Class对象,作为对方法区中这些数据的访问入口
计数器记录的是正在执行的虚拟机字节码指令的地址
停顿时间
开始
java源文件
数组
验证(Verify)
并发标记
ParNew
Survivor区
Minor GC
对齐填充保证对象大小为8字节的整数倍
Serial Old收集器
Old区
当前线程执行的方法是Native类型的,这些方法就会在本地方法栈中执行
使用G1收集器时,Java堆的内存布局与就与其他收集器有很大差别,它将整个Java堆划分为多个大小相等的独立区域(Region),虽然还保留有新生代和老年代的概念,但新生代和老年代不再是物理隔离的了,它们都是一部分Region(不需要连续)的集合。
操作数帧
标记-整理(Mark-Compact)
并行收集器[吞吐量优先]
Eden区部分活跃对象复制到Survivor区
5.Java对象内存布局
运行时数据区 Run-time Data Areas
Minor GC:新生代Major GC:老年代Full GC:新生代+老年代
线程独享
可达性分析:通过GC Root的对象,向下寻找,查看某个对象是否可达。GC Root对象:类加载器、Thread、虚拟机栈的本地变量表、static成员、常量引用、本地方法栈的变量等
Parallel Old收集器是Parallel Scavenge收集器的老年代版本,使用多线程和\"标记-整理算法\"进行垃圾回收
程序计数器The PC Register
4.运行时数据区 Run-time Data Areas
对象年龄是否大于15(默认)
Parallel Old
CMS(Concurrent Mark Sweep)收集器是一种以获取 最短回收停顿时间 为目标的收集器。优点:并发收集、低停顿缺点:产生大量空间碎片、并发阶段会降低吞吐量算法:标记-清除算法
G1
class文件
s1
对象头
将Survivor区部分活跃对象复制到Old区
(2)将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构
Bootstrap ClassLoader
操作数栈:以压栈和出栈的方式存储操作数的
Young区
Serial Old线程应用线程暂停
串行收集器
方法区是线程共享的内存区域,在虚拟机启动时创建。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
Serial收集器
虚拟机栈
Mark Word一系列标记位(哈希码、分代年龄、锁状态标记等)64位系统:8字节
可达性分析
对象实例
堆
JVM进行Full GC
Serial GC线程应用线程暂停
局部变量表:方法中定义的局部变量以及方法的参数存放在这张表中局部变量表中的变量不可直接使用,如需要使用的话,必须通过相关指令将其加载至操作数栈中作为操作数使用。
G1收集器
动态链接:每个栈帧都包含一个指向运行时常量池中该栈帧所属方法的引用,持有这个引用是为了支持方法调用过程中的动态连接(Dynamic Linking)
Class 文件
常量
Serial收集器是最基本、发展历史最悠久的,单线程收集器。优点:简单高效,拥有很高的单线程收集效率缺点:收集过程需要暂停所有线程算法:复制算法适用范围:新生代应用:Client模式下的默认新生代收集器
Survivor区是否有足够空间
新对象创建
Parallel Scavenge收集器
装载1
PC计数器
Parallel Old收集器
ParNew GC线程应用线程暂停
Parallel Scavenge
Young Generation
Serial
Survivor区:分两块:S0和S1,也称From和To区。 同一时间点上,只有S0/S1其中一个有数据,另一个为空。一次GC,对象能否存活,能则年龄+1,并且复制到另一个空区,清空当前区。下一次GC重复上述过程,年龄大于15(默认值),则转到Old区
对齐填充
App ClassLoader
分代收集算法
3.双亲委派机制
加载$JAVA_HOME中 jre/lib/rt.jar 里所有的class或Xbootclassoath选项指定的jar包。由C++实现,不是ClassLoader子类
静态变量
装载2
最终标记
垃圾收集器
垃圾收集器 进行 垃圾回收终端应用执行响应的时间
并发清理
方法区
7.垃圾回收
对象年龄+1
初始标记
对象创建堆内存分配逻辑过程
堆内存--对象的生命周期
通过java.lang.ClassLoader的子类自定义加载class,属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader
main线程
Length(数组对象特有)数组长度4字节
OutOfMemoryError
Serial Old收集器是Serial收集器的老年代版本,也是一个单线程收集器,不同的是采用\"标记-整理算法\",运行过程和Serial收集器一样
Tenured Generation
吞吐量
java虚拟机栈
双亲委派机制
1.是否加载了类--自底向上的检查2.加载类--自顶向下的加载--保证只加载一次
2.JVM加载class文件的过程
0 条评论
下一页