Java内存结构、内存模型、对象模型这几个概念经常会被混为一谈。理论知识容易忘写下来帮助记忆,方便以后查看。

1、Java内存结构


Java内存结构其实说的是JVM在运行时内存区域的划分,是根据Java虚拟机规范来实现的。说的是JVM中划分出的各块内存区域分别用来干什么。如上图分为了5大块:方法区,虚拟机栈(有的叫方法栈也有叫线程栈的)、本地方法栈、堆、程序计数器(也有叫寄存器的)。其中方法区和堆是线程共享的内存区域,而虚拟机栈、本地方法栈和程序计数器是线程私有的,或者说是线程隔离的。

1.1 程序计数器:

它是当前线程执行字节码的指示器,通过改变它的值来选取下一条要执行的Java字节码指令。Java代码中的循环、跳转、异常处理、线程获得时间片后的恢复都需要依赖程序计数器。程序计数器所占内存很小,也是唯一一块不会出现内存溢出异常的内存区域。

1.2 虚拟机栈:

虚拟机栈是线程私有的,每一个线程都会分配一个虚拟机栈,它描述的是Java方法执行的内存模型,每个方法执行时都会同步创建一个栈帧,用于存储方法运行过程中需要的数据,指令,返回地址等信息。

1.3 本地方法栈

本地方法栈和虚拟机栈描述类似,区别只在于虚拟机栈描述的是Java方法,而本地方法栈描述的是Native方法(c++语言)。

1.4 方法区

它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区只是Java虚拟机规范中的一种理论思想,在jdk1.7之前这部分内容被存放于永久代中,在jdk1.8之后用元空间来代替。jdk的做法是理论的实现方式。永久代和元空间都可以通过jvm参数来调整其大小,不同的是元空间使用的是直接内存。

1.5 堆

堆是这几块内存区域中最大的一块,存放的是Java中几乎所有的对象实例。几乎所有对象也就是说不是全部,从jdk1.7之后开启了逃逸分析,感兴趣的可以查一查,它说的是当方法中的一个对象,未被外部引用并且未被方法返回,也就是说这个对象只在这个方法内有用,那么这个对象可以直接在栈上分配内存。

2、Java内存模型(JMM)


JMM可以理解为Java模拟了cpu的硬件架构所规定的一种规范。由于cpu处理速度非常块比内存的读写速度要快很多,为了不妥协内存的读写速度,cpu引入了高速缓存,cpu要想修改主内存的值必须先将主内存中的数据拷贝到高速缓存中进行读取,然后再回写入主内存。
从上节内容可知,Java堆和方法区域是多个线程共享的数据区域。也就是说,多个线程可以操作保存在堆或者方法区中的同一数据。
JMM和多线程相关,它定义了一个线程对共享变量的写入对另一个线程是可见的。Java的多线程间是通过共享内存进行通信的,在通信过程中就会存在一系列如可见性、原子性、顺序性等问题。而JMM就是围绕多线程通信以及其相关的一系列特性而建立的模型。JMM定义了一系列语法集,这些语法集映射到Java中就是volatilesynchronized等关键字。

Java内存结构与Java内存模型相关推荐

  1. 区分 JVM 内存结构、 Java 内存模型 以及 Java 对象模型 三个概念

    本文由 简悦 SimpRead 转码, 原文地址 https://www.toutiao.com/i6732361325244056072/ 作者:Hollis 来源:公众号Hollis Java 作 ...

  2. 【转】JVM内存结构 VS Java内存模型 VS Java对象模型

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

  3. JVM内存结构 VS Java内存模型 VS Java对象模型

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

  4. JVM(一)JVM虚拟机内存结构 和 JAVA内存模型(JMM)

    本文转自:浅析java内存模型--JMM(Java Memory Model) - 路易小七 - 博客园,尊重作者,转载请注明出处~ JVM虚拟机内存结构 和 JAVA内存模型 是两个不同的概念 JV ...

  5. 快速带你分清java内存结构,java内存模型,java对象模型和jvm内存结构!

    现如今你是否有这样的感觉,无论生活还是学习,节奏都是非常的快,每天面对海量的知识信息,自己感觉都要hold不住了,每天打开微信公众号,是不是发现有几十条未读,无论是技术文章还是其他类型的文章,我们大多 ...

  6. JVM之深入理解JVM内存结构(Java内存结构/Java内存区域)、Java内存模型

    Java作为一种面向对象的,跨平台语言,其对象.内存等一直是比较难的知识点.而且很多概念的名称看起来又那么相似,很多人会傻傻分不清楚.比如本文我们要讨论的JVM内存结构.JAVA内存结构.JAVA内存 ...

  7. java 堆内存结构_JVM内存结构、Java内存模型和Java对象模型

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

  8. ART虚拟机 _ Java对象和类的内存结构,java中级面试题库weixin

    当我们想要创建一个java.lang.Class类的实例(类对象)时,以下三种方法可供选择: Class.forName("className") MyClass.class ob ...

  9. 【Android 逆向】Android 逆向基本概念 ( 软件运行时内存结构 | 文件与内存之间的联系 )

    文章目录 一.Android 软件运行时内存结构 二.Android 文件与内存之间的联系 一.Android 软件运行时内存结构 Android 软件运行时内存结构 : 硬件层 : 内存中 , 硬件 ...

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

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

最新文章

  1. 动力节点Java培训告诉你Java线程的多功能用法
  2. 业务库负载翻了百倍,我做了什么来拯救MySQL架构?
  3. 关于技术方案与架构宣讲的思考
  4. hibernate的native sql查询
  5. [转载] 深入剖析 redis 主从复制
  6. Linux下自动检测USB热插拔
  7. Vim特定行行尾追加
  8. [html] 如何禁止移动端的左右划动手势?
  9. 最大的路径的节点值之和
  10. 【PL/SQL】PL/SQL语言基础
  11. 微波网络转移参量[A]表示阻抗矩阵[Z]和导纳矩阵[Y]
  12. 这一晚注定属于C罗!回归首秀梅开二度,现场超过7万球迷见证这场胜利
  13. RFC8998+BabaSSL---让国密驶向更远的星辰大海
  14. python 日期选择(包含时间选择)
  15. vs2015遇见问题:后面有“::”的名称一定是类名或命名空间名
  16. 吃热狗游戏Java_《我的世界》吃才是王道“食物工艺”让你尝遍八大菜系
  17. Zimbra部署https证书的操作方法
  18. oss客户端工具_云享会 | 沃云公有云重点产品推荐:文件存储NASamp;对象存储OSS...
  19. 跟着老猫来搞GO-基础语法
  20. VMwareWorkStation虚拟机安装RHEL7.0Linux操作系统

热门文章

  1. ubuntu安装react-native 必须安装watchman
  2. 纯HTML、CSS写一个简单的水滴特效,水滴里面可加图标
  3. button按钮提交表单问题
  4. 地质灾害检测需要了解些什么
  5. Head First C# 中文野生版 图文皆译 (page34)
  6. Chrome70的第二版稳定版:Google Chrome 70.0.3538.77 正式版发布
  7. DBCO-PEG-OPSS,二苯并环辛炔-聚乙二醇-邻吡啶二硫/巯基吡啶取用方法概述
  8. 服务器运行数据库失败,无法在服务器上打开 Access 数据库 | Microsoft Docs
  9. python自动回复机器人手机版_教你用python做一个哄女友的微信自动回复机器人
  10. ifconfig、ip addr、ip route用法总结