一文读懂”JVM内存结构““Java内存模型““Java对象模型“

一文读懂JMM内存模型 Java内存模型即Java Memory Model,简称JMM。JMM定义了Java 虚拟机(JVM)在计算机内存(RAM)中的工作方式。JVM是整个计算机虚拟模型,所以JMM是隶属于JVM的。 如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。Java内存模型定义了多线程之间共享变量的可见性以及如何在需要的时候对共享变量进行同步。原始的Java内存模型效率并不是很理想,因此Java1.5版本对其进行了重构,现在的Java8仍沿用了Java1.5的版本。 关于并发编程 在并发编程领域,有 阅读详情

Java作为一种面向对象的,跨平台语言,其对象、内存等一直是比较难的知识点。而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚。比如本文我们要讨论的JVM内存结构、Java内存模型和Java对象模型,这就是三个截然不同的概念,但是很多人容易弄混。

可以这样说,很多高级开发甚至都搞不不清楚JVM内存结构、Java内存模型和Java对象模型这三者的概念及其间的区别。甚至我见过有些面试官自己也搞的不是太清楚。不信的话,你去网上搜索Java内存模型,还会有很多文章的内容其实介绍的是JVM内存结构。

首先,这三个概念是完全不同的三个概念。本文主要对这三个概念加以区分以及简单介绍。其中每一个知识点都可以单独写一篇文章,本文并不会深入介绍。

JVM内存结构

我们都知道,Java代码是要运行在虚拟机上的,而虚拟机在执行Java程序的过程中会把所管理的内存划分为若干个不同的数据区域,这些区域都有各自的用途。

其中有些区域随着虚拟机进程的启动而存在,而有些区域则依赖用户线程的启动和结束而建立和销毁。在《Java虚拟机规范(Java SE 8)》中描述了JVM运行时内存区域结构如下:

各个区域的功能不是本文重点,就不在这里详细介绍了。这里简单提几个需要特别注意的点:

  1. 以上是Java虚拟机规范,不同的虚拟机实现会各有不同,但是一般会遵守规范。

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

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

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

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

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

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

Java内存模型

Java内存模型看上去和Java内存结构(JVM内存结构)差不多,很多人会误以为两者是一回事儿,这也就导致面试过程中经常答非所为。

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

Java内存模型是根据英文Java Memory Model(JMM)翻译过来的。其实JMM并不像JVM内存结构一样是真实存在的。他只是一个抽象的概念。JSR-133: Java Memory Model and Thread Specification 中描述了,JMM是和多线程相关的,他描述了一组规则或规范,这个规范定义了一个线程对共享变量的写入时对另一个线程是可见的。

那么,简单总结下,Java的多线程之间是通过共享内存进行通信的,而由于采用共享内存进行通信,在通信过程中会存在一系列如可见性、原子性、顺序性等问题,而JMM就是围绕着多线程通信以及与其相关的一系列特性而建立的模型。JMM定义了一些语法集,这些语法集映射到Java语言中就是volatile、synchronized等关键字。

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

在Java中,JMM是一个非常重要的概念,正是由于有了JMM,Java的并发编程才能避免很多问题。这里就不对Java内存模型做更加详细的介绍了,想了解更多的朋友可以参考《Java并发编程的艺术》。

Java对象模型

Java是一种面向对象的语言,而Java对象在JVM中的存储也是有一定的结构的。而这个关于Java对象自身的存储模型称之为Java对象模型。

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

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

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

总结

我们再来区分下JVM内存结构、 Java内存模型 以及 Java对象模型 三个概念。

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

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

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

关于这三部分内容,本文并未分别展开,因为涉及到的知识点实在太多,如果读者感兴趣,可以自行学习。

最后,这三个概念非常重要,一定要严格区分开,千万不要在面试中出现答非所为的情况。

基于Java的对象模型消息机制实现 基于Java的对象模型消息机制实现基于Java的对象模型消息机制实现基于Java的对象模型消息机制实现 立即下载

相关推荐

