`

jvm结构浅析

    博客分类:
  • Java
阅读更多

 

jvm全称是Java Virtual Machine(java虚拟机)。它之所以被称之为是“虚拟”的,就是因为它仅仅是由一个规范来定义的抽象计算机。我们平时经常使用的Sun HotSpot虚拟机只是其中一个具体的实现(另外还有BEA JRockit、IBM J9等等虚拟机)。在实际的计算机上通过软件来实现一个虚拟计算机。与VMWare等类似软件不同,你是看不到jvm的,它存在于内存。

当启动一个Java程序时,一个虚拟机实例也就诞生了。当该程序关闭退出,这个虚拟机实例也就随之消亡。如果在同一台计算机上同时运行三个Java程序,将得到三个Java虚拟机实例。每个Java程序都运行于它自己的Java虚拟机实例中。

Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。根据《Java虚拟机规范(第2版)》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域,如下图1所示。

 

 

 

图1 Java虚拟机的内部体系结构

下面先对图中各部分做个简单的说明:

1.class文件:虚拟机并不关心Class的来源是什么语言,只要它符合Java class文件格式就可以在Java虚拟机中运行。使用Java编译器可以把Java代码编译为存储字节码的Class文件,使用JRuby等其他语言的 编译器一样可以把程序代码编译成Class文件。

2.类装载器子系统:负责查找并装载Class 文件到内存,最终形成可以被虚拟机直接使用的Java类型。

3.方法区:在类装载器加载class文件到内存的过程中,虚拟机会提取其中的类型信息,并将这 些信息存储到方法区。方法区用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。由于所有线程都共享方法区,因此它们对方法 区数据的访问必须被设计为是线程安全的。

4.堆:存储Java程序创建的类实例。所有线程共享,因此设计程序时也要考虑到多线程访问对象(堆数据)的同步问题。

5.Java栈:Java栈是线程私有的。每当启动一个新线程时,Java虚拟机都会为它分配一 个Java栈。Java栈以帧为单位保存线程的运行状态。虚拟机只会直接对Java栈执行两种操作:以帧为单位的压栈或出栈。当线程调用java方法时, 虚拟机压入一个新的栈帧到该线程的java栈中。当方法返回时,这个栈帧被从java栈中弹出并抛弃。一个栈帧包含一个java方法的调用状态,它存储有 局部变量表、操作栈、动态链接、方法出口等信息。

6.程序计数器:一个运行中的Java程序,每当启动一个新线程时,都会为这个新线程创建一个 自己的PC(程序计数器)寄存器。程序计数器的作用可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作时就是通过改变这个计数器的值来选取 下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。如果线程正在执行的是一个Java方法,这个 计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是Natvie方法,这个计数器值则为空(Undefined)。

7.本地方法栈:本地方法栈与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。任何本地方法接口都会使用某种本地方法栈。当线程调用Java方法时,虚拟机会创建一个新的栈帧并压入Java栈。然而当它调用的是本地方法时,虚拟机会保持Java栈不变,不再在线程的Java栈中压入新的帧,虚拟机只是简单地动态链接并直接调用指定的本地方法。如果某个虚拟机实现的本地方法接口是使用C连接模型的话,那么它的本地方法栈就是C栈。

8.执行引擎: 负责执行字节码。方法的字节码是由Java虚拟机的指令序列构成的。每一条指令包含一个单字节的操作码,后面跟随0个或多个操作数。执行引擎执行字节码 时,首先取得一个操作码,如果操作码有操作数,取得它的操作数。它执行操作码和跟随的操作数规定的动作,然后再取得下一个操作码。这个执行字节码的过程在 线程完成前将一直持续。

 

 

分享到:
评论

相关推荐

    class文件结构浅析

    ### Class文件结构浅析 #### 一、引言 在深入了解Class文件的结构之前,我们需要明确Class文件在Java生态系统中的重要地位。Java程序被编译器编译后生成的`.class`文件,实际上是字节码文件,它们是Java虚拟机...

    浅析JVM内存结构和6大区域

    那JVM的内存结构到底是如何呢?JVM做为一个运行在操作系统上,但又独立于os运行的平台,它的内存至少应该包括象寄存器、堆栈等区域。  JVM在运行时将数据划分为了6个区域来存储,而不仅仅是大家熟知的Heap区域,...

    Netty实现原理浅析.pdf

    ### Netty实现原理浅析 #### 一、总体结构概览 Netty是一个高性能的Java NIO框架,由JBoss出品。它不仅提供了一套完整的客户端和服务端开发工具集,而且具备高度可定制化的特点,使得开发者能够轻松构建出可靠且...

    浅析JAVA之垃圾回收机制.doc

    建议避免过度依赖`finalize()`,而是使用try-finally结构或使用Java 7及更高版本的try-with-resources语句来确保资源的正确释放。 2、`System.gc()`和`Runtime.getRuntime().gc()`: 这两个方法是向JVM发出垃圾回收...

    [浅析J2EE应用服务器的JAVA类装载器]python回朔异常的模块.docx

    这种结构形成了一个树形层次,根装载器(Bootstrap ClassLoader)位于顶部,它负责加载JVM运行时库的核心代码。下面是扩展装载器(Extension ClassLoader),它从扩展目录加载代码,然后是系统装载器(System ...

    Java类加载原理浅析

    Java类加载原理是Java虚拟机(JVM)的重要组成部分,它负责将类的.class文件从磁盘或网络中加载到内存,并转化为运行时的数据结构,以便执行程序代码。本文将深入探讨类加载机制,包括加载、连接、初始化三个主要...

    浅析Java语言中对象的创建过程.pdf

    首先,Java的内存结构是理解对象创建的基础。JVM(Java虚拟机)为每一个运行中的Java应用程序提供了一个唯一的运行环境。JVM的内存主要被划分为三个区域:堆区、栈区和方法区。堆区(Heap)是存放通过new关键字创建...

    Java中main()方法浅析.docx

    ### Java中main()方法浅析 #### 一、概述 在Java编程语言中,`main()`方法具有特殊的意义,它是所有Java应用程序的起点。当Java虚拟机(JVM)启动并加载了一个包含`main()`方法的类时,它会自动调用这个方法来开始...

    Java中堆内存与栈内存分配浅析

    当函数执行完毕或者变量的作用域结束,Java虚拟机(JVM)会自动释放栈内存中分配的空间,使得这部分内存可以被其他变量重新使用。栈内存的管理高效,因为它采用先进后出(LIFO)的数据结构,分配和回收都非常快速。 ...

    浅析JAVA异常处理机制.pdf

    ### 浅析JAVA异常处理机制 #### 一、Java异常处理机制概述 异常处理是Java语言中的一个重要机制,它能够确保程序在遇到不可预料的情况时仍能维持稳定运行。异常处理主要包括三个方面:捕获异常、控制程序流程以及...

    浅析Java Applet技术在网络管理中的研究及应用.pdf

    Java虚拟机(JVM)负责安全检测,防止未授权的本地系统资源访问和网络资源访问量的滥用。 网络管理体系结构通常分为集中式管理模式、层次式管理模式和分布式管理模式三种类型。集中式管理模式是最普遍的管理形式,它...

    Notes:This is a learning note | Java基础,JVM,源码,大数据,面经

    Notes 我的笔记: 知识不总结,就会被大脑当垃圾清理 :horse:求知之路必然不会一帆风顺,唯有以勤为刃,以习惯为马,劈懒斩愚,跨越舒适区,方能知众人所不知,晓众人所不晓。...MySQL索引背后的数据结构

    浅析dalvik虚拟机JIT技术的实现.doc

    ### 浅析Dalvik虚拟机JIT技术的实现 #### 引言 随着移动设备的普及,Android系统作为全球最大的移动操作系统之一,其性能优化一直是开发者关注的重点。Dalvik虚拟机,作为Android早期的核心组件,引入了即时编译...

    浅析java class 文件

    这种文件格式具有特定的结构,是Java程序编译后的产物,用于在运行时由JVM加载和执行。下面将详细探讨Java Class文件的组成部分和它们的重要性。 1)Java类或接口的全面描述:一个Java源代码文件可以包含多个类或...

    基于Java的Web开发技术浅析.pdf

    Java的跨平台特性主要得益于其运行于Java虚拟机(JVM)上的机制,这一机制确保了Java代码能够在不同的操作系统上无差别地运行,从而实现了代码的“一次编写,到处运行”。Java的主要应用方向包括嵌入式系统开发、...

    浅析计算机软件JAVA编程的特点及应用.pdf

    Java源代码被编译成中间码,这种中间码再由Java虚拟机(JVM)解释执行,JVM可以根据不同平台的具体实现进行调整,从而实现平台无关性。 安全性同样是Java语言非常重视的特点,尤其是在网络环境中。Java提供了丰富的...

    浅析Java中的final关键字Java开发Java经验技

    这是一个强大的工具,用于防止不必要的继承层次结构,确保类的封装性,并且有时能提高性能,因为JVM可以对`final`类进行更优化的处理。例如: ```java public final class Singleton { // 单例实现... } ``` 这里...

    学习笔记

    4. **HashMap存储结构浅析** HashMap是Java中常用的数据结构,用于存储键值对。它基于哈希表实现,提供O(1)的平均查找时间。深入理解HashMap的内部工作,包括哈希函数、链表和红黑树的转换,对于提高代码效率有帮助...

Global site tag (gtag.js) - Google Analytics