Java虚拟机工作原理
- 格式:doc
- 大小:654.50 KB
- 文档页数:31
jvm sandbox 原理JVM沙箱原理JVM(Java虚拟机)沙箱是一种安全机制,用于保护计算机系统免受恶意软件和不受信任的代码的威胁。
沙箱通过限制应用程序的访问权限和资源使用来确保其在一个受控的环境中运行。
本文将详细介绍JVM沙箱的原理和工作方式。
1. 什么是JVM沙箱?JVM沙箱是Java虚拟机提供的一种安全机制,它将应用程序隔离在一个受控的环境中,以防止恶意代码对系统的攻击。
JVM沙箱通过限制应用程序的权限和资源访问来保护系统的安全。
2. JVM沙箱的工作原理JVM沙箱的工作原理可以概括为以下几个步骤:2.1 类加载在JVM沙箱中,所有的类都由Java虚拟机的类加载器加载。
类加载器负责从文件系统、网络或其他来源加载Java类,并将其转换为可执行代码。
2.2 字节码验证在类加载的过程中,JVM会对字节码进行验证以确保其符合Java语言规范。
字节码验证的目的是检测潜在的安全漏洞,例如类型转换错误、数组越界访问等。
2.3 安全检查在字节码验证之后,JVM会进行安全检查,以确保应用程序的行为不会对系统造成危害。
安全检查包括对应用程序的访问权限和资源使用进行限制,例如文件系统访问、网络访问、系统调用等。
2.4 沙箱执行经过字节码验证和安全检查后,JVM会将应用程序放入一个沙箱中执行。
沙箱是一个受控的环境,它限制了应用程序对系统资源的访问。
应用程序只能在沙箱中执行,无法直接访问系统资源。
2.5 安全策略JVM沙箱还提供了安全策略机制,用于进一步限制应用程序的行为。
安全策略定义了应用程序可以执行的操作,例如文件读写、网络访问等。
通过配置安全策略,可以根据实际需求对应用程序的权限进行精细控制。
3. JVM沙箱的优势JVM沙箱具有以下几个优势:3.1 隔离性JVM沙箱将应用程序隔离在一个受控的环境中,防止其对系统造成危害。
即使应用程序存在安全漏洞,也不会对系统产生影响。
3.2 可移植性由于JVM沙箱是基于Java虚拟机实现的,因此具有很好的可移植性。
JVM工作原理JVM(Java虚拟机)是Java程序的运行环境,它负责将Java源代码编译成可执行的字节码,并提供运行时环境来执行字节码。
JVM的工作原理涉及到类加载、内存管理、垃圾回收、即时编译等多个方面。
1. 类加载JVM通过类加载器(ClassLoader)来加载Java类。
类加载器根据类的全限定名(包括包名和类名)在类路径中查找对应的字节码文件,并将其加载到内存中。
类加载器采用双亲委派模型,即先由父类加载器尝试加载类,如果父类加载器无法加载,则由子类加载器尝试加载。
这种模型保证了类的唯一性和安全性。
2. 内存管理JVM将内存分为多个区域,包括方法区、堆、栈和程序计数器。
方法区存储类的元数据信息,如字段、方法、常量池等。
堆是存放对象实例的区域,通过垃圾回收机制来管理内存的分配和释放。
栈用于存储方法的局部变量和方法调用信息。
程序计数器用于指示当前线程执行的字节码指令。
3. 垃圾回收JVM通过垃圾回收机制自动回收不再使用的对象内存。
垃圾回收器会定期扫描堆内存,标记所有还在使用的对象,然后清理掉未被标记的对象。
常见的垃圾回收算法有标记-清除、复制、标记-整理等。
JVM还提供了不同的垃圾回收器,如Serial、Parallel、CMS、G1等,可以根据应用场景选择合适的垃圾回收器。
4. 即时编译JVM使用即时编译器(Just-In-Time Compiler)将热点代码(经常被执行的代码)编译成本地机器码,以提高执行效率。
JVM会监测程序的运行情况,根据热点代码的执行频率和调用关系进行优化编译。
即时编译器可以选择不同的编译策略,如解释执行、编译执行或混合执行。
5. 内存模型JVM定义了Java程序在多线程环境下的内存模型,保证多线程的内存可见性和有序性。
内存模型规定了线程之间如何进行通信和同步。
JVM使用主内存和工作内存的概念,线程之间的共享变量存储在主内存中,每个线程有自己的工作内存,线程对共享变量的操作先在工作内存中进行,然后通过主内存来同步和通信。
JVM工作原理JVM(Java虚拟机)是Java程序运行的核心组件,它负责将Java源代码编译成可执行的字节码,并提供了一系列的运行时环境和功能。
了解JVM的工作原理对于开发高效、稳定的Java应用程序至关重要。
本文将详细介绍JVM的工作原理,包括字节码执行过程、内存管理、垃圾回收机制等。
1. 字节码执行过程:JVM通过解释器和即时编译器(JIT)两种方式执行字节码。
解释器逐条解释字节码指令并执行,而JIT则将热点代码编译成本地机器码以提高执行效率。
JVM会根据代码的热度来决定是否使用JIT编译器。
2. 内存管理:JVM将内存分为不同的区域,包括堆、栈、方法区等。
堆用于存储对象实例,栈用于存储方法调用和局部变量,方法区用于存储类信息和静态变量。
JVM会动态地分配和回收内存,以满足程序的需求。
3. 垃圾回收机制:JVM通过垃圾回收机制自动管理内存,减少程序员手动释放内存的工作量。
垃圾回收器会定期扫描内存中的对象,标记出不再使用的对象,并将其回收。
常见的垃圾回收算法包括标记-清除、复制、标记-整理等。
4. 类加载机制:JVM使用类加载器(ClassLoader)加载字节码文件并生成对应的类对象。
类加载器按照特定的顺序逐级加载类,包括启动类加载器、扩展类加载器和应用程序类加载器。
加载过程包括加载、连接和初始化三个阶段。
5. JIT编译器:JIT编译器是JVM的一个重要组成部分,它将热点代码(被频繁执行的代码)编译成本地机器码,以提高执行效率。
JIT编译器使用即时编译技术,根据程序的运行情况来动态地进行编译。
6. 异常处理:JVM提供了异常处理机制,用于捕获和处理程序运行过程中的异常情况。
当程序抛出异常时,JVM会查找合适的异常处理器来处理异常,如果找不到则终止程序的执行。
7. 多线程支持:JVM支持多线程并发执行,通过线程调度器来协调线程之间的执行顺序。
JVM为每个线程分配独立的栈空间,以保证线程之间的数据隔离。
java虚拟机的工作原理Java虚拟机(JVM)是Java程序运行的环境,它负责解释和执行Java字节码。
JVM的工作原理可以分为三个主要的部分:类加载、字节码执行和垃圾回收。
1.类加载:JVM通过类加载器将Java字节码加载到内存中。
类加载器根据类路径在文件系统或网络中查找并读取字节码文件,然后将其转化为JVM运行时数据结构,如类和方法的元数据。
加载完成后,JVM会在方法区中存储类的元数据,并在堆中分配内存来存储类的实例。
2.字节码执行:3.垃圾回收:JVM提供垃圾回收机制来自动释放不再使用的内存。
JVM会跟踪每个对象的引用,当一个对象没有引用时,即被视为垃圾。
垃圾回收器定期执行垃圾收集操作,释放垃圾对象占用的内存。
垃圾回收器有不同的实现策略,如标记-清除、引用计数、复制、标记-整理等。
除了以上三个主要的部分,JVM还包含其他组件,如堆内存、栈、方法区等。
堆内存用于存储对象实例,栈用于存储局部变量和方法调用参数,方法区用于存储类的元数据和静态数据。
JVM的工作过程如下:1. 通过类加载器加载Java字节码。
2.解释执行或JIT编译字节码。
3.根据需要进行垃圾回收和内存管理。
4.执行程序。
JVM的优点是跨平台性、自动内存管理和高性能。
通过JVM,Java程序可以在不同的硬件和操作系统上运行,无需修改源代码。
JVM的自动内存管理功能减轻了开发人员对内存管理的负担,避免了内存泄漏和越界访问等错误。
JVM的即时编译技术能够将热点代码优化为本地机器代码,提高程序的执行效率。
在实际的Java应用开发中,了解JVM的工作原理有助于编写高效的代码和解决性能问题。
开发人员可以通过调整JVM参数、选择合适的垃圾回收器和内存分配策略来优化程序的性能。
同时,了解JVM的工作原理还有助于理解虚拟机层面的问题和调优技巧,提升应用的可靠性和稳定性。
JVM 原理解释JVM 全称是 Java Virtual Machine ,Java 虚拟机,这个 JVM 你是看不到的,它存在内存中。
我们知道计算机的基本构成是:运算器、控制器、存储器、输入和输出设备,那这个 JVM 也是有这成套的元素,运算器是当然是交给硬件 CPU 还处理了,只是为了适应“一次编译,随处运行”的情况,需要做一个翻译动作,于是就用了JVM 自己的命令集,JVM 的命令集则是可以到处运行的,因为 JVM 做了翻译,根据不同的CPU ,翻译成不同的机器语言。
JVM 是一个内存中的虚拟机,那它的存储就是内存了,我们写的所有类、常量、变量、方法都在内存中。
JVM 的组成部分Class Loader 类加载器类加载器的作用是加载类文件(.class)到内存,Class Loader 加载的 class 文件是有格式要求的。
类加载的最终产品是位于运行时数据区的堆区的Class对象。
Class对象封装了类在方法区内部的数据结构。
并且向JAVA程序提供了访问类在方法区内的数据结构。
JVM加载class文件的原理机制1. Java 中的所有类,必须被装载到 JMV 中才能运行,这个装载工作是由 JVM 中的类装载器完成的,类装载器所做的工作实质是把类文件从硬盘读取到内存中。
2. Java中的类大致分为三种:a) 系统类b) 扩展类c) 由程序员自定义的类3. 类装载方式,有两种:a) 隐式装载,程序在运行过程中当碰到通过 new 等方式生成对象时,隐式调用类装载器加载对应的类到jvm中。
b) 显式装载,通过 class.forname() 等方法,显式加载需要的类。
4. 类加载的动态性体现一个应用程序总是由n多个类组成,Java 程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到 JVM 中,其它类等到 JVM 用到的时候再加载,这样的好处是节省了内存的开销。
java 原理
Java是一种面向对象的编程语言,由SUN Microsystems公司(现已
被Oracle Corporation收购)开发。
Java编程语言具有可移植性、高效性、安全性和易学性等特点,因此被广泛应用于Web应用程序、桌面应用
程序和移动应用程序等领域。
Java的工作原理如下:
1. 编写Java代码:Java代码是基于面向对象编程(OOP)的,它通
过类和对象封装数据和行为。
2. 编译Java代码:Java代码经过编译器编译成字节码文件
(.class),字节码是一种中间代码,它可以在任何平台上执行。
3. Java虚拟机(JVM):Java虚拟机是Java平台的核心组件,它是
一个运行字节码文件的虚拟计算机。
JVM负责将字节码文件转换成机器语言,并且管理内存、线程、安全和性能等方面。
4. 执行Java程序:一旦JVM加载了字节码文件,它就会在内存中生
成对象并运行程序。
在运行时,JVM会根据程序的需求来执行相应的操作。
当程序执行完毕或者发生异常的时候,JVM会终止程序的执行。
总之,Java的核心思想是“Write once, run anywhere”(一次编写,到处运行),这意味着Java程序的字节码可以在不同的平台上运行,而不需要重新编译。
这是Java成为流行编程语言之一的重要原因之一。
JVM运行机制及其原理JVM(Java Virtual Machine)是Java虚拟机的缩写,是运行Java 字节码的虚拟计算机。
它是Java平台的核心组件,负责在不同的操作系统上执行Java程序。
JVM运行机制主要包括类加载、字节码解释、即时编译、垃圾收集等过程,下面将详细介绍JVM运行机制及其原理。
1.类加载当一个Java程序被运行时,JVM会首先加载程序的主类,然后根据程序的依赖关系逐步加载相关的类。
类加载过程主要分为加载、验证、准备、解析和初始化几个阶段:-加载:通过类加载器将类文件加载到内存中。
- 验证:确保加载的类符合Java语言规范和JVM规范。
-准备:为类的静态变量分配内存并初始化为默认值。
-解析:将符号引用转换为直接引用。
-初始化:执行类的初始化方法。
2.字节码解释加载完类文件后,JVM会通过解释器将字节码文件逐条解释执行,将每条字节码翻译成对应的机器代码并执行。
这种方式简单直接,但效率较低,适用于少量代码和频繁切换的情况。
3.即时编译4.垃圾收集JVM还负责管理程序的内存,包括分配内存、回收无用内存等。
在Java中,内存是通过堆和栈来管理的,堆用于存放对象实例,栈用于存放基本数据类型和方法调用。
JVM通过垃圾收集器来管理堆内存,自动回收不再使用的对象,并将内存释放出来供其他对象使用。
5.类加载器类加载器是JVM的重要组成部分,负责加载class文件,并将其转换成JVM可以识别的数据结构。
JVM中存在多个类加载器,分为三个级别:启动类加载器、扩展类加载器和应用程序类加载器。
类加载器采用双亲委派模型,当需要加载一个类时,先委托给父类加载器加载,只有当父类加载器无法找到类时,才由自己加载。
6.内存模型JVM中的内存分为程序计数器、虚拟机栈、本地方法栈、堆、方法区等几部分。
程序计数器记录当前指令执行的位置;虚拟机栈用于存放局部变量表和操作数栈;本地方法栈用于支持本地方法调用;堆用于存放对象实例;方法区用于存放类信息、静态变量等。
jvm的工作原理
JVM(Java虚拟机)是一种运行Java字节码的虚拟机,它是Java 语言的核心组成部分。
JVM的主要工作是将Java代码编译成字节码并在运行时执行这些字节码。
JVM的工作流程如下:
1. 读取字节码:JVM读取字节码文件并将其加载到内存中。
2. 类加载:JVM将字节码文件转换为Java类,并进行类的验证、准备和解析。
3. 内存分配:JVM为Java类分配内存空间,并将其属性和方法加载到内存中。
4. 字节码执行:JVM执行Java字节码,通过解释器或即时编译器将字节码转换为机器码,并在CPU上运行。
5. 垃圾回收:JVM负责管理Java对象的内存分配和释放,使用垃圾回收算法来自动回收不再使用的对象。
JVM的工作原理是基于Java语言的跨平台特性,它将Java代码转换为字节码,使得Java程序可以在不同的操作系统和硬件上运行。
同时,JVM的垃圾回收机制可以有效地管理内存,避免了内存泄漏和越界访问等问题,提高了Java程序的稳定性和安全性。
- 1 -。
jvm 的原理JVM(Java Virtual Machine)是一种能够执行Java字节码的虚拟机。
它是Java技术的核心,负责将Java源代码编译为平台无关的字节码,并在不同的操作系统上执行这些字节码。
JVM的原理可以简单概括为以下几个方面:1. 类加载:JVM首先通过类加载器加载Java源代码编译生成的字节码文件。
类加载器将字节码文件加载到JVM中,并解析字节码文件的结构,创建对应的类模板。
2. 内存管理:JVM将内存划分为不同的区域,包括堆、栈、方法区等。
其中,堆是用于存储对象实例的区域,栈用于存储方法的调用栈,方法区则存储类的元数据信息。
JVM通过垃圾回收机制自动管理堆内存,释放不再使用的对象。
3. 即时编译:JVM在执行字节码时,会将热点代码(即频繁执行的代码)通过即时编译器(Just-In-Time Compiler)编译为本地机器码,以提高执行效率。
即时编译器会根据运行时的情况进行优化,如方法内联、循环展开等。
4. 解释执行:对于非热点代码,JVM会使用解释器将字节码逐条解释执行。
解释器将字节码转换为机器码并执行,但执行效率相对较低。
5. 安全机制:JVM提供了安全管理器(Security Manager)来保护系统安全。
安全管理器可以控制JVM对外部资源的访问权限,防止恶意代码对系统造成破坏。
6. 异常处理:JVM提供了异常处理机制来处理程序中的异常情况。
当程序发生异常时,JVM会根据异常处理器(Exception Handler)的配置,选择相应的处理方式,如打印异常信息、捕获并处理异常等。
7. 多线程支持:JVM支持多线程并发执行。
它通过线程调度器(Thread Scheduler)来调度各个线程的执行顺序,实现多线程的并发执行。
8. 跨平台性:由于JVM将字节码作为中间语言,可以在不同的操作系统上执行Java程序。
这使得Java具有较好的跨平台性,只需在不同平台上安装对应的JVM即可。
jvm的名词解释Java虚拟机(Java Virtual Machine,JVM)是一种可以执行Java字节码的虚拟计算机。
它是Java平台的核心组件之一,也是Java语言能够跨平台运行的关键所在。
通过将Java源代码编译为字节码,JVM可以在不同的操作系统上运行Java应用程序,使得Java成为一种具有广泛适用性和可移植性的编程语言。
1. JVM的运行机制JVM的主要功能是解释和执行Java字节码。
当我们编写Java程序时,首先将源代码编译为字节码文件(.class文件),然后由JVM加载并解释执行这些字节码。
JVM内部包括类加载器、执行引擎、运行时数据区等组件。
类加载器负责将字节码加载到内存中,并进行验证、准备和解析。
执行引擎负责解释字节码,并将其转化为可以被底层操作系统执行的机器码。
运行时数据区包括方法区、堆、栈等,在程序执行过程中用于存储运行时数据。
2. JVM的类加载机制JVM使用类加载器(ClassLoader)来加载字节码文件。
类加载器将字节码文件从磁盘读入内存,并进行验证、准备和解析。
类加载器采用了双亲委派模型,从上到下依次加载类,在加载之前会先检查是否已经加载该类,如果已加载则直接返回,否则交由上层类加载器加载。
类加载机制具有以下优势:- 避免重复加载:通过双亲委派模型,避免重复加载同一个类,提高了程序的执行效率。
- 安全性:通过检查机制,防止恶意类替换系统原有的核心类库。
- 可扩展性:可以通过自定义类加载器,实现动态加载更多的类或模块,实现插件化等功能。
3. JVM的内存管理JVM使用自动内存管理机制,主要包括堆、栈、方法区、直接内存等。
堆是JVM管理的最大一块内存,用于存储对象实例和数组等动态分配的数据。
堆内存被所有线程共享,通过垃圾回收(Garbage Collection)来回收不再使用的对象,释放内存空间。
栈是JVM为每个线程分配的一块独立内存,用于存储线程私有的方法调用、局部变量和操作数栈等。
As the Java Virtual Machine is a stack-based machine, almost all of its instructions involve the operand stack in some way. Most instructions push values, pop values, or both as they perform their functions.Java虚拟机是基于栈的(stack-based machine)。
几乎所有的java虚拟机的指令,都与操作数栈(operand stack)有关.绝大多数指令都会在执行自己功能的时候进行入栈、出栈操作。
1Java体系结构介绍Javaís architecture arises out of four distinct but interrelated technologies, each of which is defined by a separate specification from Sun Microsystems:1.1 Java体系结构包括哪几部分?Java体系结构包括4个独立但相关的技术the Java programming language →程序设计语言the Java class file format →字节码文件格式the Java Application Programming Interface→应用编程接口the Java Virtual Machine →虚拟机1.2 什么是JVMjava虚拟机和java API组成了java运行时。
1.3 JVM的主要任务。
Java虚拟机的主要任务是装载class文件并执行其中的字节码。
Java虚拟机包含了一个类装载器。
类装载器的体系结构二种类装载器启动类装载器用户定义的类装载器启动类装载器是JVM实现的一部分当被装载的类引用另外一个类时,JVM就是使用装载第一个类的类装载器装载被引用的类。
1.4 为什么java容易被反编译?●因为java程序是动态连接的。
从一个类到另一个类的引用是符号化的。
在静态连接的可执行程序中。
类之间的引用只是直接的指针或者偏移量。
相反在java的class文件中,指向另一个类的引用通过字符串清楚的标明了所指向的这个类的名字。
●如果引用是指向一个字段的话。
这个字段的名字和描述符(字段的类型)会被详细说明。
●如果引用指向一个成员方法,那么这个成员方法的名字和描述符(方法的返回值类型,方法参数的数量和类型)会被详细说明。
●包含对自己字段和成员方法的符号引用。
●包含可选的调试信息。
(包括局部变量的名称和类型)1.5 垃圾回收器缺点:无法确认什么时候开始回收垃圾,无法确认是否已经开始收集,也无法确认要持续多长时间2平台无关3安全4网络移动性5Java虚拟机●每个JVM都有一个类装载子系统。
●运行时数据区:方法区,堆,java栈,pc寄存器,本地方法栈●每个JVM实例都有一个方法区和堆。
他们是由该虚拟机中所有线程共享的。
●每个线程都会得到自己的pc寄存器和java栈,⏹pc寄存器的值指示下一条将被执行的指令。
⏹java栈记录存储该线程中java方法调用的状态。
(包括局部变量,参数,返回值,运算的中间结果。
)⏹这些内存区域是私有的。
任何线程都不能访问另一个线程的pc寄存器和java栈●java栈由许多栈帧组成。
一个栈帧包含一个java方法的调用的状态。
⏹当线程调用一个方法的时候,虚拟机压入一个新的栈桢到该线程的java栈中。
⏹当方法返回时,这个栈桢被从java栈中弹出并抛弃。
●引用有3中,类类型,接口类型,数组类型。
●JVM中,最基本的数据单元是字。
至少选择32位作为字长。
●JVM有两种类装载器:⏹启动类装载器(JVM实现的一部分,每个JVM都必须有一个)⏹用户自定义的类装载器(JA V A程序的一部分,必须继承ng.CloassLoader)。
●由不同的类装载器装载的类被放在虚拟机内部的不同的命名空间中。
●方法区:⏹大小不固定,根据需要动态调整⏹方法区可以被垃圾回收⏹包含◆提取装载的类的信息,放到方法区●JVM总能通过存储于方法区的内存信息来确定一个对象需要多少内存◆类的静态变量也放到方法区。
⏹虚拟机为装载的每个类存储如下信息:◆这个类型的全限定名◆这个类型的直接超类的全限定名◆这个类型是类类型还是接口类型◆这个类的访问权限修饰符◆任何直接超接口的全限定名的有序列表◆该类型的常量池●该类型所用常量的一个有序集合,包括直接常量(String,Integer,floatingpoint),和对其他类型,字段,方法的符号引用◆字段信息●字段名●字段类型●字段的修饰符●声明的顺序◆方法信息●方法名●方法的返回值类型●方法的参数和类型,顺序●方法的修饰符●方法的操作码●操作数栈和该方法的栈帧中局部变量区的大小●异常表◆除了常量以外的所有类(静态)变量◆一个到类CloassLoader的引用◆一个到Class类的引用◆方法表●虚拟机为每一个装载的非抽象类都生成一个方法表●堆◆◆一个java程序独占一个JVM,一个JVM中只存在一个堆。
所以,每个java程序有它自己的堆,但同一个java程序的多个线程共享一个堆◆运行时创建的所有类实例◆数组对象●垃圾回收器◆回收内存◆移动对象以减少碎片◆不必是连续的内存,可以动态的扩展和收缩◆一个JVM的实现的方法区可以在堆顶实现●栈帧frame◆栈帧由3部分组成:局部变量区,操作数栈,帧数据区。
◆局部变量区,操作数栈的大小在编译的时候就确定了。
◆局部变量区(variable Table)●以字长为单位,从0开始计数的数组。
●int,float,reference,return address只占据一个字长●byte,short,char存入数组前转换成int,占据一个字长●long,double占据2个字长。
●包含对应方法的参数和局部变量,●方法的局部变量任意决定顺序,甚至一个索引指代两个变量,(当2个变量的作用域不重复时)◆操作数栈●以字长为单位的数组,但不是通过索引来访问,而是通过标准的栈操作●存贮数据的方式和局部变量区一样(就数据长度而言)。
●帧数据区●帧数据区保存常量池解析,正常方法返回,异常派发机制等信息●执行引擎●线程:●JVM只规定了最高级别的线程会得到大多数的CPU时间,●较低优先级别的线程,只有在所有比它优先级更高的线程全部阻塞的情况下才能保证得到CPU时间。
●级别低的线程在级别高的线程没有被阻塞的时候,也可能得到CPU时间,但是这没有任何保证。
●每个虚拟机都有一个主存,用于保存所有的程序变量(对象的实例变量,数组的元素,以及类变量)。
每一个线程都有一个工作内存,线程用它保存所使用和赋值的“工作拷贝”。
●局部变量和参数,因为他们是每个线程私有的,可以逻辑上看成是工作内存或者主存的一部分。
6字节码文件8位字节的二进制流常量池标志每一个标志都有一个相对应的表。
表名通过在标志后面加上"_info"后缀来产生7类型的声明周期●装载⏹通过该类型的完全限定名,产生一个该类型的二进制数据流⏹解析这个二进制数据流为方法区内的内部数据结构⏹(并在堆上)创建一个表示该类型的ng.Class类的实例●连接(已读入的二进制形式的类型数据合并到虚拟机的运行时状态中去)⏹验证(保证java类型数据格式正确并适合JVM使用)⏹准备(分配内存,默认初始化在此时发生)⏹解析(把常量池中的符号引用(类,接口,字段,方法)转换为直接引用,虚拟机的实现可以推迟解析这一步,它可以在当运行中的程序真正使用某个符号引用是再去解析它)●初始化(将类变量赋予适当的初始值(显式初始化),所有JVM的实现必须在每个类或接口首次主动使用是被初始化)对象的生命周期●类实例化有四种途径:⏹new⏹调用Class或者ng.reflect.Constructor的newInstance ( )⏹clone ( )⏹java.io.ObjectInputStream的getObject ( )8连接模型●动态连接和解析●常量池:⏹class文件把它所有的引用符号保存在一个地方,常量池⏹每个文件有一个常量池⏹每一个被JVM装载的类或者接口都有一份内部版本的常量池,被称作运行时常量池⏹运行时常量池映射到class文件的常量池⏹JVM为每一个装载的类和接口保存一份独立的常量池。
⏹来自相同方法或不同方法中的几条指令,可能指向同一个常量池入口。
⏹每个常量池入口只被解析一次。
●解析⏹在程序运行的某些时刻,如果某个特定的符号引用将要被使用,它首先要被解析。
⏹解析过程就是根据符号引用查找到实体,在把符号引用替换成直接引用的过程。
⏹所有的符号引用都保持在常量池,所以这个过程也被称作常量池解析。
⏹解析分为早解析和迟解析。
9垃圾收集10栈和局部变量操作Stack and Local Variable Operations10.1 常量入栈操作Pushing Constants Onto the Stack10.1.1将一个字长的常量压入栈10.1.2将两个字长的常量压入栈long and double values occupy 64 bits. Each time a long or double is pushed onto the stack, its value occupies two slots on the stack.long和double类型的值是64位长度的值,每当一个long或者double类型的值被压入栈,将占据2个位置10.1.3将空的对象引用(null)压入栈One other opcode pushes an implicit constant value onto the stack. The aconst_null opcode, pushes a null object reference onto the stack.Opcode Operand(s) Descriptionaconst_null (none) pushes a null object reference onto the stack10.1.4将byte和short类型常量压入栈10.1.5将常量池入口压入栈Pushing constant pool entries onto the stackOpcode Operand(s) Descriptionldc indexbyte1 pushes single-word value from constant pool entryspecified by indexbyte1 onto the stackldc_w indexbyte1,indexbyte2 pushes single-word value from constant pool entry specified by indexbyte1, indexbyte2 onto the stackldc2_w indexbyte1,indexbyte2 pushes dual-word value from constant pool entry specified by indexbyte1, indexbyte2 onto the stack10.2 通用栈操作Generic Stack Operations10.2.1栈操作Stack manipulationOpcode Operand(s) Descriptionnop (none) do nothingpop (none) pop the top word from the operand stackpop2 (none) pop the top two words from the operand stackswap (none) swap the top operand stack two wordsdup (none) duplicate top operand stack worddup2 (none) duplicate top two operand stack wordsdup_x1 (none) duplicate top operand stack word and put two downdup_x2 (none) duplicate top operand stack word and put three downdup2_x1 (none) duplicate top two operand stack words and put three down dup2_x2 (none) duplicate top two operand stack words and put four down10.3 把局部变量压入栈Pushing Local Variables Onto the Stack10.3.1将1个字长的局部变量压入栈Pushing single-word local variables onto the stackOpcode Operand(s) Descriptioniload vindex pushes int from local variable position vindexiload_0 (none) pushes int from local variable position zeroiload_1 (none) pushes int from local variable position oneiload_2 (none) pushes int from local variable position twoiload_3 (none) pushes int from local variable position threefload vindex pushes float from local variable position vindexfload_0 (none) pushes float from local variable position zerofload_1 (none) pushes float from local variable position onefload_2 (none) pushes float from local variable position twofload_3 (none) pushes float from local variable position three10.3.2将2个字长的局部变量压入栈Pushing dual-word local variables onto the stackOpcode Operand(s) Descriptionlload vindex pushes long from local variable positions vindex and (vindex+ 1)lload_0 (none) pushes long from local variable positions zero and onelload_1 (none) pushes long from local variable positions one and twolload_2 (none) pushes long from local variable positions two and threelload_3 (none) pushes long from local variable positions three and four dload vindex pushes double from local variable positions vindex and(vindex + 1)dload_0 (none) pushes double from local variable positions zero and one dload_1 (none) pushes double from local variable positions one and two dload_2 (none) pushes double from local variable positions two and three dload_3 (none) pushes double from local variable positions three and four10.3.3将对象引用局部变量压入栈Table 10-9. Pushing object reference local variables onto the stackOpcode Operand(s) Descriptionaload vindex pushes object reference from local variable position vindex aload_0 (none) pushes object reference from local variable position zero aload_1 (none) pushes object reference from local variable position one aload_2 (none) pushes object reference from local variable position two aload_3 (none) pushes object reference from local variable position three10.4 弹出栈顶部元素,将其赋给局部变量Popping to Local Variables10.4.1弹出一个字长的值,将其赋给局部变量Popping single-word values into local variablesOpcode Operand(s) Descriptionistore vindex pops int to local variable position vindexistore_0 (none) pops int to local variable position zeroistore_1 (none) pops int to local variable position oneistore_2 (none) pops int to local variable position twoistore_3 (none) pops int to local variable position threefstore vindex pops float to local variable position vindexfstore_0 (none) pops float to local variable position zerofstore_1 (none) pops float to local variable position onefstore_2 (none) pops float to local variable position twofstore_3 (none) pops float to local variable position three10.4.2弹出2个字长的值,将其赋给局部变量Popping dual-word values into local variablesOpcode Operand(s) Descriptionlstore vindex pops long to local variable positions vindex and (vindex + 1) lstore_0 (none) pops long to local variable positions zero and onelstore_1 (none) pops long to local variable positions one and twolstore_2 (none) pops long to local variable positions two and threelstore_3 (none) pops long to local variable positions three and fourdstore vindex pops double to local variable positions vindex and (vindex +1)dstore_0 (none) pops double to local variable positions zero and onedstore_1 (none) pops double to local variable positions one and twodstore_2 (none) pops double to local variable positions two and threedstore_3 (none) pops double to local variable positions three and four10.4.3弹出对象引用,将其赋给局部变量Popping object references into local variablesOpcode Operand(s) Descriptionastore vindex pops object reference to local variable position vindexastore_0 (none) pops object reference to local variable position zeroastore_1 (none) pops object reference to local variable position oneastore_2 (none) pops object reference to local variable position twoastore_3 (none) pops object reference to local variable position three10.5 wide指令The wide Instruction10.5.1弹出对象引用,将其赋给局部变量Popping object references into local variables无符号8位局部变量索引,把方法中的局部变量限制在256以下。