jvm实现机制
JVM工作原理

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使用主内存和工作内存的概念,线程之间的共享变量存储在主内存中,每个线程有自己的工作内存,线程对共享变量的操作先在工作内存中进行,然后通过主内存来同步和通信。
java虚拟机的工作原理

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 原理解释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 用到的时候再加载,这样的好处是节省了内存的开销。
jvm运行原理

jvm运行原理JVM(Java Virtual Machine)是一种虚拟机,用于在计算机上运行Java程序。
它负责将Java字节码解释或编译成机器指令并执行。
JVM是基于栈的体系结构,它通过执行一系列的指令来模拟计算机硬件的功能。
下面将详细介绍JVM的运行原理。
1. 类加载器(Class Loader):在JVM中,类的加载是一个重要的过程。
类加载器负责将类的字节码文件加载到内存中,并生成对应的Class对象。
JVM的类加载器分为启动类加载器、扩展类加载器和应用程序类加载器等层次。
启动类加载器负责加载JVM运行时需要的核心类,而扩展类加载器和应用程序类加载器负责加载用户自定义的类。
2. 内存区域(Memory Areas):JVM将内存划分为不同的区域,包括堆(Heap)、栈(Stack)、方法区(Method Area)、程序计数器(Program Counter)和本地方法栈(Native Method Stack)等。
-堆内存用于存储对象实例,包括所有的实例变量和成员变量。
堆内存由垃圾回收器进行管理。
- 栈内存用于存储方法的调用和局部变量,每个线程都有自己独立的栈内存。
栈由Java虚拟机自动分配和释放。
-方法区用于存储类的元数据信息,包括类的结构、字段、方法和静态变量等。
方法区是所有线程共享的,由垃圾回收器进行管理。
-程序计数器用于记录当前线程的执行位置,每个线程都有一个程序计数器。
程序计数器是线程私有的,线程之间互不影响。
- 本地方法栈用于为本地方法(Native Method)提供内存空间,本地方法是由其他语言编写的代码。
3. 垃圾回收器(Garbage Collector):在JVM中,垃圾回收是自动进行的,它负责释放不再使用的内存空间,以便其他对象可以使用。
垃圾回收器通过标记-清除、复制、标记-整理等算法来回收内存。
- 标记-清除算法(Mark-Sweep)首先标记所有的存活对象,然后清除未标记的对象。
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工作原理标题:JVM工作原理引言概述:Java虚拟机(JVM)是Java程序运行的核心组件,它负责将Java 源代码编译成字节码并在特定平台上运行。
了解JVM的工作原理对于开发人员来说至关重要,因为它影响着程序的性能和稳定性。
一、类加载器(ClassLoader)1.1 类加载器的作用是将编译后的字节码文件加载到内存中。
1.2 JVM中有三种类加载器:启动类加载器、扩展类加载器和应用程序类加载器。
1.3 类加载器采用双亲委派模型,即先由父类加载器尝试加载类,如果父类加载器无法加载,则由子类加载器加载。
二、运行时数据区(Runtime Data Area)2.1 运行时数据区包括方法区、堆、栈、程序计数器和本地方法栈。
2.2 方法区存储类的结构信息、静态变量、常量等。
2.3 堆用于存储对象实例,是Java内存管理的核心区域。
三、执行引擎(Execution Engine)3.1 执行引擎负责执行字节码指令。
3.2 JVM有两种执行引擎:解释器和即时编译器。
3.3 解释器逐条解释字节码指令执行,即时编译器将热点代码编译成本地机器码执行。
四、垃圾回收器(Garbage Collector)4.1 垃圾回收器负责回收不再使用的对象,释放内存空间。
4.2 JVM中有多种垃圾回收算法,如标记-清除算法、复制算法、标记-整理算法等。
4.3 垃圾回收器的性能直接影响程序的运行效率和响应速度。
五、本地方法接口(Native Interface)5.1 本地方法接口允许Java程序调用本地方法实现与操作系统交互。
5.2 本地方法接口提供了Java和本地代码之间的桥梁。
5.3 本地方法接口的使用需要谨慎,因为调用本地方法可能导致程序的不稳定性和安全性问题。
结论:JVM作为Java程序的核心组件,其工作原理涉及类加载器、运行时数据区、执行引擎、垃圾回收器和本地方法接口等多个方面。
了解JVM的工作原理有助于开发人员编写高效、稳定的Java应用程序。
jvm 运行原理
jvm 运行原理JVM(Java Virtual Machine)是Java虚拟机的缩写,它是Java语言的核心并且是跨平台的关键所在。
JVM的运行原理涉及Java字节码的加载、解析、验证、执行以及垃圾回收等方面。
首先,JVM的运行原理首先是通过类加载器将Java字节码加载到内存中。
类加载器负责动态加载Java类文件,并将类文件转换成可以被JVM理解的数据结构。
类加载器由三个层次组成:启动类加载器、扩展类加载器和应用程序类加载器。
接着,JVM对加载的字节码进行解析和验证。
解析的过程是将类或接口的二进制数据转换成内存中的数据结构表示,并对其元数据进行验证。
验证过程是确保字节码符合JVM的安全规范,以避免恶意代码的运行。
同时,JVM还负责内存管理和垃圾回收。
JVM将内存划分为多个区域,其中包括堆、栈、方法区和本地方法栈等。
堆是对象实例和数组分配内存的地方,栈是方法执行的地方,方法区用于存储类和方法的元数据,本地方法栈用于支持本地(Native)方法的执行。
垃圾回收器(Garbage Collector)通过对不再使用的对象进行标记、清除和整理,释放内存资源。
此外,JVM还负责异常处理、线程管理和安全管理等功能。
异常处理能够捕获并处理程序运行时出现的异常情况,线程管理支持多线程程序的执行和调度,安全管理提供对Java代码的访问权限和安全控制。
总结起来,JVM的运行原理主要包括字节码的加载、解析、验证、执行和垃圾回收等方面。
JVM通过类加载器加载字节码到内存,并进行解析和验证,然后解释执行字节码或通过即时编译器编译成本地机器码来提高执行效率。
同时,JVM还负责内存管理、异常处理、线程管理和安全管理等功能。
通过这些机制,JVM实现了Java语言的跨平台性和安全性,并提供了高效执行和控制Java程序的环境。
JavaJVM运行机制及基本原理
JavaJVM运⾏机制及基本原理转⾃:https:///p/25713880JVM的基础概念JVM的中⽂名称叫Java虚拟机,它是由软件技术模拟出计算机运⾏的⼀个虚拟的计算机。
JVM也充当着⼀个翻译官的⾓⾊,我们编写出的Java程序,是不能够被操作系统所直接识别的,这时候JVM的作⽤就体现出来了,它负责把我们的程序翻译给系统“听”,告诉它我们的程序需要做什么操作。
我们都知道Java的程序需要经过编译后,产⽣.Class⽂件,JVM才能识别并运⾏它,JVM针对每个操作系统开发其对应的解释器,所以只要其操作系统有对应版本的JVM,那么这份Java编译后的代码就能够运⾏起来,这就是Java能⼀次编译,到处运⾏的原因。
JVM的⽣命周期JVM在Java程序开始执⾏的时候,它才运⾏,程序结束的时它就停⽌。
⼀个Java程序会开启⼀个JVM进程,如果⼀台机器上运⾏三个程序,那么就会有三个运⾏中的JVM进程。
JVM中的线程分为两种:守护线程和普通线程守护线程是JVM⾃⼰使⽤的线程,⽐如垃圾回收(GC)就是⼀个守护线程。
普通线程⼀般是Java程序的线程,只要JVM中有普通线程在执⾏,那么JVM就不会停⽌。
权限⾜够的话,可以调⽤exit()⽅法终⽌程序。
JVM的结构体系JVM的启动过程1、JVM的装⼊环境和配置在学习这个之前,我们需要了解⼀件事情,就是JDK和JRE的区别。
JDK是⾯向开发⼈员使⽤的SDK,它提供了Java的开发环境和运⾏环境,JDK中包含了JRE。
JRE是Java的运⾏环境,是⾯向所有Java程序的使⽤者,包括开发者。
JRE = 运⾏环境 = JVM。
如果安装了JDK,会发现电脑中有两套JRE,⼀套位于/Java/jre.../下,⼀套位于/Java/jdk.../jre下。
那么问题来了,⼀台机器上有两套以上JRE,谁来决定运⾏那⼀套呢?这个任务就落到java.exe⾝上,java.exe的任务就是找到合适的JRE来运⾏java程序。
JVM工作原理
JVM工作原理JVM(Java虚拟机)是Java程序的运行环境,它负责将Java字节码转换为机器码并执行。
了解JVM的工作原理对于Java开辟者来说非常重要,因为它涉及到Java程序的性能、内存管理和安全性等方面。
本文将详细介绍JVM的工作原理,包括类加载、内存管理、垃圾回收和即时编译等方面的内容。
一、类加载类加载是JVM将Java字节码加载到内存中并解析的过程。
当Java程序启动时,JVM会通过类加载器加载所需的类。
类加载器按照一定的顺序从不同的位置加载类文件,包括本地文件系统、网络等。
一旦类加载完成,JVM会将类的信息存储在方法区中,包括类的结构、字段、方法等。
二、内存管理JVM的内存管理主要包括堆、栈、方法区和程序计数器。
堆是Java程序运行时创建的对象所存储的区域,它是所有线程共享的。
栈是每一个线程独有的,用于存储方法调用和局部变量。
方法区用于存储类的信息,包括静态变量、常量池等。
程序计数器用于记录当前线程执行的字节码指令地址。
三、垃圾回收垃圾回收是JVM自动管理内存的过程。
当对象再也不被引用时,垃圾回收器会自动回收其所占用的内存。
JVM使用不同的垃圾回收算法来进行内存回收,包括标记-清除、复制、标记-整理等。
垃圾回收的过程会导致一定的停顿时间,因此需要合理配置垃圾回收器的参数以提高程序的性能。
四、即时编译即时编译是JVM将字节码转换为机器码的过程。
JVM使用解释器执行字节码,但解释器的执行效率较低。
为了提高程序的性能,JVM会将热点代码(被频繁执行的代码)进行即时编译,将其转换为机器码执行。
即时编译器使用不同的优化技术来提高代码的执行效率,包括方法内联、逃逸分析等。
五、性能调优了解JVM的工作原理对于性能调优非常重要。
通过调整JVM的参数,可以优化内存管理、垃圾回收和即时编译等方面的性能。
例如,可以调整堆的大小、选择合适的垃圾回收器、设置合理的垃圾回收参数等。
此外,还可以使用工具来监控JVM的运行状态,包括内存使用、垃圾回收频率等,以便及时发现和解决性能问题。
jvm回收机制原理
jvm回收机制原理JVM回收机制原理JVM(Java虚拟机)是Java语言的核心,它是一个虚拟的计算机,它可以在不同的平台上运行Java程序。
JVM的一个重要功能就是垃圾回收,也就是自动回收不再使用的内存空间。
JVM的垃圾回收机制是Java语言的一个重要特性,它可以帮助程序员避免内存泄漏和内存溢出等问题。
JVM的垃圾回收机制是基于垃圾收集器(Garbage Collector)实现的。
垃圾收集器是JVM的一部分,它负责回收不再使用的内存空间。
垃圾收集器的工作原理是扫描内存中的对象,找出不再被引用的对象,然后将它们回收。
垃圾收集器的工作是自动的,程序员不需要手动释放内存空间。
JVM的垃圾回收机制是基于可达性分析算法实现的。
可达性分析算法是指从一组根对象开始,通过对象之间的引用关系,找出所有可达的对象。
可达的对象是指在程序中仍然被引用的对象。
不可达的对象是指在程序中不再被引用的对象。
垃圾收集器的工作就是找出不可达的对象,并将它们回收。
JVM的垃圾回收机制有两种方式:标记-清除算法和复制算法。
标记-清除算法是指先标记所有可达的对象,然后清除所有不可达的对象。
这种算法的缺点是会产生内存碎片,导致内存空间的利用率降低。
复制算法是指将内存空间分为两个区域,每次只使用其中一个区域,当这个区域满了之后,将其中的可达对象复制到另一个区域中,然后清除原来的区域。
这种算法的优点是不会产生内存碎片,但是需要两倍的内存空间。
JVM的垃圾回收机制还有一个重要的概念是对象的生命周期。
对象的生命周期是指对象从创建到销毁的整个过程。
对象的生命周期可以分为四个阶段:新生代、老年代、持久代和元空间。
新生代是指刚刚创建的对象,它们的生命周期很短,大部分对象都在这个阶段被回收。
老年代是指存活时间较长的对象,它们的生命周期比较长,需要更多的内存空间。
持久代是指存放类信息和常量池等数据的区域,它们的生命周期很长,不会被回收。
元空间是指存放类信息的区域,它们的生命周期也很长,不会被回收。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. JVM相关概念
1.7 JVM的生命周期 当启动一个Java程序时,一个虚拟机实例也就产生了。 当程序关闭退出,该虚 拟机实例也就随之消亡。如果在同一台计算机上同时运行三个Java程序,则会有三 个JVM实例。每个Java程序都运行于它自己的JVM实例中。 JVM实例通过调用某个初始类的public static void main(String[] args)方法 来运行一个Java程序。 Java程序初始类中的main()方法,将作为该程序初始线程的起点,任何其他线 程都是由这个初始线程启动的。 Java虚拟机内部有两种线程:守护线程和非守护线程,守护线程通常是由虚拟 机自己使用的,比如垃圾回收线程。Java 程序中开始main()方法的初始线程,是非 守护线程,但是也可以标记为守护线程. 只要还有任何非守护线程在运行,这个Java程序就会继续运行,虚拟机依然存 活。所有非守护线程都终止时,虚拟机实例将自动退出。 若安全管理器允许,程序自身也可调用Runtime类或System类的exit()方法退出, 从而终结虚拟机实例。
执行引擎
本地方法调用
主机操作系统
2.4 JVM的内部体系结构
程序的class文件 类装载器 子系统
方法区
堆区
Java栈 运行时数据区
PC 寄存器
本地 方法栈
执行引擎
本地方法接口
本地 方法库
2.5 JVM的内部体系结构说明
运行时数据区的基本构成: JVM把运行程序所需要的字节码、方法参数、返回值、局部变量等信息组织到 一个内存区域,称为“运行时数据区”,细分为:方法区、堆区、Java栈、PC寄 存器、本地方法栈等。 每个java虚拟机实例都有一个方法区及一个堆区,由该实例中所有线程共享。 虚拟机装载class文件时,把解析的类型信息放入方法区;程序运行时,把创建 的对象放入堆区。 每个新线程被创建时,都会得到一个PC寄存器和一个Java栈。PC寄存器指示 下一条将被执行的Java指令,Java栈存储该线程中Java方法调用的状态,包括局部 变量、参数、返回值、运算的中间结果等。 本地方法栈用于存储本地方法调用的状态。
2.6 JVM的内部体系结构说明
类数据 类数据 对象 对象
类数据
类数据
对象
对象
类数据
对象
方法区
堆区
由所有线程共享的运行时数据区:方法区和堆区
2.7 JVM的方法区
在Java虚拟机中,被加载类型的信息都保存在方法区中。这些信息在内存中的 组织形式由虚拟机的实现者定义。 程序中的所有线程共享一个方法区,所以访问方法区信息的方法必须是线程安 全的。 在程序运行时,方法区的大小是可变的,程序在运行时可以扩展。有些Java虚 拟机的实现也可以通过参数也订制方法区的初始大小,最小值和最大值。 方法区也可以被垃圾收集。因为程序中的类由类加载器动态加载,所有类可能 变成没有被引用的状态。当类变成这种状态时,就可能被垃圾收集掉。没有加载的 类包括两种状态,一种是真正的没有加载,另一个种是“unreferenced”的状态。 方法区包含以下信息: 1. 类型信息(Type Information) 每一个被加载的类型,在Java虚拟机中都会在方法区中保存如下信息: 1)类型的全名 2)类型的父类型的全名 3)该类型是一个类还是接口 4)类型的修饰符(public,private,protected,static,final,volatile, transient等)
二、JVM实现机制
2.1 JVM体系结构概述
在Java虚拟机的规范中定义了一系列的子系统、内存区域、数据类型和使用指 南。这些组件构成了Java虚拟机的内部结构,他们不仅仅为Java虚拟机的实现提供 了清晰的内部结构,更是严格规定了Java虚拟机实现的外部行为。 每一个Java虚拟机都由一个类加载器子系统(class loader subsystem),负责 加载程序中的类型(类和接口),并赋予唯一的名字。 每一个Java虚拟机都有一个执行引擎(execution engine)负责执行被加载类中 包含的指令。 程序的执行需要一定的内存空间,如字节码、被加载类的其他额外信息、程序 中的对象、方法的参数、返回值、本地变量、处理的中间变量等等。Java虚拟机将 这些信息统统保存在数据区(data areas)中。虽然每个Java虚拟机的实现中都包含 数据区,但是Java虚拟机规范对数据区的规定却非常的抽象。 数据区中的一部分是整个程序共有,其他部分被单独的线程控制。每一个Java 虚拟机都包含方法区(method area)和堆(heap),他们都被整个程序共享。 Java虚拟机加载并解析一个类以后,将从类文件中解析出来的信息保存与方法区中。 程序执行时创建的 对象都保存在堆中。
JVM 实 现 机 制
宋秉华
主要内容
1. JVM相关概念 2. JVM实现机制
2.1 JVM运行环境 2.2 JVM抽象实现机制 2.3 JVM内部体系结构 2.4 JVM内部线程机制 2.5 JVM的数据类型 2.6 JVM的ClassLoader 2.7 JVM的Class文件 2.8 JVM的垃圾回收 2.9 sun的JVM内存管理
2.2 JVM的运行环境
A
Java编译器
Java虚拟机
A.class
B.class
Object.class
String.class
Java 编 程 环 境
2.3 JVM的抽象实现机制
程序的class文件 类装载器 字节码 javaAPI的class文件
2.7 JVM的方法区
2)类型字段的信息(Field information) 字段名、字段类型、字段的修饰符(public,private,protected,static, final,volatile,transient等)、字段在类中定义的顺序。 3)类型方法的信息(Method information) 方法名、方法的返回值类型(或者是void)、方法参数的个数、类型和他们的 顺序、字段的修饰符(public,private,protected,static,final,volatile, transient等)、方法在类中定义的顺序 如果不是抽象和本地本法还需要保存方法的字节码、方法的操作数堆栈的大小 和本地变量区的大小、异常列表。 4)类(静态)变量(Class Variables) 类变量被所有类的实例共享,即使不通过类的实例也可以访问。这些变量绑定 在类上(而不是类的实例上),所以他们是类的逻辑数据的一部分。在Java虚拟机 使用这个类之前就需要为类变量(non-final)分配内存。 常量(final)的处理方式于这种类变量(non-final)不一样。每一个类型在用 到一个常量的时候,都会复制一份到自己的常量池中。常量也像类变 量一样保存在 方法区中,只不过他保存在常量池中。(可能是,类变量被所有实例共享,而常量 池是每个实例独有的)。Non-final类变量保存为定义它的 类型数据(data for the type that declares them)的一部分,而final常量保存为使用它的类型数据(data for any type that uses them)的一部分。
具体内容如下: 1)类型的常量池(The constant pool for the type) 常量池中保存中所有类型是用的有序的常量集合,包含直接常量(literals) 如字符串、整数、浮点数的常量和对类型、字段、方法的符号引用。常量池 中每一 个保存的常量都有一个索引,就像数组中的字段一样。因为常量池中保存中所有类 型使用到的类型、字段、方法的字符引用,所以它也是动态连接的主要对 象。
2.7 JVM的方法区
5)所有父接口全名的列表 类型全名保存的数据结构由虚拟机实现者定义。除此之外,Java虚拟机还要 为每个类型保存如下信息: 1)类型的常量池(The constant pool for the type) 2)类型字段的信息(Field information) 3)类型方法的信息(Method information) 4)所有的静态类变量(非常量)信息(All class (static) variables declared in the type, except constants) 5)一个指向类加载器的引用(A reference to class ClassLoader) 6)一个指向Class类的引用(A reference to class Class)
java.exe是java class文件的执行程序,但实际上java.exe程序只是一个执行的 外壳,它会装载jvm.dll,这个动态连接库才是java虚拟机的实际操作处理所在。 %JAVA_HOME%/jre/bin目录下有两个目录:server与client,两个目录下分别 各有一个jvm.dll, 这就是真正的jvm.dll所在。 使用server模式可以提高性能,启动比client模式慢。当该参数不指定时,虚拟机 启动检测主机是否为服务器,如果是则以server模式启动,否则以client模式启动, J2SE5.0检测的根据是至少2个CPU和最低2GB内存。 jvm.dll无法单独工作,当jvm.dll启动后,会使用Win32 API之中的LoadLibrary() 与GetProcAddress()载入辅助用的动态链接库,而这些辅助用的动态链接库(.dll)都 必须位于jvm.dll所在目录的父目录之中。
1. JVM相关概念
1.4 什么是JRE
JRE 是Java运行环境 (Java Runtime Enviroment) 的缩写。基本上和Java虚 拟机是同一个概念,但是也有显著区别,区别如下:
1.5 JRE与JVM的关系和区别:
The JRE package is intended for distribution with applications. It does not contain the tools.jar file that has the compiler and other command line tools. The reason Sun makes the distinction is to give developers a more compact set of files to distribute with a product. Also, JVM is the more generic name which can apply to any program which obeys the Java Virtual Machine Specification - whether it's made by Sun, IBM, Microsoft, or whoever. JRE on the other hand is the name for Sun's implementation of a JVM.