JVM相关
2021-08-12 17:45:57 0 举报
JVM相关知识
作者其他创作
大纲/内容
方法返回地址
本地方法接口
老年代MajorGC
Car2
Thread3
类型信息
标记压缩算法: 概念:标记-压缩算法与标记-清理算法类似,只是后续步骤是让所有存活的对象移动到一端,然后直接清除掉端边界以外的内存。 优点:该算法可以有效的利用堆,避免内存碎片 缺点:压缩需要花比较多的时间成本。
-Xms :设置堆空间(新生代+老年代)初始化内存大小 默认1/64 -X 是jvm的运行参数 ms 是memory start-Xmx: 设置最大分配内存,默认 1/4-Xss:设置单个线程栈的大小-Xmn:用来设置新生代的大小-XX:+PrintGCDetails //打印GC垃圾回收-XX:+HeapDumpOnOutOfMemoryError //oom DUMP
Test()的Class类元信息
链接阶段
......
老年代Old
运行时常量池
线程私有
引用计数法: 所谓的引用计数法就是给每个对象一个引用计数器,每当有一个地方引用它时,计数器就会加1;当引用失效时,计数器的值就会减1;任何时刻计数器的值为0的对象就是不可能再被使用的。 这个引用计数法时没有被Java所使用的,但是python有使用到它。优点:1. 判断垃圾效率高2. 最大暂停时间短缺点:1. 时间开销大2. 空间开销大3. 循环引用无法回收
线程共享
编译器Interpreter
栈帧Stack Frame
标记-压缩算法
操作数栈Operand Stack
......(栈帧)
1、加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个代表这个类的java.lang.Class对象。2、链接:将Java类的二进制代码合并到JVM的运行状态之中的过程。 ①验证:确保加载的类信息符合JVM规范,没有安全方面的问题 ②准备:正式为类变量(static)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行匹配 ③解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程。3、初始化: ①执行类构造器<clinint>()方法的过程。类构造器<clinit>()方法是由编译期自动收集类中所有类变量的赋值动 作和静态代码块中的语句合并产生的。(类构造器是构造类信息的,不是构造该类对象的构造器)。 ②当初始化一个类的时候,如果发现其父类还没有进行初始化,则需要先触发其父类的初始化。 ③虚拟机会保证一个类的<clinit>()方法在多线程环境中被正确加锁和同步。
Thread1
Car3
堆 Heap Area
执行引擎
伊甸园区Eden
垃圾回收器GarbageCollection
main()栈帧
运行时数据区(Runtime Data Area)
操作数栈
类加载器子系统
Car1
survivor0from
运行时元数据
Car.class
运行时的常量池Runtime Constant Pool
test
GC四大算法
JIT代码缓存
局部变量表
动态链接
本地方法库
本地方法库Native Method Liarbries
PC Register for Thread3
本地方法接口Native Method Interface
字节码文件包含 常量池即静态常量池
本地方法栈Native Method Stack
Thread2
方法返回地址Return Address
引导类加载器(根加载器)Bootstrap classLoader
本地内存
附加信息
初始化Initialization
方法区(概念)
静态变量
堆
类加载、链接、初始化
方法区 Method Area
getClass()
准备Preparation
元空间 Metaspace
执行引擎 Execute Engine
JVM简略图
扩展类加载器ExtClassLoader
JIT编译器 JIT Compiler
栈帧
复制算法
域信息
常量池包括数量值 字符串值 类引用 字段引用 方法引用
Java虚拟机栈(Java Stacks)
Test()栈帧
Car class 模板对象
方法区Method Area
加载阶段
应用类加载器AppClassLoader
字符串常量池
.class字节码文件
元空间(实现)
PC Register for Thread2
标记清除算法:该算法分为标记和清除两个阶段。标记就是把所有活动对象都做上标记的阶段;清除就是将没有做上标记的对象进行回收的阶段。如下图所示。优点:1. 实现简单2. 易理解缺点:1.严重的碎片化2.花费的时间较多
一些附加信息
new Test()实例
局部变量表Local Variaes
实例信息id:1001name:
中间代码生成器
栈
ClassLoader
boolean、byte、char、short、int、float、reference(引用类型)、returnAddress
java文件
程序计数器 Program Counter Register
程序计数器PC
目标代码生成器
本地方法栈Native Method Stack
局部变量表:就是存储我们方法运行时的变量(8种基本数据类型、对象的引用)操作数栈:就是一个`用于运算时临时存放数据的空间`动态链接:就是在运行时将符号引用转化为直接引用,还记得吗,Class 文件中存放了大量的符号引用,这些符号引用一部分会在类加载阶段或第一次使用时转化为直接引用,这种转化称为静态解析。另一部分将在每一次运行期间转化为直接引用,这部分称为动态连接。方法返回地址:很简单一个栈桢代表一个方法,方法执行完毕需要返回调用它的地方,这个反回地址就记录了这个地址。
分析器Profiler
代码生成器
java虚拟机栈Stack
栈异常:1. OOM(OutOfMemoryError):栈大小动态扩展,并且在尝试扩展的时候无法申请到足够的内存。2. SOF(StackOverflowError):请求分配的栈容量超过栈允许的最大容量
新生代MinorGC
survivor1to
解析Resolution
动态链接Dynamic Linking
方法信息
验证Verifiction
getClassLoder()
类加载器
实例化
双亲委派:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把这个类的请求委派给父类加载器去完成,每一个层次的加载器都是如此,因此所有的加载请求最终都是应该传送到顶层的启动类加载器,也就是根加载器,只有当父类加载器反馈自己无法完成这个加载器请求(他的搜索范围没有找到所需的类)时,子类加载器才会尝试自己去加载。
复制算法: 概念:将内存分成两块同等大小内存,每次只使用一块。当一块内存用完,就将存活对象复制到另外一块上,然后再把已使用过的内存空间一次性清理。 优点:不会产生碎片 缺点:空间利用率。在对象存活率较高的时候进行复制,效率变低。如果不想浪费50%的空间,需要额外的空间进行担保,以应对100%存活的极端情况。
堆Heap
类型指针
运行时数据区
对象实例化的过程
方法区是一种概念,具体由元空间实现
字节码文件.class
PC Register for Thread1
0 条评论
下一页