首页 > 编程知识 正文

java内存模型的底层原理(java内存模型的理解)

时间:2023-12-23 11:38:07 阅读:319322 作者:OZQW

本文目录一览:

java创建对象底层原理是什么,java中的对象到底在内存中是什么,别说什么类的具体实例化

对象是类的实例,同一个类的不同实例当然拥有相同的机器指令(相同的方法行为),不同的实例拥有不同的属性内存,相同的指令操作不同的内存得到各自的结果。

举个例子:

我们描述一个类:水果,它有两个属性,名称和数量,一个方法设置数量(setNum)。

现在,我们实例两个水果,一个苹果和一个西瓜(假如初始是一个),此时得为苹果和西瓜各自准备一个不同的存放空间(不能重叠了是吧,这就是为不同对象分配不同的堆内存),然后我们为两个对象都执行设置数量方法(都是setNum,同一个行为),假如苹果改为2,西瓜

改为5,此时两个不同对象执行了同一个方法得到个各自的结果。

下面补充一些官方描述:

java创建类时,也即是你所说的原类,其实只是对那个类的对象的外观与行为的描述(此时并未开辟堆内存,当然static例外)。只有当使用new创建那个类的对象时才会分配数据存储空间,其方法才供外界调用。

java为指定类创建对象,其实就是为类的描述创建属性值存储空间并初始化,并在堆栈中创建其指针,如果有方法局部变量,方法也会有自己的临时堆栈。

一个对象是一个堆栈地址所指向的一组堆内存,然后对象的行为则是java语言编译后的机器指令代码,指令执行操纵内存的数据。

如果有更合理的理解,或者认为我的理解有不对的地方欢迎指正,学习就是不断接近真相。

什么是Java内存模型?

1.java内存模型简称JMM

2.通俗点讲就是指你代码中写的那些内容在内存中是怎么存储的

3.比如说 Student stu = new Student();int a = 5; 你新建了一个学生类,建立了一个变量a,这些内容在内存中是咋存储的,

4.大的来说JMM分为堆栈,一般情况下学生类分配在堆,变量a分配在栈,

Java内存模型FAQ 什么是内存模型

内存模型描述的是程序中各变量(实例域、静态域和数组元素)之间的关系,以及在实际计算机系统中将变量存储到内存和从内存取出变量这样的低层细节。对象最终存储在内存中,但编译器、运行库、处理器或缓存可以有特权定时地在变量的指定内存位置存入或取出变量值。例如,编译器为了优化一个循环索引变量,可能会选择把它存储到一个寄存器中,或者缓存会延迟到一个更适合的时间,才把一个新的变量值存入主存。所有的这些优化是为了帮助实现更高的性能,通常这对于用户来说是透明的,但是对多处理系统来说,这些复杂的事情可能有时会完全显现出来。

JMM 允许编译器和缓存以数据在处理器特定的缓存(或寄存器)和主存之间移动的次序拥有重要的特权,除非程序员已经使用 synchronized 或 final 明确地请求了某些可见性保证。这意味着在缺乏同步的情况下,从不同的线程角度来看,内存的操作是以不同的次序发生的。

与之相对应地,像 C 和 C++ 这些语言就没有显示的内存模型 —— 但 C 语言程序继承了执行程序处理器的内存模型(尽管一个给定体系结构的编译器可能知道有关底层处理器的内存模型的一些情况,并且保持一致性的一部分责任也落到了该编译器的头上)。这意味着并发的 C 语言程序可以在一个,而不能在另一个,处理器体系结构上正确地运行。虽然一开始 JMM 会有些混乱,但这有个很大的好处 —— 根据 JMM 而被正确同步的程序能正确地运行在任何支持 Java 的平台上。

玉溪java培训学校告诉你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课程认为应该先了解一下物理计算机中的并发问题,理解这些问题可以搞清楚内存模型产生的背景。

物理机遇到的并发问题与虚拟机中的情况有不少相似之处,物理机的解决方案对虚拟机的实现有相当的参考意义。

物理机的并发问题硬件的效率问题计算机处理器处理绝大多数运行任务都不可能只靠处理器“计算”就能完成,处理器至少需要与内存交互,如读取运算数据、存储运算结果,这个I/O操作很难消除(无法仅靠寄存器完成所有运算任务)。

由于计算机的存储设备与处理器的运算速度有几个数量级的差距,为了避免处理器等待缓慢的内存完成读写操作,现代计算机系统通过加入一层读写速度尽可能接近处理器运算速度的高速缓存。

缓存作为内存和处理器之间的缓冲:将运算需要使用到的数据复制到缓存中,让运算能快速运行,当运算结束后再从缓存同步回内存之中。

缓存一致性问题基于高速缓存的存储系统交互很好的解决了处理器与内存速度的矛盾,但是也为计算机系统带来更高的复杂度,因为引入了一个新问题:缓存一致性。

在多处理器的系统中(或者单处理器多核的系统),每个处理器(每个核)都有自己的高速缓存,而它们有共享同一主内存(MainMemory)。

当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致。

为此,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议进行操作,来维护缓存的一致性。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。