SSL证书验证:VMware Horizon Client的安全隐患与临时解决方案

本文深入分析了VMware Horizon Client中SSL证书验证失败的安全隐患,提供了临时解决方案与长期防御策略。针对自签名证书、证书链断裂等常见问题,文章详细解析了风险成因,并给出分级响应方案,帮助企业平衡安全与效率。通过实战案例和自动化脚本,指导IT管理员构建主动防御体系,有效降低中间人攻击风险。

weixin_29290863的博客 337

Java对象模型(OOP-Klass)

包含OOP-Klass模型、对象寻址详解

叫兽张益达的博客 1121

Windows——Nessus安装(无限制)

Nessus手把手图文安装,解除ip限制~

网安小白的博客 9448

深入理解Java中的类和对象模型

本文深入探讨了Java中的类和对象模型,包括类的定义、对象的创建、内存模型、类加载机制、类和对象的关系、继承与多态以及静态成员。类是对象的蓝图或模板,而对象是类的实例。在Java中,对象在内存中分为几个部分:对象头、实例数据和对齐填充。对象头包含了对象的元数据,包括对象的哈希码、GC标记、类指针等。类定义了对象的结构和行为,而对象是类的具体实例。类中的静态成员属于类本身,而不是类的实例。Java的类加载器包括启动类加载器、扩展类加载器和应用类加载器。实例数据部分存储了对象的实际数据,即类中的属性值。

省赚客开发者博客 561

MT25QL256完整操作指南:从ID读取到4KB扇区擦除(附华大SPI例程)

本文提供了MT25QL256 NOR FLASH在华大MCU上的完整驱动开发指南。内容涵盖从SPI初始化、器件ID读取、状态寄存器查询,到核心的页编程和4KB扇区擦除操作,并分享了构建健壮驱动框架、处理跨页写入及常见调试问题的实战经验。

tt34567的博客 886

044、Edge Impulse的音频分类实战

上周调试一块STM32WBA52开发板,板载PDM麦克风死活采不到有效数据。示波器怼上去,时钟线波形漂亮得像教科书,数据线却像心电图——全是毛刺。折腾半天发现是电源纹波干扰,给麦克风单独加了个LC滤波,世界清净了。这种坑,做音频分类的嵌入式工程师迟早要踩一遍。

2401_88858637的博客 54

java对象模型

java对象模型

大连赵哥的博客 627

基于STM32F4XX 、HAL库的GXHT30C温湿度传感器驱动应用C语言程序设计

define GXHT30C_STATUS_WRITE_CHK (1 << 0) // 写数据校验状态。#define GXHT30C_STATUS_HUMI_TRACK (1 << 11) // 湿度跟踪报警。#define GXHT30C_STATUS_TEMP_TRACK (1 << 10) // 温度跟踪报警。#define GXHT30C_STATUS_CMD_STATUS (1 << 1) // 命令执行状态。

PP_Cottage的博客 226

java的对象模型

每一个Java类,在被JVM加载的时候,JVM会给这个类创建一个,保存在方法区,用来在JVM层表示该Java类。当我们在Java代码中,使用new创建一个对象的时候,JVM会创建一个对象,这个对象中包含了两部分信息,方法头以及元数据。对象头中有一些运行时数据,其中就包括和多线程相关的锁的信息。元数据其实维护的是指针,指向的是对象所属的类的。

Chen_leilei的博客 726

学Simulink——基于Simulink的固态变压器(SST)多级协同控制​

本文介绍了基于Simulink的固态变压器(SST)多级协同控制系统设计与仿真方法。SST作为智能电网关键设备,包含AC-DC整流、DC-DC隔离和DC-AC逆变三级变换器。针对级间耦合问题,提出了能量-功率协同控制策略,通过纵向解耦和横向联动实现稳定运行。详细演示了在Simulink中搭建三级主电路、设计协同控制器(含电网定向控制、功率前馈和虚拟惯性控制)的全过程,并通过负载突变测试验证了系统动态性能(直流母线电压波动<2%)。最后给出了工程部署建议,包括数字控制延时补偿、启动序列设计和代码自动生成

