首页 > 编程知识 正文

JVM内存结构,java虚拟机内存模型

时间:2023-05-05 15:40:38 阅读:166890 作者:2519

1.什么是jvm?

(1) jvm是用于计算设备的规范,是虚构的机器,通过在实际计算机上模拟各种功能来实现。

)2) jvm包含字节码指令集、寄存器集、堆栈、垃圾回收、方法域。

)3) JVM屏蔽了特定操作系统平台的相关信息,只需生成Java程序在Java虚拟机上运行的目标代码(字节码),就可以在很多平台上无需修改即可运行。

当JVM执行字节码时,实际上最终将字节码作为特定平台上的机器指令来解释并执行。

2.jdk、jre、jvm是什么关系?

(1) JRE ) javaruntimeenvironment )即Java平台。 所有java程序都在JRE环境中运行。

) JDK ) Javadevelopmentkit )是用于开发者编译、调试程序的开发包。 JDK也必须在JRE中运行JAVA程序。

)3) JVM ) Javavirtualmachine )是JRE的一部分。 这是一台虚构的计算机,通过在实际计算机上模拟各种计算机功能来实现。

JVM有其自己的完整硬件体系结构,包括处理器、栈和寄存器,以及相应的指令系统。

Java语言最重要的特征是跨平台运行。 使用JVM是为了与操作系统无关地实现跨平台。

3.JVM原理

)1) jvm是java的核心和基础,是java编译器和操作系统平台之间的虚拟处理器,可以在其上运行字节码程序。

)2) java编译器面向jvm生成jvm能够理解的字节码文件。 java源代码被翻译成字节码程序,用jvm把各指令翻译成不同的机器码

在特定平台上运行。

4. JVM执行程序的过程

加载. class文件以管理垃圾回收并分配内存

在JRE(java运行时环境) JVM中构造的java程序的执行环,也是运行java程序的环境,但他同时是一个操作系统的一个APP应用和一个进程。

因此,他有他自己的运行生命周期,也有自己的代码和数据空间。

JVM在整个jdk中位于底部,负责操作系统的交互,并屏蔽操作系统环境。

为了提供完整的Java运行环境,还介绍了虚拟机。 操作系统加载到JVM中是在jdk的Java.exe中完成的。

通过以下四个步骤完成JVM环境:

创建JVM装载环境和配置装载JVM.dll并初始化JVM.dll,将其绑定到JNI调用接口(jnienv )实例,然后调用jnienv实例以装载和处理class类。5. JVM的生命周期

JVM实例对应于独立运行的java程序,处于进程级

a )开始。 启动Java程序时,将生成一个具有公共静态void的JVM实例

main(String[] args函数的所有class都可以用作执行JVM实例的起点

b )驾驶。 main ) )是程序初始线程的起点,其他线程由该线程启动。 JVM内部有两种类型的线程:守护程序线程和非守护程序线程。 main ) )是非守护程序线程,守护程序线程通常由JVM自己使用。 java程序还可以指示自己创建的线程是守护程序线程

c )消灭。 当程序中的所有非守护程序线程终止时,JVM将终止。 如果安全管理器允许,程序还可以使用Runtime类或System.exit ()退出JVM执行引擎实例。 它对应于属于用户可执行文件的线程。 线程级别为6、JVM内存模型

)1) java代码的具体执行步骤如下图所示:

)2)运行时数据区,即jvm内存结构图如下图所示

)3)运行时数据区包含哪些数据?

a )程序计数器(PC寄存器) )

在JVM中,多线程通过在线程之间交替来获得CPU的执行时间,因此在给定时刻,一个CPU的内核只执行一个线程中的指令。

因此,在线程切换后,每个线程都需要一个独立的程序计数器,以使每个线程能够恢复切换前程序的执行位置,并避免相互干扰。

否则,会影响程序的正常执行顺序。 因此,可以说程序计数器在每个线程上都是私有的。 存储在程序计数器中的数据所占的区域的大小不会随程序的执行而变化。

因此,对于程序计数器不会发生存储器溢出现象(OutOfMemory )。

b ) java堆栈

在Java堆栈中存储一个个堆栈帧,各堆栈帧对应于被调用的方法,堆栈帧中包含局部变量表(Local Variables)操作数栈(Operand Stack)

指向当前方法所属类的运行时常量池(运行时常量池的概念将在方法区一节中介绍) http://www.Sina.com/(referencetoruntimeconstantpool )、

**方法返回地址(Return Address ) *和其他信息。 成为线程

执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。当方法执行完毕之后,便会将栈帧出栈。

c)本地方法栈

本地方法栈与Java栈的作用和原理非常相似。区别只不过是Java栈是为执行Java方法服务的,而本地方法栈则是为执行本地方法(Native Method)服务的

d)堆

Java中的堆是用来存储对象本身的以及数组(数组引用是存放在Java栈中的)。堆是被所有线程共享的,在JVM中只有一个堆。

e)方法区

与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

在Class文件中除了类的字段、方法、接口等描述信息外,还有一项信息是常量池,用来存储编译期间生成的字面量和符号引用。

在方法区中有一个非常重要的部分就是运行时常量池,它是每一个类或接口的常量池的运行时表示形式,在类和接口被加载到JVM后,

对应的运行时常量池就被创建出来。当然并非Class文件常量池中的内容才能进入运行时常量池,在运行期间也可将新的常量放入运行时常量池中,比如String的intern方法。

7、JVM内存溢出的情况

a) 程序计数器(Program Counter Register)

每条线程都有一个独立的的程序计数器,各线程间的计数器互不影响,因此该区域是线程私有的。该内存区域是唯一一个在Java虚拟机规范中没有规定任何OOM(内存溢出:OutOfMemoryError)情况的区域。

b)Java虚拟机栈(Java Virtual Machine Stacks)

在Java虚拟机规范中,对这个区域规定了两种异常情况:

1、如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常。

  2、如果虚拟机在动态扩展栈时无法申请到足够的内存空间,则抛出OutOfMemoryError异常。   这两种情况存在着一些互相重叠的地方:当栈空间无法继续分配时,到底是内存太小,还是已使用的栈空间太大,其本质上只是对同一件事情的两种描述而已。

在单线程的操作中,无论是由于栈帧太大,还是虚拟机栈空间太小,当栈空间无法分配时,虚拟机抛出的都是StackOverflowError异常,而不会得到OutOfMemoryError异常。

而在多线程环境下,则会抛出OutOfMemoryError异常。

c)堆Java Heap

Java Heap是Java虚拟机所管理的内存中最大的一块,它是所有线程共享的一块内存区域。几乎所有的对象实例和数组都在这类分配内存。Java Heap是垃圾收集器管理的主要区域,因此很多时候也被称为“GC堆”。

  根据Java虚拟机规范的规定,Java堆可以处在物理上不连续的内存空间中,只要逻辑上是连续的即可。如果在堆中没有内存可分配时,并且堆也无法扩展时,将会抛出OutOfMemoryError异常。

d)方法区域,又被称为“永久代”,当方法区无法满足内存分配需求时,将抛出OutOfMemoryError异常。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。