(1)类装载子系统
装载 连接 初始化
(2)方法区。被所有线程共享。垃圾收集也会清理方法区中的无用类型对象。
a. 类型信息。类加载器加载类时,从类文件中提取出来。
类的完整有效名
父类的完整有效名(interface and java.lang.Object 除外,因为无父类)
类型的修饰符
类型直接接口列表
b. 常量池。存储了一个类型所使用的常量所有类型、域和方法的符号引用。
c. 域信息。jvm必须在方法区中保存类型的所有域的相关信息以及域的声明顺序,
域的相关信息包括:
域名
域类型
域修饰符(public private protected static final volatile transient…)
d.方法信息。
方法名
方法返回类型
方法参数
方法的修饰符
方法的字节码(abstract and native 除外)(被PC寄存器指向)
操作数栈和方法栈帧的局部变量区的大小
异常表
e. 类的静态变量(所有对象共享一分拷贝)
f. 类的被声明为final的类变量(所有对象共享一分拷贝)
g. 加载一个类的类加载器的引用
h. Class类的引用
i. 方法表。
j. 一个例子:
Class Lava {
private int speed = 5;
void flow();
}
Class Volcano {
public static void main(String[] args) {
Lava lava = new Lava();
lava.flow();
}
}
下面我们描述一下main()方法的第一条指令的字节码是如何被执行
的。不同的jvm实现的差别很大,这里只是其中之一。
为了运行这个程序,你以某种方式把“Volcano"传给了jvm。有了
这个名字,jvm找到了这个类文件(Volcano.class)并读入,它从
类文件提取了类型信息并放在了方法区中,通过解析存在方法区中的
字节码,jvm激活了main()方法,在执行时,jvm保持了一个指向当前
类(Volcano)常量池的指针。
注意jvm在还没有加载Lava类的时候就已经开始执行了。正像大多数的
jvm一样,不会等所有类都加载了以后才开始执行,它只会在需要的时候
才加载。
main()的第一条指令告知jvm为列在常量池第一项的类分配足够的内存。
jvm使用指向Volcano常量池的指针找到第一项,发现是一个对Lava类
的符号引用,然后它就检查方法区看lava是否已经被加载了。
这个符号引用仅仅是类lava的完整有效名”lava“。这里我们看到为了jvm
能尽快从一个名称找到一个类,一个良好的数据结构是多么重要。这里jvm
的实现者可以采用各种方法,如hash表,查找树等等。同样的算法可以用于
Class类的forName()的实现。
当jvm发现还没有加载过一个称为"Lava"的类,它就开始查找并加载类
文件"Lava.class"。它从类文件中抽取类型信息并放在了方法区中。
jvm于是以一个直接指向方法区lava类的指针替换了常量池第一项的符号
引用。以后就可以用这个指针快速的找到lava类了。而这个替换过程称为
常量池解析(constant pool resolution)。在这里我们替换的是一个
native指针。
jvm终于开始为新的lava对象分配空间了。这次,jvm仍然需要方法区中
的信息。它使用指向lava数据的指针(刚才指向volcano常量池第一项的指针)
找到一个lava对象究竟需要多少空间。
一旦jvm知道了一个Lava对象所要的空间,它就在堆上分配这个空间并把这个实例的变量speed初始化为缺省值0。假如lava的父对象也有实例变量,则也会初始化。
当把新生成的lava对象的引用压到栈中,第一条指令也结束了。下面的指令利用这个引用激活java代码把speed变量设为初始值,5。另外一条指令会用这个引用激活
Lava对象的flow()方法。
(3)堆。存放运行时所有 对象 和 数组。
(4)栈。每次启动一个新的线程,就会被分配一个栈。
(5)PC 寄存器 ( 程序计数器 )
总是指向该线程下一步要执行的指令。指令的位置放在方法区的方法字节码中。内容是相 对于第一个指令的偏移量。
(6)本地方法栈。
分享到:
相关推荐
46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT详解JVM,46页PPT...
综上所述,JVM体系结构是Java语言跨平台运行的核心。了解JVM的工作机制有助于开发出更加健壮和高效的Java程序。JVM类加载机制、内存管理、执行引擎等知识点,对于性能调优和故障排除也至关重要。通过掌握这些知识点...
JVM 可以解读指令代码并与底层进行交互,包括操作系统平台和执行指令并管理资源的硬件体系结构。 二、JVM 内存模型 JVM 内存模型主要包含线程私有的程序计数器、Java虚拟机栈、本地方法栈和线程共享的堆空间、元...
### JVM基本原理及结构详解 #### 一、Java虚拟机(JVM)的逻辑与物理结构 JVM,即Java Virtual Machine,是运行Java字节码的虚拟机环境,它的设计目的是为了提供一个独立于硬件的运行环境,使得Java程序可以在任何...
"JVM详解-淘宝内部资料"提供了一套深入理解JVM的资源,涵盖了从基础到高级的各种主题,包括Java虚拟机的生命周期、JVM的体系结构、各个组件的详细解析以及垃圾收集(Garbage Collection, GC)机制等内容。...
虚拟机(Virtual Machine, VM)是一种能够模拟特定计算机体系结构、执行特定指令集的软件环境。它可以分为两类: - **硬件级虚拟机**:例如x86架构的虚拟化技术。 - **高级语言虚拟机**:例如Java虚拟机(JVM)、.NET的...
字节码的执行则依赖于JVM执行引擎,它通过基于栈的体系结构来执行字节码指令。每个线程都会有一个程序计数器和栈来跟踪方法调用,栈中存放了栈帧,其中包含了局部变量区和操作数栈。 在Java平台中,JDK(Java ...
2019最新深入理解JVM内存结构及运行原理(JVM调优)高级核心课程视频教程下载。JVM是Java知识体系中的重要部分,对JVM底层的了解是每一位Java程序员深入Java技术领域的重要因素。本课程试图通过简单易懂的方式,系统...
#### 二、JVM的体系结构 JVM主要由以下几部分构成: 1. **类装载器(ClassLoader)**:负责加载.class文件; 2. **执行引擎**:执行字节码或调用本地方法; 3. **运行时数据区**:包括方法区、堆、栈、PC寄存器、...
### J2EE体系结构及其主要设计模式 #### J2EE体系结构 **1.1 J2EE产生前提** 随着企业应用系统的不断复杂化以及分布式应用程序的需求增加,传统的开发方式已经无法满足新的需求。例如,当应用程序需要跨越多个...
### OracleDB体系结构详解 #### 一、Oracle数据库体系结构概览 Oracle数据库以其高度可靠的性能、丰富的功能和广泛的应用场景而闻名于世。本文旨在深入解析Oracle数据库的体系结构,帮助读者理解其核心组件及运作...
### 深入理解JVM:Java虚拟机详解 #### 1、Java与JVM介绍 **JVM**,即Java Virtual Machine(Java虚拟机),是用于计算设备的一种规范,它是一个通过在实际计算机上仿真模拟各种计算机功能来实现的虚拟计算机。...
#### 一、JVM体系结构概览 Java虚拟机(JVM)作为Java程序的运行环境,其内部结构复杂且高效。为了更好地理解JVM_GC调优,我们首先来了解一下JVM的基本组成部分。 1. **类装载器子系统(Class Loader Subsystem)** -...
JVM的体系结构主要包括三个部分:类装载器子系统、运行时数据区以及执行引擎。 **2.1 类装载器子系统** 类装载器的主要功能是把.class文件加载到JVM中。JVM提供了两类类装载器:启动类装载器和用户自定义类装载器...
5. **JVM指令集体系结构**:包括JVM指令集的基本概念、指令集与不同CPU架构的关系,以及JVM指令集的组成结构。 #### JAVA文件的编译与执行过程详解 JAVA程序的执行过程主要分为三个阶段:源代码的编写、编译成字节...
- **基于栈的体系结构**:JVM是基于栈的体系结构,通过操作数栈来执行字节码指令。 - **栈帧**:代表了一个方法的一次调用,包含局部变量区和操作数栈。局部变量区用于存储局部变量和方法参数;操作数栈用于存放...
JVM的工作原理涉及多个关键概念,包括其生命周期、体系结构、类加载器、执行引擎、运行时数据区以及垃圾回收机制。让我们一一深入探讨。 **一、JVM的生命周期** JVM的生命周期从启动到关闭,主要包括加载、验证、...
Java类加载器体系结构主要包括以下几种类型的加载器: 1. **启动类加载器(Bootstrap ClassLoader)**:负责加载Java的核心类库(位于JRE/lib/rt.jar等文件中),这是系统级别加载器,无法通过Java代码直接获取。 2...
### JVM原理核心知识点详解 #### 一、Java虚拟机的生命周期 Java虚拟机的主要任务是在程序开始时启动,执行Java程序,并在程序结束时停止。一个运行中的Java虚拟机实例代表着一个正在执行的Java程序。 - **启动**...