xiaoheshang_123的博客 203

微信小程序|基于小程序+云开发制作一个租房小程序

经济发展的同时伴随着大批人群的流动,租房需求一直是持久不衰的话题,如何租好房,好租房,跟随此文一起制作一个租房小程序,让租房不再困难。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 4928

JVM成神之路-Java对象模型

首先我们要知道: 在jvm的内存结构中,对象保存在堆中,而我们在对对象进行操作时,其实操作的是对象的引用。 Java对象包含三个部分 一个Java对象可以分为三部分存储在内存中,分别是:对象头(Header)、实例数据(Instance Data)和对齐填充(Padding)。 对象头(包含锁状态标志,线程持有的锁等标志) 实例数据 对齐填充 oop-klass model(...

Franco的博客 9599

DDS协议--[第一章][概述]

Data Distribute Service,数据分发服务:数据分发服务(DDS™)是一个由对象管理组(OMG)发布的以数据为中心的中间件协议和API标准。DDS集成系统中的各个组件,提供低延迟数据连接、高可靠性以及高可扩展体系结构,以适应商业级物联网(IoT)应用程序的需求。

qq_41816308的博客 1152

一文读懂JVM内存模型

内存泄露是指程序在运行的过程中不再使用的对象仍然被引用,而无法被垃圾回收器回收,从而导致可用内存减少。虽然在java中,垃圾回收机制自动回收不使用的对象,但如果有对象仍被不再使用的引用持有,垃圾收集器无法回收这些内存,最终可能导致程序的内存使用不断增加。方法区主要用于存储已被虚拟机加载的类型信息,常量,静态变量,及时编译器编译后的代码缓存等。存储类和接口中的常量,包括字面值常量、符号引用,以及运行时常量池。:存储类和方法的符号引用,是一种直接引用不同于直接引用的引用类型。递归调用:深度递归导致栈溢出。

m0_67740632的博客 1118

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

一文读懂 -Java虚拟机的内存结构(图详解)

JVM中的堆啊、栈啊、方法区什么的,是Java虚拟机的内存结构,Java程序启动后,会初始化这些内存的数据。 内存结构就是上图中内存空间这些东西,而Java内存模型,完全是另外的一个东西。 Java中的内存分配: Java程序在运行时,需要在内存中的分配空间。为了提高运算效率,就对数据进行了不同空间的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。 具体划分为如下5个内存空间: 栈:存放局部变量 堆:存放所有new出来的东西 方法区:被虚拟机加载的类信息、常量、静态常量等。 程序计数器(和系统

末尾卡片和博主交流学习! 6137

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

一文读懂Java多线程并发之内存模型

Java内存模型(Java Memory Model)描述了Java编程语言中的线程如何与内存进行交互,是和多线程相关的一组规范,需要各个 JVM 的实现来遵守 JMM 规范,以便于开发者可以利用这些规范,更方便地开发多线程程序。有了这些规范,即便同一个程序在不同操作系统的虚拟机上运行,得到的程序结果也是一致的。如果没有这些规范,不同操作系统的虚拟机对相同关键字的解释不一致,这是不可接受的。JMM旨在解决 CPU 多级缓存、处理器优化、指令重排等导致的结果不可预期的问题。

ningkangming的博客 894

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

一文读懂 JVM 内存布局

摘要:JVM内存区域可分为线程私有和共享两大部分。线程私有区域包括程序计数器(记录执行位置)、虚拟机栈(存储方法执行数据)和本地方法栈(服务于Native方法),各自独立且随线程创建销毁。共享区域包含堆(存放对象实例)和方法区(存储类信息等),由所有线程共用,是垃圾回收主要区域。方法区在Java 8后改为元空间实现。理解这些区域的功能和特点(如可能抛出的内存错误)是进行JVM调优和问题排查的基础。文章通过厨房比喻生动解释了各区域的作用。

weixin_51786043的博客 1953

一文读懂JVM 与 Linux 的内存关系

JVM的内存管理方式的优点是显而易见的,包括:第一,减少系统调用的次数,JVM在给Java程序分配内存空间时不需要操作系统干预,仅仅在 Java堆大小变化时需要向操作系统申请内存或通知回收,而普通程序每次内存空间的分配回收都需要系统调用参与;第二,减少内存泄漏,普通程序没有(或者 没有及时)通知操作系统内存空间的释放是内存泄漏的重要原因之一,而由JVM统一管理,可以避免程序员带来的内存泄漏问题。事实上,这是由于SWAP和GC同时进行造成的,从下图可以看到,SWAP的使用和长时间的GC在同一时刻发生。

Park33的博客 973

一文读懂内存模型

​JMM内存模型

qq_32428485的博客 617

一文读懂Java内存模型(JMM)

Java内存模型(JMM),全称 Java Memory Model,中文释义Java内存模型;对于 Java 程序员来说,在虚拟机自动内存管理机制下,不再需要像C/C++程序开发程序员这样。正是因为 Java 程序把。一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那么排查错误将会是一个非常艰巨的任务。

HSQdePYZ的博客 690

一文读懂什么是JVM中的内存模型与垃圾回收!

扩展阅读:初探JVM,你只需要看这篇文章! 六、内存模型 6.1、内存模型与运行时数据区 Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同数据区域。 Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。 这里所讲的主内存、工作内存与Java内存区域中的Java堆、栈、方法区等并不是同一层次的内存划...

javaxuexi123的博客 372

一文读懂Java内存模型(JMM)及volatile关键字

点赞再看,养成习惯,公众号搜一搜【一角钱技术】关注更多原创技术文章。 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章。 前言 并发编程从操作系统底层工作的整体认识开始 上一篇我们从操作系统底层工作的整体了解了并发编程在硬件以及操作系统层面的一些知识,本篇我们继续来学习JMM模型以及Volatile关键字的那些面试必问的一些知识点。 什么是JMM模型? Java 内存模型(Java Memory Model 简称JMM)是一种抽象的概念,并不真实存在,它描..

org_hjh的博客 856

一文读懂 JVM 运行时内存!你真的了解吗?

在 Java 开发的世界里,JVM(Java 虚拟机)如同幕后英雄,默默地管理着程序的运行。而 JVM 运行时内存,更是 JVM 的核心组成部分,它就像一个精密的仓库,合理地存储和管理着各种数据。那么,这个 “仓库” 究竟是如何运作的呢?让我们一起深入探究。

一个正在努力产出优质文章的Java博主 891

Java内存模型(JMM)与JVM内存模型

Java内存模型(JMM)与JVM内存模型解析:JMM定义多线程环境下共享内存的交互规则,解决原子性、可见性和有序性问题,通过Happens-Before规则平衡性能与安全;JVM内存模型则管理运行时数据区,包括堆(对象实例)、方法区(类信息)、虚拟机栈(方法调用)等。理解二者的区别与联系是掌握Java并发编程的关键,JMM关注"如何安全交互",JVM关注"数据存储位置"。

屹奕的博客 442

linux 修改jvm时区_一文读懂JVM 与 Linux 的内存关系

专注于Java领域优质技术,欢迎关注来自:美团技术团队在一些物理内存为8g的服务器上,主要运行一个Java服务,系统内存分配如下:Java服务的JVM堆大小设置为6g,一个监控进程占用大约 600m,Linux自身使用大约800m。从表面上,物理内存应该是足够使用的;但实际运行的情况是,会发生大量使用SWAP(说明物理内存不够使用 了),如下图所示。由于SWAP和GC同时发生会致使JVM严重卡顿,...

weixin_42397024的博客 115
上一篇: 必须掌握的iOS技术|网络|推送与数据处理
下一篇: XCode解决can‘t locate file for .a异常设置AVAudioSessionCategoryPlayAndRecord与Git密码更改
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值