b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

Java内存模型规范了Java虚拟机与计算机内存是如何协同工作的

电脑杂谈  发布时间:2021-02-06 01:04:05  来源:网络整理

简介

Java内存模型指定Java虚拟机和计算机内存如何一起工作。 Java虚拟机是完整计算机的模型,因此该模型自然也包含一个内存模型,也称为Java内存模型。

为什么有记忆模型?现代计算机具有多层缓存。

CPU访问存储设备时,无论是访问数据还是访问指令,它们都倾向于聚集在连续的区域中,这称为局部性原理。

临时位置:如果正在访问某个信息项,则很可能在不久的将来再次访问它。例如循环,递归,方法的重复调用等。空间局部性:如果引用了某个内存位置,将来还会引用该位置附近的位置。例如,顺序执行的代码,连续创建的两个对象,数组等。

多核CPU多级缓存一致性协议MESI

对于多核CPU,有多个第一级缓存。如何确保缓存中内部数据的一致性,以免混淆系统数据。这导致了共识协议MESI。

注意:M和E状态始终是准确的,它们与高速缓存行的实际状态一致,而S状态可能不一致。

重新订购

为了提高执行程序时的性能,编译器和处理器经常对指令重新排序。

共有三种重新排序类型:

jvm 内存模型_jvm内存模型_jvm内存模型

1、编译器优化的重新排序。编译器可以重新排列语句的执行顺序,而无需更改单线程程序的语义。2、指令级并行重排序。现代处理器使用指令级并行技术来重叠多个指令。如果没有数据依赖性,则处理器可以更改与机器指令相对应的语句的执行顺序。3、存储系统的重新排序。由于处理器使用高速缓存和读/写缓冲区,因此加载和存储操作似乎是无序执行的。

Java内存模型(JMM)

Java内存模型(Java Memory Model,JMM)是一种内存模型规范,它屏蔽了各种硬件和操作系统的访问差异,并确保Java程序可以在各种平台下访问内存。确保结果一致的机制和法规。

每个部分的特征和功能如下:

为了确保共享内存的正确性(可见性,有序性,原子性),内存模型定义了共享内存系统中多线程程序的读写操作规范。这些规则用于调节对存储器的读写操作,以确保指令执行的正确性。目的是解决当多个线程通过共享内存通信时,本地内存数据不一致导致的问题,编译器将对代码指令进行重新排序,而处理器将使代码乱序执行。

确保原子性

在Java中,为了确保原子性,提供了两个高级字节码指令monitor和monitorexit。对于这两个字节码,Java中的相应关键字已同步。

因此,可以在Java中使用sync,以确保方法和代码块中的操作是原子的。

保证可见性

Java内存模型是通过将主存储器作为传输介质来实现的,该介质在修改变量后将新值同步回主存储器,并在读取变量之前从主存储器刷新变量值。

jvm内存模型_jvm 内存模型_jvm内存模型

Java中的volatile关键字提供了一个功能,即修改后的变量可以在修改后立即同步到主存储器,并且每次使用前都会从主存储器刷新该变量。

下面是在保守策略下将易失性写操作插入到内存屏障后生成的指令序列的:

下面是在保守策略下将易失性读操作插入到内存屏障后生成的指令序列的:

上述用于易失性写操作和易失性读操作的存储器屏障插入策略非常保守。在实际执行中,只要不改变易失性读写的内存语义,编译器就可以根据具体情况省略不必要的障碍。

确保秩序

在Java中,同步和易失性可用于确保多个线程之间的操作井然有序。实现方式有所不同:volatile关键字禁止指令重排。 sync关键字可确保同一时间只允许一个线程操作。

说到顺序,请注意,我们说顺序可以通过易变和同步来实现,但我们的所有代码都不能依靠这两个关键字。实际上,Java语言已经为重新排序或排序做出了规定,优化虚拟机时不会违反该规定。

发生之前的原则如下:

1.程序顺序的原理:在一个线程内,按照程序代码顺序,写在前面的操作先于写在后面的操作。2.易失性规则:易失性变量的写入在读取之前进行,这确保了易失性变量的可见性。3.锁定规则:解锁必须在随后的锁定之前进行。4.可传递性:A在B之前,B在C之前,因此A必须在C之前。5.线程的start方法在它执行的每个动作之前。6.线程的所有操作都程终止之前。7.线程(interrupt())的中断在被中断的代码之前。8.对象的构造函数在finalize方法之前结束。

Java8的不同元空间(元空间)

jvm内存模型_jvm 内存模型_jvm内存模型

在JDK 1. 8中,永久代不再存在,并且存储的类信息,编译的代码数据等已移至MetaSpace(元空间),而元空间不在堆内存中,但是直接占用本地内存(NativeMemory)。

元空间的性质类似于永久性生成的性质,即JVM规范中方法区域的实现。但是,元空间和永久生成之间的最大区别是元空间不在虚拟机中,而是使用本地内存。

元空间的大小仅受本地内存限制。您可以使用以下参数指定元空间的大小:

-XX:MetaspaceSize,初始空间大小。当达到此值时,将触发垃圾回收以进行类型卸载。同时,GC将调整该值:如果释放了很多空间,则应适当减小该值;较少的空间,然后当其不超过MaxMetaspaceSize时,适当增加值-XX:MaxMetaspaceSize,即最大空间,默认值为无限制-XX:MinMetaspaceFreeRatio,在GC之后,最小Metaspace剩余空间容量的百分比减小为分配的空间-XX:MaxMetaspaceFreeRatio导致的垃圾收集,在GC之后,最大的Metaspace剩余空间容量的百分比减少到由自由空间导致的垃圾收集

堆内存划分

在JDK 1. 7及其早期版本的JDK中,堆内存通常分为三个区域:

VM Matedata的年轻一代,老一代,永久一代

在JDK 1. 8中,存储元数据的永久存储器从堆存储器移至本地存储器。 JDK 1. 8中的JVM堆内存结构如下:

参考文章

有关更多相关知识,请查看以下优秀文章:

:/// cjsblog / p / 9850300.html

最后


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/shoujiruanjian/article-354042-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...