JVM之内存模型

本文详细介绍了JVM的常见实现,包括HotSpot、JRockit、TaobaoVM等,并解析了从Java编码到执行的全过程,涉及编译、类加载、字节码解释与JIT编译。同时,概述了JVM规范的内存模型,包括堆、方法区、虚拟机栈、本地方法栈和程序计数器等组件,以及它们在不同线程中的作用和管理机制。

概述

         在学习java或者面试过程中经常会碰到JVM内存模型的问题,在学习的过程中整理了下JVM的一些基本概念,本篇主要总结以下几部分:

         1.常见的JVM实现有那些。

         2.java从编码到执行中那部分是JVM。

         3.JVM规范的内存模型。

常见的JVM实现有那些

         java虚拟机是一个规范,他定义了java虚拟机能执行什么,java虚拟机应改有那些模块,遇到什么指令执行什么操作等 具体规范可以到官网看:https://docs.oracle.com/en/java/javase/13/

常见的JVM实现

     1.Hotsport : oracle官网的JVM实现。

     2.jrockit: BEA,曾经号称世界上最快的JVM,被oracle收购,合并于hotspot,

    3.TaobaoVM:hotspot深度定制版

    4.LiquidVM : 直接针对硬件

    5.azul zing 最新垃圾回收的业界标杆,www.azul.com.

java从编码到执行

      在写java代码的过程中,代码从编码到执行过程中,如下步骤中的3.4.5是属于JVM里,具体如下:

     1.首先我们编写.java的代码文件。

     2.通过javac执行将.java文件变成.class文件。

     3.通过classloader把class文件加载到内存中,同时会吧java的类库也装载到内存里。

     4.加载完成后会调用字节码解释器或者JIT即时编译器进行编译。

     5.编译完的代码会交给执行引擎去执行。

     6.执行引擎下边对应的是硬件和操作系统了。

                       

 JVM规范的内存模型

      jvm规范中将JVM内存划分成5部分,其中方法区和堆是所有线程共享的区域,虚拟机栈、本地方法栈、程序计数器三部分是线程私有的,具体描述如下:

    1)方法区:存放的是虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等,在hotspot虚拟机实现中,在JDK1.8之前叫perm space(永久区),1.8及之后版本叫Meta space(元数据区),实现上的区别是,永久区是用的jvm内存,元数据是用的操作系统内存不占用JVM的内存。

    2)堆:虚拟机启动时创建,此内存区域主要存放对象实例,几乎所有的对象都是在这里分配内存,当堆内存不足是会抛出OutOfMemoryError。

    3) 虚拟机栈:每个线程私有的运行时堆栈,每个方法会创建一个栈帧,所有局部变量会存放在栈帧中。其中栈帧里包含:局部变量、操作数栈、动态链接(指到我们常量池里边的引用)、return地址四部分,栈空间用光了会报StackOverFlowError。 

    4)本地方法栈:与虚拟机栈所发挥的作用相似,区别只是虚拟机栈为虚拟机执行java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务

    5)程序计数器:存放的是当前线程正在执行的字节码指令地址,如果是native方法,则保存的值是undefine

Hotspot

