千家信息网

怎样了解JVM内存模型

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇文章为大家展示了怎样了解JVM内存模型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。如果想了解JVM内存模型,首先我们要知道JVM是什么?JVM全称 Ja
千家信息网最后更新 2026年11月01日怎样了解JVM内存模型

本篇文章为大家展示了怎样了解JVM内存模型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

如果想了解JVM内存模型,首先我们要知道JVM是什么?JVM全称 Java Virtual Machine ,即Java虚拟机,是用于运行Java程序编译后的字节码文件。

JVM最常见的三种类型有:
1.Sun公司的 HotSpot,是目前使用最广泛的Java虚拟机。
2.BEA公司的 JRockit,后来被 Oracle收购。
3.IBM公司的 J9VM。

我们知道,Java的口号是:"Write once, run anywhere",即一次编写,到处运行。为什么可以做到这样呢,其实就是依赖于JVM。在不同的操作系统上,只要安装了对应的虚拟机,那么同样的一份代码,就可以随意移植。

当编写完Java代码时,即产生 .Java文件,会通过Java编译器编译为.class 文件,然后通过Class Loader把类信息加载到JVM中,最后JVM再去调用操作系统。这样,只要JVM正确执行.class文件,就可以实现跨平台了。

以下即为JVM的内存模型图:

file

程序计数器:

程序计数器是一块较小的内存,可以看做是当前线程所执行的字节码的行号指示器,即记录当前线程所执行到的字节码的行号。当字节码解释器工作时,就是通过改变计数器的值来选取下一条需要执行的字节码指令。由此来完成分支、循环、跳转、线程恢复、异常处理等功能。

程序计数器是线程私有的(即每个线程拥有一个程序计数器),各个线程之间的程序计数器互不干扰。程序计数器的生命周期跟随线程的生命周期,若线程消亡,则程序计数器也会消亡。

如果一个线程正在执行的是Java方法,则程序计数器记录的是正在执行的字节码指令的地址;如果正在执行的是 native 本地方法,则程序计数器记录的是 Undefined .

栈

指的是Java虚拟机栈,它也是线程私有的,因此生命周期和线程相同。每当线程创建的时候,都会创建一个私有的Java虚拟机栈。Java栈中保存了局部变量和方法参数等,同时和Java方法的调用、返回密切相关。

每个方法在执行的同时都会创建一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用到执行完成的过程,就对应一个栈帧在虚拟机栈中从入栈到出栈的过程。

本地方法栈

本地方法栈和Java虚拟机栈非常类似,它们最大的不同在于,Java虚拟机栈用于Java方法的调用,而本地方法栈用于Native本地方法的调用。

堆

Java堆是所有线程共享的一块内存区域,在虚拟机启动时创建。对于绝大多数应用来说,Java堆是JVM所管理的内存中最大的一块,几乎所有的对象实例和数组都存放在这里。

Java堆也是垃圾收集器管理的主要区域。堆中分为新生代、老年代和永久代,新生代还可细分为Eden区、From、To 区。当堆中没有内存可分配时,就会抛出OOM异常。

方法区

方法区同Java堆一样,也是所有线程共享的内存区域。用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。在JDK8以前,HotSpot是用"永久代"来实现方法区的,其他虚拟机(如JRockit、J9VM)不存在永久代这个概念。这样的话,方法区可以和Java堆一样被 HotSpot的垃圾收集器所管理,不需要单独处理。

由于我们可以通过 -XX:MaxPermSize 来设置永久代大小,因此若使用永久代来实现方法区,则会有内存溢出的风险。因此,在JDk8中,取消了永久代,用元空间代替之。也就是说,用元空间来实现方法区。

元空间的本质和永久代类似,都是对JVM规范中方法区的实现。元空间与永久代之间最大的区别在于:永久代是堆的一部分,和新生代,老年代地址是连续的。元空间并不在虚拟机中,而属于 Native Memeory(本地内存)。因此,默认情况下,元空间的大小仅受本地内存限制。

运行时常量池

首先需要知道常量池和运行时常量池的区别。

常量池,即指class文件常量池,是class文件的一部分。java文件被编译成class文件之后,除了包含了类的版本、字段、方法、接口等描述信息,还有一项信息叫做class文件常量池。其用于存放编译期生成的各种字面量和符号引用。

file

运行时常量池是方法区的一部分。当类加载到内存中,JVM就会将class文件常量池中的内容(字面量和符号引用)存放到运行时常量池中。

Java并不要求常量一定只有在编译期才可以产生,在运行期间也可以产生新的常量并放入池中。

直接内存

Java的NIO库允许Java程序使用直接内存。直接内存是Java堆外的,直接向系统申请的一块内存空间(直接内存不属于虚拟机运行时数据区)。因此,直接内存的大小不受虚拟机的限制,只受本机内存的限制。通常访问直接内存的速度会快于访问堆的速度。

上述内容就是怎样了解JVM内存模型,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

内存 方法 线程 程序 文件 计数器 程序计数器 永久 常量 空间 编译 运行 字节 模型 最大 代码 信息 公司 内容 区域 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技 上海睿民互联网科技有限公司 科技和互联网公司 圆梦互联网科技 互联网公司 科技公司 火传媒上海互联网科技 互联网科技公司的市场部门 现代科技和互联网有关系吗 天速互联网络科技有限公司 字节跳动和互联网科技 重庆威客帮互联网科技 昊天互联网科技有限公司 和信科技工业互联网 企晟互联网信息科技有限公司 皮皮虾互联网科技有限公司 厦门江牛科技互联网 2021世界互联网领先科技成果发布 唯美互联网科技 六子台科技互联网展会 武汉亿视互联网科技有限公司 奇酷互联网科技公司 互联网科技视频 浩特互联网科技 彤创互联网科技有限公司 南平创想时代互联网科技有限公司 崇明区互联网教育科技诚信经营 互联网5g黑科技有哪些 科技赋能视角下互联网保险发展 广西泛欧互联网科技有限公司 广州全民伙伴互联网科技有限公司
0