Java虚拟机运行时数据区
2020-12-02 09:50:43 0 举报
jvm运行时数据区
作者其他创作
大纲/内容
局部变量表
Eden
程序计数器Program Counter Register
ApplicaionClassLoader
方法区method area
Verify验证
操作数栈
栈帧
堆空间结构分为:年轻代,老年代,元空间三部分,元空间在jdk7以及之前被称为持久代,jdk8以及之后被改为元空间,它逻辑上属于堆空间,但实际上并不在堆中的进行空间分配,而是直接存在于内存中 年轻代与老年代:在堆内存系统中默认的分配比例是1:2的,但是因为年轻代采用的垃圾收集算法是标记复制的方式,在年轻代中将空间分为了一块较大的伊甸园区和两块相同的幸存区(幸存者0区和幸存者1区),其比例是8:1:1,其中有一块幸存者区是作为临时区来存放垃圾收集后存活的对象的,所以在使用中总有一块幸存者区是处于空状态的,因此年轻代和老年代在内存应用中实际的比例要小于1:2的 在年轻代中,伊甸园区与幸存者区的比例是8:1:1,但因为系统的空间分配又存在着一定的自适应的情况,所以实际的应用中可能会存在一定的偏差,可以通过设置参数-XX:SurvivorRatio=8来设置 几乎所有的对象都是在堆中创建的,根据对象的存活状态在堆中进行存储,新创建的对象根据“朝生夕死”的推理,有90%左右的对象会在年轻代中进行回收,在垃圾回收中存活的对象将会被放入其中的一个幸存区,然后经过一定的回收次数后,幸存区中仍然存活的对象将会被放入老年代中
元空间
对于Java应用程序来说,Java堆(Java Heap)是虚拟机所管理的内存中最大的一块。Java堆是被所 有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一目的就是存放对象实例,Java 世界里“几乎”所有的对象实例都在这里分配内存。 Java堆是垃圾收集器管理的内存区域,也被称作“GC堆”。从回收内存的角度看,由于现代垃圾收集器大部分都是基于分代收集理论设计的,所以Java堆中经常会出现“新生代”“老年代”“永久代”“Eden空间”“From Survivor空间”“To Survivor空间”等名词。在JDK8之后永久代彻底被元空间所替代。
Loading
本地方法栈(Native Method Stacks)与虚拟机栈所发挥的作用是非常相似的,其区别只是虚拟机 栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的本地(Native) 方法服务。
动态链接
栈结构
执行引擎(解释器,JIT编译器,GC垃圾回收器)
Linking
年轻代
Class Files
一些其他附加信息
局部变量表:存放方法执行中的基本的java数据类型的变量以及引用类型的引用地址动态链接:保存指向运行时常量池的方法引用操作数栈:保存方法执行时产生的临时数据以及方法的返回结果值
运行时数据区
栈帧结构
Resolve解析
方法返回地址
s0
当前栈帧,当前方法
程序计数器(Program Counter Register)是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器。在Java虚拟机的概念模型里,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令,它是程序控制流的指示器,分支、循环、跳转、异常处 理、线程恢复等基础功能都需要依赖这个计数器来完成。
BootStrapClassLoader
Prepare准备
方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。虽然《Java虚拟机规范》中把方法区描述为堆的一个逻辑部分,但是它却有一个别名叫作“非堆”(Non-Heap),目的是与Java堆区 分开来。 运行时常量池(Runtime Constant Pool)是方法区的一部分。Class文件中除了有类的版本、字 段、方法、接口等描述信息外,还有一项信息是常量池表(Constant Pool Table),用于存放编译期生 成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
自己编写一个jvm,主要要实现的部分是:类加载器子系统,执行引擎
s1
Initialization
Java虚拟机栈(Java Virtual Machine Stack)是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用直至执行完毕的过程,就对应着一个栈帧在虚拟机栈中从入栈到出栈的过程。 局部变量表存放了编译期可知的各种Java虚拟机基本数据类型(boolean、byte、char、short、int、 float、long、double)、对象引用(reference类型,它并不等同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或者其他与此对象相关的位置)和returnAddress 类型(指向了一条字节码指令的地址)。
堆Heap
虚拟机栈VM Stack
元空间逻辑上存在于堆中,但实际中并不在堆中进行分配
本地方法接口
本地方法栈Native Method Stack
本地方法库
堆结构
老年代
ExtensionClassLoader
Class Loader SubSystem
0 条评论
下一页