「北京java内存模型」java内存区域和内存模型
本篇文章给大家谈谈北京java内存模型,以及java内存区域和内存模型对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、北大青鸟设计培训:java多线程的内存模型?
- 2、北大青鸟java培训:java编程内存管理需要注意的问题?
- 3、什么是Java内存模型?
- 4、如何理解 Java 内存模型中的 Program Order?
北大青鸟设计培训:java多线程的内存模型?
硬件的内存模型物理机并发处理的方案对于jvm的内存模型实现,也有很大的参考作用,毕竟jvm也是在硬件层上来做事情,底层架构也决定了上层的建筑建模方式。
计算机并发并非只是多个处理器都参与进来计算就可以了,会牵扯到一些列硬件的问题,最直接的就是要和内存做交互。
但计算机的存储设备与处理器的预算速度相差太大,完全不能满足处理器的处理速度,怎么办,这就是后续加入的一层读写速度接近处理器运算速度的高速缓存来作为处理器和内存之间的缓冲。
高速缓存一边把使用的数据,从内存复制搬入,方便处理器快速运算,一边把运算后的数据,再同步到主内存中,如此处理器就无需等待了。
高速缓存虽然解决了处理器和内存的矛盾,但也为计算机带来了另一个问题:缓存一致性。
特别是当多个处理器都涉及到同一块主内存区域的时候,将可能会导致各自的缓存数据不一致。
那么出现不一致情况的时候,以谁的为准?为了解决这个问题,处理器和内存之间的读写的时候需要遵循一定的协议来操作,这类协议有:MSI、MESI、MOSI、Synapse、Firefly以及DragonProtocol等。
这就是上图中处理器、高速缓存、以及内存之间的处理方式。
另外除了高速缓存之外,为了充分利用处理器,处理器还会把输入的指令码进行乱序执行优化,只要保证输出一致,输入的信息可以乱序执行重组,所以程序中的语句计算顺序和输入代码的顺序并非一致。
JVM内存模型上面我们了解了硬件的内存模型,以此为借鉴,我们看看jvm的内存模型。
jvm定义的一套java内存模型为了能够跨平台达到一致的内存访问效果,从而屏蔽掉了各种硬件和操作系统的内存访问差异。
这点和c和c++并不一样,C和C++会直接使用物理硬件和操作系统的内存模型来处理,所以在各个平台上会有差异,这一点java不会。
java的内存模型规定了所有的变量都存储在主内存中,java课程发现每个线程拥有自己的工作内存,工作内存保存了该线程使用到的变量的主内存拷贝,线程对变量所有操作,读取,赋值,都必须在工作内存中进行,不能直接写主内存变量,线程间变量值的传递均需要主内存来完成。
北大青鸟java培训:java编程内存管理需要注意的问题?
大家在进行程序系统维护的时候是否因为java编程的内存管理问题而无法快速解决导致系统出错呢?下面我们就一起来了解和学习一下,关于java编程内存管理都有哪些知识点。
程序计数器(了解)程序计数器,可以看做是当前线程所执行的字节码的行号指示器。
在虚拟机的概念模型里,字节码解释器工作就是通过改变程序计数器的值来选择下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都要依赖这个计数器来完成。
Java虚拟机栈(了解)Java虚拟机栈也是线程私有的,它的生命周期与线程相同。
虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链表、方法出口信息等。
每一个方法从调用直至执行完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
局部变量表中存放了编译器可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用和returnAddress类型(指向了一条字节码指令的地址)。
如果扩展时无法申请到足够的内存,就会抛出OutOfMemoryError异常。
本地方法栈(了解)本地方法栈与虚拟机的作用相似,不同之处在于虚拟机栈为虚拟机执行的Java方法服务,而本地方法栈则为虚拟机使用到的Native方法服务。
有的虚拟机直接把本地方法栈和虚拟机栈合二为一。
会抛出stackOverflowError和OutOfMemoryError异常。
Java堆堆内存用来存放由new创建的对象实例和数组。
(重点)Java堆是所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的目的就是存放对象实例。
Java堆是垃圾收集器管理的主要区域。
java课程培训机构发现由于现在收集器基本采用分代回收算法,所以Java堆还可细分为:新生代和老年代。
从内存分配的角度来看,线程共享的Java堆中可能划分出多个线程私有的分配缓冲区(TLAB)。
什么是Java内存模型?
1.java内存模型简称JMM
2.通俗点讲就是指你代码中写的那些内容在内存中是怎么存储的
3.比如说 Student stu = new Student();int a = 5; 你新建了一个学生类,建立了一个变量a,这些内容在内存中是咋存储的,
4.大的来说JMM分为堆栈,一般情况下学生类分配在堆,变量a分配在栈,
如何理解 Java 内存模型中的 Program Order?
关于Program Order,对于每个线程,他只是一个语句的执行顺序集合定义,在这个集合里语句执行顺序能够保证正确性,即执行结果等于人为阅读代码时的执行结果(例如不管你按什么顺序执行1+1,始终等于2)。而Program Order的正确性保证了Intra-thread consistency.
1、intra-thread semantics
Intra-thread semantics are the semantics for single-threaded programs, and allow the complete prediction of the behavior of a thread based on the values seen by read actions within the thread.
单线程语义是内在一致的,这要求运行时环境(虚拟机或CPU)在单线程语境下,要至少提供以下保证:
1. 对同一内存对象的交替读,写,是有序的。程序中的先读后写,或先写后读,不能被打乱。这是合乎逻辑的。
2. 依赖性的内存访问,也必须是有序的。如从内存对象A中加载地址,再依据读到的地址,读取所指向的值。不能被打乱。这也是合乎逻辑的。
只有至少保证这两点,单线程语义才能保证:the complete prediction of the behavior of a thread based on the values seen by read actions within the thread.
线程内语义(Intra-thread semantics)是对单线程语义的推广。即单线程语义,再加上:
with the exception that the values seen by each read are determined by the memory model.
在保持这层语义上,运行时环境有足够自由schedule指令的运行顺序。换句话说,它可以合理的方式重排指令,只要结果表现得像按你写的指令顺序一样就行。
2、 program order
Among all the inter-thread actions performed by each thread t, the program order of t is a total order that reflects the order in which these actions would be performed according to the intra-thread semantics of t.
program order 作用实体是每线程, 建立于线程内语义之上。前面说线程内语义赋给运行时环境足够的自由重排指令了。因此,此时的program order已经不再只是纸面上写的指令的原始顺序了,而是运行时环境智能重排后的顺序。
在这个基础上,program order表现的就是发射给JVM执行的顺序。这个顺序仍然是total order的。
北京java内存模型的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java内存区域和内存模型、北京java内存模型的信息别忘了在本站进行查找喔。