JVM运行时数据区:
包括类装载子系统、执行引擎、本地方法接口、运行时数据区。
运行数据区包括:方法区、Java堆、Java虚拟机栈、PC寄存器、运行时常量池、本地方法栈。
方法区
方法区是由所有JVM线程共享的一个公用存储区。该存储区常用于存储运行时常量池、方法数据、字段数据以及方法和函数的对于字节码。JVM规范仅仅描述了方法区的一般特性,并未规定该区域的位置,也没有指明该区域的实现方式。方法区的尺寸可以固定,也可以广大或缩小。程序员能够指定方法区的初始化尺寸,并且该区域不必是连续的。
JVM在加载class文件,创建方法区,该类中的类型信息,类(静态)变量存在于此。
类型信息包括:
这个类型的全限定名
这个类型的直接超类的全限定名(java.lang.Object除外)
这个类型的类型还是接口类型
这个类型的访问修饰符(public/abstract/final等等)
任何直接超接口的全限定名的有序列表
除了上面的基本类型信息外,还保存:
该类型的常量池(包括直接常量,如string、integer、float、point常量,和对其他类型、字段和方法的符号引用)
字段信息(字段名、字段类型、字段修饰符)
方法信息(方法名、方法返回类型、参数变量和类型、方法修饰符)
除了常量以外的所有类(静态)变量
一个类ClassLoader的引用
一个类Class类的引用
所有线程共享方法区。
方法区大小不必固定、连续、可动态调整。方法区可以在堆中自由分配,另外,JVM也可以允许用程序员指定方法区的初始化大小及最大值、最小值。
方法区可以被垃圾回收。
Java堆
堆是一个自由内存区域,常用于内存的动态分配或临时分配。堆是一种运行时数据区,为类和数组对象提供内存。JVM在启动时创建,然后当Java中创建类或数组对象时,就从堆中分配所需内存,当对象或数组不再存在后,由一个称为垃圾收集的自动存储管理系统来回收堆内存。
JVM规范中未指明堆的实现方式,以便创造各种不同的JVM实现。堆的尺寸可以在固定不变的,也可以在需要增加的的时增大或在当前尺寸过大时减小。程序员可以指定堆的初始化大小,如在win32 和Solaris系统中利用-mx命令行选项竞选指定。堆内存并不一定是连续的。如果对内存用完了,并且无法为堆分配额外的内存,习哦他能够就会产生OutOfMemoryError异常。
Java程序在运行时创建所有类实例或数组放与此。没创建一个JVM实例就有一个堆,该实例的所有线程都共享这个堆。
Java对象中包含的基本数据由它所属的类及其所有超类声明的实例变量组成。只要有对象引用,虚拟机就必须快速定位对象实例的数据。另外,他也必须通过该对象引用相应的类数据(存储于方法区的类型信息)。因此在对象中通常会有一个指向方法区的指针。
一种可能的堆空间设计就是,把对分为两部分:一个句柄池,一个对象池。一个对象引用就是一个指向句柄池的本地指针。句柄池的每一个条目有两部分:一个指向实例变量的指针,一个指向方法区类型数据的指针,这个方法有利碎片整理。
另一个设计方式是使对象直接指向一组数据,而该数据包括对象实例数据以及指向方法区中的类数据指针。因此只需要一个指针就可以访问对象的实例数据。
Java虚拟机栈
每启动一个新线程,JVM为其分配一个Java栈。其使用帧为单位保存线程的运行状态。
Java栈存储每个线程中Java方法调用的转台-包括局部变量、被调用时传进来的参数、返回值、运算中间结果。
每当线程调用一个Java方法时,虚拟机都会在该线程的Java栈中压入一个新帧。而这个新帧成为当前帧。在执行这个方法时,它使用这个帧来存储参数、局部变量、中间运算结果等等数据。
Java栈不连续、可指定初始化大小和最大最小值。
在JVM运行java代码的任意时刻,JVM中只要对应当前执行方法的帧是活动的。该帧称为当前帧,所代表的方法就是当前方法,而包含该方法的类则为当前类。当线程调用一个方法时(每个线程都有其自身的栈),JVM也会创建一个新帧,使该帧成为当前帧,并压到该线程的栈中。
与堆一样,JVM规范把栈帧的实现方式留到具体的JVM实现方式中。栈的尺寸可以固定,也可以根据需要扩大或缩小。程序员能控制栈的初始化尺寸和最大、最小的尺寸。
如果计算所需要的栈超出范围,那么就会产生StackOverflowError异常。
PC寄存器
JVM中的寄存器与其它计算机系统中的寄存器类似,用于反映虚拟机当前的状态。寄存器会在字节码执行时更新。其中,煮寄存器是程序计数器(PC寄存器),用于指示JVM当前执行指令的地址。如果当前执行的是本地方法(用非Java语言编写的方法),则PC寄存器的值不定。JVM中的其他寄存器包括指定当前方法的执行环境的指针、指向当前执行方法的第一个局部变量的指针,以及指向操作数栈顶的指针。
运行时常量池
运行时常量池相当于其他编程语言中所用到的符号表。顾名思义,常量池中包含的数值文字和字段常量。每个运行时常量池的内存是从方法区中分配的,JVM为类或接口加载类文件时会构造一个运行时常量池。
本地方法栈
前面提到的所有运行时数据区都是Java虚拟机规范中明确定义的,除此之外,对于一个运行中的Java程序而言,它还能会用到一些跟本地方法相关的数据区。当某个线程调用一个本地方法时,它就进入了一个全新的并且不再受虚拟机限制的世界。本地方法可以通过本地方法接口来访问虚拟机的运行时数据区,不止于此,它还可以做任何它想做的事情。例如,可以调用寄存器,或在堆中分配内存等。
分享到:
相关推荐
**小菜鸟系列-JVM体系结构** Java虚拟机(JVM)是Java平台的核心组成部分,它为Java程序提供了跨平台的运行环境。理解JVM的体系结构对于优化代码性能、排查故障以及深入理解Java编程至关重要。在本文中,我们将探讨...
**JVM体系结构与GC调优** Java虚拟机(JVM)是Java应用程序的核心组成部分,它为Java程序提供了一个运行时环境。理解JVM的体系结构对于优化Java应用的性能至关重要,尤其是垃圾收集(Garbage Collection, GC)的...
部分章节如下,内容在附件里面大家随意下载,欢迎...3、运行时数据区 4、本地库接口 2.3、JVM内存参数调整及监控 1、JVM之内存调整 2、JVM监控工具之Jconsole 3、JVM监控工具之JProfile 加群:113035529 共同交流学习
本文将详细介绍 JVM 体系架构的组件、内存模型、运行时数据区、垃圾收集机制等关键知识点。 一、JVM 体系架构组件 JVM 体系架构主要由以下几个组件组成: 1. 方法区(Method Area):用于存储虚拟机加载的类信息...
综上所述,JVM体系结构是Java语言跨平台运行的核心。了解JVM的工作机制有助于开发出更加健壮和高效的Java程序。JVM类加载机制、内存管理、执行引擎等知识点,对于性能调优和故障排除也至关重要。通过掌握这些知识点...
包括JVM执行过程、虚拟机类加载机制、运行时数据区、GC、类加载器、内存分配与回收策略等,全套视频加资料高清无密码 第1讲 说在前面的话 免费 00:05:07 第2讲 整个部分要讲的内容说明 免费 00:06:58 第3讲...
Java体系结构包括三个主要部分:Java开发工具集(JDK)、Java运行时环境(JRE)和JVM。JDK是开发和调试Java应用程序的工具集合,包含JRE和额外的开发工具,如编译器(javac)和JVM调试工具。JRE则是运行Java应用程序...
1. **JVM架构**:JVM分为多个组件,包括类加载器、运行时数据区、执行引擎、本地方法接口(JNI)和垃圾收集器(GC)。类加载器负责加载类文件,运行时数据区存储程序运行时的各种数据,执行引擎包含解释器和Just-In-...
JVM的逻辑结构主要包括类加载系统、运行时数据区、执行引擎、本地接口等部分,这些构成了Java平台的核心。 - **类加载系统**:负责将.class文件中的二进制数据读入到内存中,进行字节码解析和动态链接,最终生成可...
类加载器负责加载类文件,运行时数据区负责存储程序运行时的数据,执行引擎负责执行 Java 字节码。 为什么要学习 JVM?学习 JVM 主要有三个原因:面试的需要、中高级程序员必备技能和追求极客的精神。面试中,面试...
JVM的运行时数据区由以下几个部分组成: 1. 方法区(Method Area):存储类信息、常量、静态变量等。 2. 堆(Heap):所有对象实例和数组的分配都在这里,是线程共享的数据区。 3. Java栈(Java Stack):每个线程...
JVM的生命周期 JVM的体系结构 JVM类加载器 JVM执行引擎 JVM运行时数据区 JVM垃圾回收 问题
### JVM 运行时数据区域、垃圾回收机制与类加载机制详解 #### 一、运行时数据区域 Java虚拟机(JVM)的核心组件之一便是其运行时数据区域,这一区域负责存储程序运行过程中产生的各种数据。为了更好地理解这部分内容...
包括JVM执行过程、虚拟机类加载机制、运行时数据区、GC、类加载器、内存分配与回收策略等,全套视频加资料高清无密码 第1讲 说在前面的话 免费 00:05:07 第2讲 整个部分要讲的内容说明 免费 00:06:58 第3讲...
JVM体系结构是指虚拟机的内部构造,包括类加载器(Class Loader)、运行时数据区(Runtime Data Areas)、执行引擎(Execution Engine)、本地接口(Native Interface)和垃圾回收器(Garbage Collector)等组成部分...
#### 二、JVM体系结构概览 JVM启动后,在操作系统层面表现为一个独立的进程,其内部架构包括以下几个关键组成部分: ##### 2.1 类装载器(ClassLoader) 类装载器负责加载Java类文件(.class文件)。这些文件包含...