商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > JVM、Java 、Java对象模型

JVM、Java 、Java对象模型

  发布于2026-07-12 阅读(0)

扫一扫,手机访问

Ja va作为一门面向对象的跨平台语言,对象、内存这些知识点一直是比较绕的地方。更麻烦的是,不少概念的名字看起来特别相似,很多人容易搞混。今天要聊的三个东西——JVM内存结构、Ja va内存模型和Ja va对象模型——就是典型的例子。它们完全是三个不同的概念,但很多人就是分不清楚。

可以这么说,很多高级开发甚至都搞不清这三者之间的区别。有些面试官自己也不是特别清楚。不信的话,去网上搜"Ja va内存模型",你会发现不少文章实际讲的是JVM内存结构。

首先,这三个概念是完全不同的。本文主要对它们做个区分和简单介绍。每个点都能单独写一篇文章,这里就不深入展开了。感兴趣的话可以后续自行深入。

JVM内存结构

Ja va代码要运行在虚拟机上,虚拟机在执行Ja va程序的过程中会把管理的内存划分为若干个不同的数据区域,每个区域都有自己的用途。有些区域随虚拟机进程启动而存在,有些则依赖用户线程的启动和结束来建立和销毁。《Ja va虚拟机规范(Ja va SE 8)》中描述了JVM运行时内存区域结构如下:

各个区域的具体功能不是本文重点,简单提几个需要特别注意的点:

1、以上是Ja va虚拟机规范,不同虚拟机实现会各有不同,但一般会遵守规范。

2、规范中定义的方法区是一种概念上的区域,说明其应该具有什么功能,但没有规定这个区域到底应该处于何处。不同虚拟机实现有一定的自由度。

3、不同版本的方法区所处位置不同,上图划分的是逻辑区域,不是绝对意义上的物理区域。某些版本的JDK中方法区其实是在堆中实现的。

4、运行时常量池用于存放编译期生成的各种字面量和符号引用。但Ja va语言并不要求常量只在编译期才能产生,比如运行期String.intern也会把新的常量放入池中。

5、除了以上JVM运行时内存,还有一块内存区域可供使用——直接内存。Ja va虚拟机规范并没有定义这块区域,它不由JVM管理,是利用本地方法库在堆外申请的内存。

6、堆和栈的数据划分也不是绝对的,比如HotSpot的JIT会针对对象分配做相应的优化。

总结一下:JVM内存结构由Ja va虚拟机规范定义,描述的是Ja va程序执行过程中由JVM管理的不同数据区域,各个区域有特定功能。

Ja va内存模型

Ja va内存模型这个名字和JVM内存结构很相似,很多人会误以为两者是一回事,面试时也经常答非所问。

在前面的JVM内存结构图中可以看到,Ja va堆和方法区是多个线程共享的数据区域。也就是说多个线程可能操作保存在堆或方法区中的同一个数据。这就是常说的"Ja va的线程间通过共享内存进行通信"。

Ja va内存模型(JMM)是一个抽象概念,并不像JVM内存结构那样真实存在。JSR-133中描述了JMM是多线程相关的,它定义了一组规则或规范——一个线程对共享变量的写入对另一个线程是可见的。

简单总结:Ja va多线程之间通过共享内存通信,而采用共享内存通信会存在可见性、原子性、顺序性等问题。JMM就是围绕着多线程通信及其相关特性建立的模型。它定义了一些语法集,映射到Ja va语言中就是volatile、synchronized等关键字。

在JMM中,把多个线程间通信的共享内存称作主内存,而并发编程中每个线程都维护自己的本地内存(抽象概念),其中保存的是主内存中的数据拷贝。JMM主要控制本地内存和主内存之间的数据交互。

JMM是Ja va中非常重要的概念,正是有了它,Ja va的并发编程才能避免很多问题。这里不再详细展开,想深入了解的话,可以阅读《Ja va并发编程的艺术》。

Ja va对象模型

Ja va是面向对象的语言,Ja va对象在JVM中的存储也有一定的结构。这个关于Ja va对象自身的存储模型就叫做Ja va对象模型。

HotSpot虚拟机中设计了一个OOP-Klass Model。OOP(Ordinary Object Pointer)指的是普通对象指针,Klass用来描述对象实例的具体类型。

每一个Ja va类被JVM加载时,JVM会给这个类创建一个instanceKlass,保存在方法区,用来在JVM层表示该Ja va类。当我们在Ja va代码中用new创建一个对象时,JVM会创建一个instanceOopDesc对象,包含对象头以及实例数据。

这就是一个简单的Ja va对象的OOP-Klass模型,即Ja va对象模型。

总结

最后再区分一下这三个概念:

JVM内存结构,和Ja va虚拟机的运行时区域有关。

Ja va内存模型,和Ja va的并发编程有关。

Ja va对象模型,和Ja va对象在虚拟机中的表现形式有关。

这三个部分各自涉及的知识点非常多,本文没有分别展开。后续会进一步介绍这些内容。

本文转载于:https://blog.csdn.net/guizaian/article/details/102876819 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注