JVM的主要结构如下图所示,图片引用自舒の随想日记。
方法区和堆由所有线程共享,其他区域都是线程私有的
程序计数器(Program Counter Register)
类似于PC寄存器,是一块较小的内存区域,通过程序计数器中的值寻找要执行的指令的字节码,由于多线程间切换时要恢复每一个线程的当前执行位置,所 以每个线程都有自己的程序计算器。这一个区域不会有OutOfMemeryError。当执行Java方法时,这里存储的执行的指令的地址,如果执行的是 本地方法,这里的值是Undefined。
虚拟机栈(Java Stack)
虚拟机栈也是线程私有的,每创建一个线程,虚拟机就会为这个线程创建一个虚拟机栈,虚拟机栈表示Java方法执行的内存模型,每调用一个方法,就会 生成一个栈帧(Stack Frame)用于存储方法的本地变量表、操作栈、方法出口等信息,当这个方法执行完后,就会弹出相应的栈帧。
如果请求的栈的深度过大,虚拟机可能会抛出StackOverflowError异常,如果虚拟机的实现中允许虚拟机栈动态扩展,当内存不足以扩展栈的时候,会抛出OutOfMemoryError异常。
栈帧(Stack Frame)
栈帧分为三部分:局部变量区(Local Variables)、操作数栈(Operand Stack)和帧数据区(Frame Data)。
局部变量区(Loca Variables)
局部变量区被组织一个一个从0开始的字数组,byte、short、char在存储前被转换为int,boolean也被转换为int,0表示false,非0表示true,long和double占据两个字长。
操作数栈(Operand Stack)
操作数栈也被组织为一个字数组,但不同于局部变量区,它不是通过数组下标访问的,而是能过栈的Push和Pop操作,前一个操作Push进的数据可以被下一个操作Pop出来使用。
帧数据区(Frame Data)
这部分的作用主要有三部分:
- 常量池中数据的解析
- 方法执行完后处理方法返回,恢复调用方现场
- 方法执行过程中抛出异常时的异常处理,存储有一个异常表,当出现异常时虚拟机查找相应的异常表看是否有对应的Catch语句,如果没有就抛出异常终止这个方法调用
本地方法栈(Native Method Stack)
与虚拟机栈类似,只是是执行本地方法时使用的。
方法区(Method Area)
用于存储已被虚拟机加载的类型信息、常量、静态变量、即时编译后的代码等信息。
方法区是线程间共享的,当两个线程同时需要加载一个类型时,只有一个类会请求ClassLoader加载,另一个线程会等待。
对于每一个加载的类型,会在方法区中保存以下信息:
- 类及其父类的全限定名(java.lang.Object没有父类)
- 类的类型(Class or Interface)
- 访问修饰符(public, abstract, final)
- 实现的接口的全限定名的列表
- 常量池
- 字段信息
- 方法信息
- 除常量外的静态变量
- ClassLoader引用
- Class引用
对于每一个字段,会在方法区中保存以下信息(字段声明顺序也会保存):
- 字段名
- 字段的类型
- 字段的修饰符(public, private , protected, static, final, volatile, transient)
对于每一个方法,会在方法区中保存以下信息(方法声明顺序也会保存):
- 方法名
- 方法返回类型(或void)
- 参数信息
- 方法修饰符(public, private, protected , static, final, synchronized, native, abstract)
如果方法不是抽象方法并不是本地方法(Native Method),还会保存以下信息:
- 方法的字节码
- 本地变量表及操作数栈的大小
- 异常表
虚拟机需要存储一些数据,用来快速地访问一个类对象中的方法,一般实现为一个方法表。
方法区中还有一部分是运行时常量池,主要用来存储编译时生成的字面量和符号引用,常量也可以在运行时产生,如String的intern方法。
方法区中也可能存在GC,但虚拟机规范对此不做要求,主要是回收一些常量和卸载一些不用的类型信息,不过要卸载一个类的条件很难达到,而且些处GC其实也回收不了多少内存。
堆(Heap)
虚拟机中用于存放对象与数组实例的地方,垃圾回收的主要区域就是这里(还可能有方法区)。
如果垃圾收集算法采用按代收集(目前大都是这样),这部分还可以细分为新生代和老年代。
新生代又可能分为Eden区,From Survivor区和To Survivor区,主要是为了垃圾回收。所有的线程共享Java堆,在这里还可以划分线程私有的缓冲区(Thread Local Allocation Buffer,TLAB)。
Java堆只要求逻辑上是连续的,在物理空间上可以不连续。
直接内存
JDK1.4中引用了NIO,并引用了Channel与Buffer,可以使用Native函数库直接分配堆外内存,并通过一个存储在Java堆里面的DirectByteBuffer对象作为这块内存的引用进行操作。
对象访问
当新建一个对象时,会在堆中为这个对象分配内存,并在栈中有一个对这个对象引用,除此之外,在Java堆中还要能通过这个对象找到它的类型信息(对象类型,父类,实现的接口,包含的字段与方法等)。
Reference在Java虚拟机中定义为指向对象的引用,但没有定义这个Reference应该有怎么实现。
一种实现是Reference直接存储对象在堆内的地址,对象的类型信息可以在对象在堆中的内存布局中存储,如存储在对象内存的开头等。
另一种实现是Reference指向一个句柄表中的一个位置,句柄中保存了对象的实际位置及它对应的类型信息。
使用句柄的好处是当在内存中移动对象的位置时,只需要更新句柄表中的内容,不需要改变引用值,但会多一次内存访问开销,直接引用的优缺点与此相反。
原文:
相关推荐
Java语言规范和JVM虚拟机规范是理解Java编程基础及其执行机制的核心文档,它们由Oracle官方发布,确保了Java开发的准确性和一致性。本压缩包包含的文件详细阐述了Java编程语言的各个方面以及Java虚拟机(JVM)的工作...
本文主要针对JVM虚拟机面试中的常见问题进行解析,涵盖了JVM的基础知识、JVM的结构组成、类加载器的工作原理等方面的知识点。 Java如何实现跨平台 Java能够实现跨平台是因为Java虚拟机(JVM)负责将字节码文件翻译...
经典JVM PPT,可以直接讲课的 java虚拟机原理介绍 Java虚拟机生命周期 Java虚拟机体系结构 Java 的class文件
Java虚拟机(JVM)是Java程序运行的核心组件,它为Java代码提供了平台无关的运行环境。本篇文章将深入探讨JVM的生命周期、体系结构、类加载机制、内存区域以及垃圾收集。 首先,JVM的生命周期与Java程序紧密关联。...
《深入理解JVM虚拟机:从基础到实践》 JVM(Java Virtual Machine)是Java程序的核心组成部分,它为Java程序提供了跨平台的运行环境。本资料集合包含了多个关于JVM学习的重要主题,旨在帮助读者从基础到深入地掌握...
详细介绍了jvm虚拟机规范,很好 第一章引言 第二章 java概念 第三章 java虚拟机结构 第四章 class文件格式 第五章 常熟池解析 第六章 java虚拟机指令集 第七章 为java虚拟机编译 第八章 线程和锁 第九章 优化 第十章...
9. **类文件结构**:.class文件包含了类的版本、常量池、字段、方法、属性等信息,这些信息是JVM正确运行Java程序的基础。 10. **内存溢出问题**:了解如何分析和解决常见的内存溢出问题,如堆溢出、栈溢出和方法区...
《深入解析JVM虚拟机源码学习》 在Java编程领域,JVM(Java Virtual Machine)虚拟机扮演着至关重要的角色。它负责解释并执行Java字节码,为程序提供了跨平台运行的能力。理解JVM的工作原理对于优化代码性能、排查...
### JVM虚拟机基础概念 Java虚拟机(JVM)是运行Java程序的一种环境,它为Java应用程序提供了一个独立于硬件的抽象计算机模型。通过JVM,开发者可以将编写的Java程序部署在各种不同的操作系统上而无需修改源代码,...
### JVM虚拟机面试题知识点详解 #### 一、JVM运行时内存结构 JVM运行时数据区(Runtime Data Area)主要包括以下几部分: 1. **程序计数器(Program Counter Register)**:是一块较小的内存空间,当前线程所执行的...
本资料“全面理解JVM虚拟机”涵盖了多个关键领域,旨在帮助开发者深入掌握JVM的工作原理。 1. JVM主要学些什么 学习JVM主要包括以下几个方面:JVM架构、内存模型、类加载机制、字节码执行、垃圾回收以及性能优化。...
首先,我们要了解JVM的基本结构。JVM主要包括类装载器、运行时数据区、执行引擎、本地方法接口和本地方法库。类装载器负责加载类文件,运行时数据区存储了程序运行时的各种数据,如堆、栈、方法区等。执行引擎执行...
Java虚拟机(JVM)是Java程序运行的基础,它提供了执行字节码的平台,使得Java具有跨平台的特性。本文将深入探讨JVM的核心原理、内存结构、优化策略以及垃圾回收机制。 首先,JVM的内存结构是理解其工作方式的关键...
### Java(JVM)虚拟机结构基础 Java虚拟机(JVM)是Java技术的核心组件之一,它负责执行Java字节码,确保跨平台的兼容性。深入理解JVM的结构与工作原理对于优化Java应用、提升编程技能具有重要意义。 #### JVM的...
本资源提供的"JVM虚拟机源码(C++)"是针对Java 7版本的HotSpot JVM的源代码,这对于开发者尤其是对JVM原理感兴趣的程序员来说,是一份极其珍贵的学习材料。 HotSpot JVM的源码主要分为以下几个关键部分: 1. **...
8. **异常处理**:JVM根据字节码中的异常表来处理异常,支持try-catch-finally结构,确保finally块总能得到执行。 9. **模块系统(Module System)**:Java9引入了模块化系统,以帮助开发者更好地组织和管理大型...
JVM的内存结构分为堆内存、方法区、栈内存、程序计数器和本地方法栈等几个主要部分。堆内存是所有线程共享的区域,用于存储对象实例。方法区存储类信息、常量、静态变量等。栈内存每个线程独享,存储方法调用时的...
了解Jvm的发展历程即结构,讲解jvm的结构、内存模型、类加载机制,gc的算法分类、class文件的类型
Java虚拟机(Java Virtual Machine,JVM)是Java平台的核心组件之一,对Java程序的执行和管理起着至关重要的作用。下面是Java虚拟机的主要知识点: Java虚拟机生命周期 Java虚拟机的生命周期可分为三个主要阶段:...