JVM内存结构

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

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

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

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等关键字。

在Java中,JMM是一个非常重要的概念,正是由于有了JMM,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内存模型,和Java的并发编程有关。Java对象模型,和Java对象在虚拟机中的表现形式有关。

java对象模型是什么_蓝石榴_个人博客_JVM内存结构、Java内存模型、Java对象模型...相关推荐

  1. JAVA圣诞代码_[Java教程]【Merry Christmas】圣诞节,给博客添加浪漫的下雪效果!...

    [Java教程][Merry Christmas]圣诞节,给博客添加浪漫的下雪效果! 0 2012-12-25 15:00:20 一年一度的圣诞节又到了,首先祝大家好运一串串,健康一年年,平安到永远! ...

  2. 怎么禁止/开启Ubuntu自动更新升级_豆豆技术派的博客-CSDN博客_ubuntu 自动更新

    怎么禁止/开启Ubuntu自动更新升级_豆豆技术派的博客-CSDN博客_ubuntu 自动更新

  3. 无人驾驶运动学模型——线性时变模型预测控制的思路推演过程_百叶书的博客-CSDN博客_线性时变模型预测控制 转

    无人驾驶运动学模型--线性时变模型预测控制的思路推演过程_百叶书的博客-CSDN博客_线性时变模型预测控制

  4. python密码破解工具_一个最简单的博客园文章密码暴力破解器-python3实现

    一个最简单的博客园文章密码暴力破解器-python3实现 我之前想写路由器的密码暴力破解器,我手上只有极路由,发现极路由有安全限制,只能允许连续10密码错误,所以我改拿博客园练手. 博客园的博客有个功 ...

  5. 个人博客系统的设计与实现_一款小而美的博客系统,专为程序员设计

    简介 Solo 是一款小而美的开源博客系统,专为程序员设计.Solo 有着非常活跃的社区,文章自动推送到社区后可以让很多人看到,产生丰富的交流互动. 项目地址 https://github.com/b ...

  6. 基于python的个人博客系统的设计开题报告_基于SSM的个人博客系统设计开题报告...

    本 科 毕 业 设 计(论文)开 题 报 告 题  目:基于SSM的个人博客系统设计与实现 专题题目(若无专题则不填): 本课题来源及研究现状: 关于博客的未来:在创办了博客中国(blogchina) ...

  7. 部分优秀博客主链接汇总(linux c/c++ java go php android ios 前端 j2ee windows linux 算法 ACM AI 深度/机器学习 opencv nlp)

    给大家推荐一个学习人工智能的网站:人工智能社区 https://chenyu.blog.csdn.net/article/details/79449026 <a href = "htt ...

  8. JVM内存结构、内存模型 、对象模型那些事

    作者:Hollis,阿里资深攻城狮 来自:Hollis Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文我 ...

  9. Java程序员从笨鸟到菜鸟全部博客目录

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.NET/csh624366188 欢迎关注微信账号:java那些事:csh624366188.每天一篇java相关的文章 大 ...

最新文章

  1. 【Henu ACM Round#15 A】 A and B and Chess
  2. 银联配置 linux 路径,深圳银联POS支付系统安装手册(LinuxMySQL).doc
  3. .Net之用户控件笔记
  4. MySql中怎样使用case-when实现判断查询结果返回
  5. 用函数实现simulink_VCU/BMS基于模型的开发---Simulink 代码集成
  6. npm i依赖版本兼容问题处理
  7. 图谱实战 | 医学知识图谱的价值与应用场景
  8. html留言板 php,linux下使用Apache+php实现留言板功能的网站
  9. c语言优先级大全,C语言运算符及其优先级汇总表口诀
  10. Java游戏引擎libgdx的简介
  11. 使用CROS解决跨域问题
  12. potala(5)——Unit Test and Cache
  13. 2017.11.18
  14. 火山安卓文件读写操作演示
  15. 企业邮箱和邮箱域名是什么意思?它们有什么区别?
  16. [Python] 练习代码
  17. [Unity3D]Unity3D游戏开发之从《魂斗罗》游戏说起(上)——目标追踪
  18. 图像识别毕业设计 人脸识别与疲劳检测系统设计与实现 - python opencv
  19. 构建数据大治理生态体系,保障数字经济创新发展
  20. Django博客搭建_用户注册1_图片生成

热门文章

  1. Named Volume 在 MySQL 数据持久化上的基本应用
  2. 人工智能第二课:认知服务和机器人框架探秘
  3. 声明式RESTful客户端在asp.net core中的应用
  4. 利用.NET Core类库System.Reflection.DispatchProxy实现简易Aop
  5. 分布式高性能消息处理中心HPMessageCenter
  6. Orleans例子再进一步
  7. 微软Azure开源开发者(深圳)峰会等你来
  8. 开发者的利器:Docker 理解与使用
  9. Django05-2:路由分发/命名空间/伪静态/虚拟环境/django版本区别
  10. 解读大型网站系统架构的演化