<think>首先,用户的问题是:“我想获取JVM内存模型的简述”,意思是“我想获取JVM内存模型的简述”。所以,我需要提供一个简洁的、概括性的JVM内存模型描述。 从系统级指令: - 所有行内数学表达式必须使用 $...$ 格式。 - 独立公式必须使用 $$...$$ 格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识。 用户提到了“参考站内引用”,并提供了多个引用: - 引用[1]:讨论了JMM和JVM的区别和关联。 - 引用[2]:简要介绍了JVM是什么。 - 引用[3]:描述了JVM内存模型的部分和内存溢出情况。 - 引用[4]:提供了JVM内存模型的简述,包括程序计数器、虚拟机栈等。 用户说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但在这个对话中,这是第一次交互,没有上一次问题。用户指的是“用户上一次的问题”,但在当前上下文中,似乎是这个问题的开始。所以,我应该基于用户当前的查询来回答。 核心任务:简述JVM内存模型。 从引用中提取关键点: - JVM内存模型包括: - 线程共享区域:堆内存、元空间(方法区的实现)、直接内存(在某些引用中提到)。 - 线程私有区域:程序计数器、虚拟机栈、本地方法栈。 - 具体组件: - **程序计数器**:线程私有,存储当前指令地址。 - **虚拟机栈**:线程私有,存储方法调用栈帧,包含局部变量等。 - **本地方法栈**:线程私有,用于native方法。 - **堆内存**:线程共享,存储对象实例。 - **元空间**:线程共享,存储类元数据(方法区的实现)。 - 内存溢出情况: -内存溢出:Java heap space。 - 栈溢出:StackOverFlowError。 - 元空间溢出:Metaspace OutOfMemory。 - 直接内存溢出:Direct buffer memory(从引用[3])。 用户要求“简述”,所以保持简洁。不需要深入细节。 生成相关问题:在回答结束时,生成相关问题。 回答结构: 1. 先提供一个概述。 2. 然后简要描述各个内存区域。 3. 最后添加相关问题。 使用中文:整个回答用中文。 引用标识:如果引用内容,在末尾添加[^1]等。但用户提供了引用,我应该自然地引用它们。 现在,构建回答: - 引言:简述JVM内存模型是什么。 - 描述组件: - 程序计数器 - 虚拟机栈 - 本地方法栈 -内存 - 元空间 - 简要提到内存溢出(可选,因为用户问简述)。 - 结束。 相关问题:例如, 1. JVM内存模型与JMM的区别? 2. JVM内存溢出的常见原因? 3. 如何优化JVM内存使用? 确保LaTeX:在这个主题中,可能没有数学表达式,但如果有变量或方程,用$...$。例如,如果在描述大小,但这里不需要。 最终响应结构: - 简述内容。 - §§相关问题§§部分。 </think>### JVM内存模型简述 Java虚拟机(JVM内存模型描述了Java程序运行时内存的分配和管理结构,主要包括线程共享区域和线程私有区域。这些区域协同工作,确保程序的正常执行和对象存储。基于引用[3]和[4],JVM内存模型的核心组件可简述如下: 1. **程序计数器(Program Counter Register)**: 线程私有,用于存储当前线程执行的字节码指令行号指示器。每个线程都有自己的程序计数器,确保线程切换后能正确恢复执行位置。它是较小的内存区域,不会发生内存溢出错误[^3][^4]。 2. **虚拟机栈(Java Virtual Machine Stack)**: 线程私有,每个方法调用时会创建一个栈帧,存储局部变量、操作数栈、方法出口等信息。如果递归调用过深或帧数超过限制(如通过 `-Xss` 参数设置),会导致 `StackOverflowError`;如果栈空间无法扩展,则可能抛出 `OutOfMemoryError`[^3][^4]。 3. **本地方法栈(Native Method Stack)**: 线程私有,功能类似于虚拟机栈,但专门用于执行本地(native)方法(如C/C++实现的函数)。同样可能发生栈溢出或内存溢出错误[^3][^4]。 4. **堆内存(Heap)**: 线程共享,是所有对象实例和数组的分配区域,存储对象的实际数据。堆内存由垃圾回收器管理,如果对象分配过多或发生内存泄漏(如大对象未释放),会抛出 `java.lang.OutOfMemoryError: Java heap space`[^3][^4]。 5. **元空间(Metaspace)**: 线程共享,是方法区的实现(在JDK 1.8后取代永久代),存储类元数据信息(如类结构、常量池等)。元空间使用本地内存(非堆内存),如果类加载过多(如动态生成类),可能导致 `java.lang.OutOfMemoryError: Metaspace`[^3][^4]。 6. **直接内存(Direct Memory)**(非标准JVM组件,但常见于实际应用中): 线程共享,用于NIO操作(如ByteBuffer),通过堆外内存直接访问系统资源。如果分配过大,会引发 `java.lang.OutOfMemoryError: Direct buffer memory`[^3]。 JVM内存模型通过上述区域实现内存隔离和高效管理,其中线程私有区域(程序计数器、虚拟机栈、本地方法栈)确保线程安全,而线程共享区域(堆、元空间)支持对象存储和类加载。需注意,JVM内存模型JVM Memory Structure)与Java内存模型(JMM)不同:JMM关注线程间数据共享和可见性规则(如主内存和工作内存),而JVM描述物理内存分配细节[^1]。总体上,JVM内存模型优化了跨平台执行效率,但需合理配置以避免溢出问题。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

密度比例

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值