Java内存模型与Jvm内存模型
经典问题
Q:说一下 Java(Jvm)的内存模型
A:Java内存模型是Jvm内存模型的抽象(深入理解JAVA虚拟机)
JVM内存模型
线程安全--虚拟机栈、本地方法栈、程序计数器
非线程安全--方法区、堆(新生代,老年代)、
Meta Space(Jdk 1.8新增)
Java内存模型
工作内存、主内存(对应JVM内存中的一部分)
追根溯源
Jvm内存模型
Java虚拟机运行时数据区
程序计数器:一块较小的内存空间,当前线程所执行的字节码行号指示器。
虚拟机栈:线程私有,生命周期与线程相同。每个方法执行,虚拟机都会创建一个栈帧,储存局部变量表、操作数栈、动态连接、方法出口等信息。每一个方法被调用到执行完毕,就对应着一个栈帧的入栈和出栈。
本地方法栈:与虚拟机栈的作用非常类似,不同的是虚拟机栈为java方法服务,本地方法栈为本地方法(Native)服务。
堆:虚拟机管理的内存里最大的一块,被所有线程共享,在虚拟机启动的时候创建。堆唯一的目的就是存放对象实例,Java中几乎所有的对象实例都在堆分配内存。
方法区:用于存储已经被虚拟机加载的类型信息、常量、静态变量、即时编译器编译后的代码缓存等数据。
运行时常量池:方法区中的部分区域,Class文件除了有类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池表,用于存放编译期生成的各种字面量与符号引用,这部分内容将在类加载后存放到方法区的运行时常量池中。
Java内存模型(JMM)
定义:是一种规范,规定了JVM如何使用计算机内存。同时,JMM向开发者保证,如果程序是正确同步的,程序的执行将具有顺序一致性(顺序一致性内存模型)
目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从主内存中取出变量这样的底层细节(此处变量与Java编程中的变量有区别,它包括了实例字段、静态字段和构成数组对象的元素,不包括局部变量与方法参数,后者是线程私有)。
JMM模型图
主内存:规定所有的变量都存储到主内存中(可类比物理硬件的主内存,但此处只是虚拟机内存的一部分)
工作内存:每条线程所有(可类比处理器高速缓存),线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,不能直接读写内存中的变量。不同线程之间无法访问对方工作内存中的变量。
Jvm内存模型与Java内存模型关系
基本上没有关系,如果两者一定要勉强对应起来,那主内存对应Java堆中的对象实例数据部分,工作内存对应虚拟机栈中的部分区域。
为什么这么说,来了解一下内存模型
我们知道,一个程序的运行,不可能只靠“计算”就能完成,处理器至少要与内存进行交互,如读取运算数据,存储运算结果等,这个I/O很难避免。由于存储设备与处理器运算速度有几个数量级的差距,所以现代操作系统不得不引入一层读写速度尽可能接近处理器运算速度的高速缓存来作为内存与处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速执行,运算结束后,再从缓存同步到内存中,这样处理器就无须等待缓慢的内存读写了。存储结构如图
操作系统存储结构
基于高速缓存的存储交互很好的解决了处理器与内存的速度矛盾,但也引入了新的问题:缓存一致性。
当有多个处理器系统中,每个处理器都有自己的高速内存,而他们又共享同一主内存。
当多个处理器的运算任务都涉及同一块主内存时,将导致个子的缓存数据不一致,如果真发生这种情况,那最终结果以谁为准呢?
为解决该问题,各个处理器访问缓存时都需要遵守一些协议,读写时要根据协议来(MSI、MESI等)。
基于此,我们常说的内存模型,即在特定的操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象。
Java内存模型(JMM):用来屏蔽掉各种硬件和操作系统的内存访问差异,以实现Java程序在各种平台下都能达到一致的内存访问效果(类比操作系统中寄存器、高速缓存的一些处理机制)。
Jvm内存模型:更多的是描述Java程序运行时的各个运行区域(类比操作系统中的内存管理模块),更多的用来将Java运行时使用的内存划分清楚,便于后续管理。
两者所解决的主要矛盾不一致,所以基本是无区别。
注:笔者一直认为,Java虚拟机是一个小型的操作系统,操作系统中需要注意的问题,Java虚拟机中都有涉及到,解决问题的相关方案与涉及模型,与操作系统中的相关模块实现也都很类似,学习Java虚拟机时,完全可以类比操作系统来学习。
欢迎关注GoGoCoder微信公众号交流,定期更新高频面试考点
Java内存模型与Jvm内存模型相关推荐
- 快速带你分清java内存结构,java内存模型,java对象模型和jvm内存结构!
现如今你是否有这样的感觉,无论生活还是学习,节奏都是非常的快,每天面对海量的知识信息,自己感觉都要hold不住了,每天打开微信公众号,是不是发现有几十条未读,无论是技术文章还是其他类型的文章,我们大多 ...
- 克服焦虑--图解JVM内存模型和JVM线程模型
前言 各位亲爱的读者朋友,我正在创作 Java多线程系列 文章,严格的说,JVM内存模型的知识并不隶属于Java多线程范畴,但在讨论多线程的过程中,会涉及到相关概念,考虑到它作为 面经常客,故单独成篇 ...
- Java 内存模型和 JVM 内存结构真不是一回事
这两个概念估计有不少人会混淆,它们都可以说是 JVM 规范的一部分,但真不是一回事!它们描述和解决的是不同问题,简单来说, Java 内存模型,描述的是多线程允许的行为 JVM 内存结构,描述的是线程 ...
- Java基础:由JVM内存模型详解线程安全
1.前言 最近在研究JVM内存模型和Java基础知识.主要讲的是线程共享变量与线程私有变量以及如何写出线程安全的代码.这里列出一条规则,"类中的成员变量,也叫实例变量,也叫全局变量,它是非线 ...
- JVM内存模型以及JVM内存模型图
1.JVM内存划分: 1.程序计数器:当前线程所执行的字节码的行号指示器.2.本地方法栈:为虚拟机使用的native方法服务.3.Java虚拟机栈:描述Java方法执行的内存模型,每个方法被执行的时候 ...
- linux查看java虚拟机内存_深入理解java虚拟机(linux与jvm内存关系)
本文转载自美团技术团队发表的同名文章 https://tech.meituan.com/linux-jvm-memory.html 一, linux与进程内存模型 要理解jvm最重要的一点是要知道jv ...
- java虚拟机和内存的关系_深入理解java虚拟机(linux与jvm内存关系)
本文转载自美团技术团队发表的同名文章 https://tech.meituan.com/linux-jvm-memory.html 一, linux与进程内存模型 要理解jvm最重要的一点是要知道jv ...
- tomcat 设置java内存_Tomcat 设置JVM内存大小
我的服务器的配置: # OS specific support. $var _must_ be set to either true or false. JAVA_OPTS="-Xms10 ...
- java 内存溢出 扩大jvm内存
随手小记: 今天下午遇到一个问题:java.lang.OutOfMemoryError: Java heap space 内存溢出问题,遇到这个问题一般有两个解决方式 第一种:修改代码程序,代码中存在 ...
- 内存溢出数值jvm 内存溢出 在myeclipse中加大tomcat的jvm内存 java.lang.OutOfMemoryError: PermGen space...
废话就不多说了,开始... 每日一道理 站在历史的海岸漫溯那一道道历史沟渠:楚大夫沉吟泽畔,九死不悔:魏武帝扬鞭东指,壮心不已:陶渊明悠然南山,饮酒采菊--他们选择了永恒,纵然谄媚诬蔑视听,也不随其流 ...
最新文章
- php跨域cookie共享使用方法
- AUTHORITY-CHECK常用事务代码
- 推荐系统User-Item Embedding图算法
- iphone震动反馈怎么设置_如何评价 iPhone 上的振动反馈?
- Scala Hbase 问题汇总
- JavaScript中不得不说的断言?
- (转)如何在maven的pom.xml中添加本地jar包
- java二叉树算法_java构建二叉树算法
- 从零打造 Vue 聊天组件
- cryengine开源了吗_Linux上的CryEngine支持,将开源带入厨房等
- 什么是Shell、Shell脚本
- PL/SQL Developer 更改字体
- 中国重点流域已实现休禁渔制度全覆盖
- oracle中insert语句怎,Oracle中Insert语句的总结
- wind 10家庭版系统激活
- 原生/RN/Flutter选型
- 成功的条件:高人指点、贵人相助、小人监督、个人奋斗
- 数据库--循环语句:for循环
- 输出二叉查找树poj 2418 二叉查找树
- POE交换机全方位解读(下)
热门文章
- ISO27001信息安全管理体系
- 浙江省计算机二级办公软件高级应用技术真题,浙江省计算机二级办公软件高级应用技术考试题库.doc...
- 游戏设计3C之一——角色
- ad怎么修改栅格_AD18怎么改变pcb原理图的网格大小
- spss分析方法-方差分析
- 海康GB28181接入SRS服务器,实现低延迟直播
- 《STM32开发指南》ALIENTEK战舰STM32开发板资料
- 前端 地图增加边框线_echarts map地图设置外边框或者阴影
- 射频微波芯片设计2:滤波器芯片
- rtc校准算法_STM32实时时钟RTC日历算法