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

Java虚拟机内存模型中定义的内存访问操作与一致性

电脑杂谈  发布时间:2021-06-12 04:04:38  来源:网络整理

最近,我和几个一起在 Android 上工作的朋友一起喝酒。他最近在学习JVM。我们只是简单地讨论了一下。他比我深得多。我不愿意堕落。我也开始学习和写作我整理了4篇文章来整理我的想法。 Java虚拟机总长如下:

文章内容如下:

多任务和高并发是衡量计算机处理器能力的重要指标之一。一般而言,衡量服务器的性能。每秒交易的指数(Transactions Per Second,TPS)可以说明问题。代表服务器一秒内可以响应的平均请求数,TPS值与程序并发。能力有着非常密切的关系。在讨论Java内存模型和线程之前,先简单介绍一下硬件的效率和一致性。

一、硬件的效率和一致性

因为计算机的存储设备和处理器的计算能力之间存在几个数量级的差距。因此,现代计算机系统不得不增加一层读写速度尽可能接近处理器处理速度的高速缓存(cache),作为内存和处理器之间的缓冲区:复制需要的数据对缓存的操作,让计算可以快速进行,等匀速结束后,缓存同步回内存,这样处理器就不需要等待慢速的内存读写了。

基于告诉缓存的存储交互很好的解决了处理器和内存的速度矛盾,但是又引入了一个新问题:缓存一致性。在多处理器系统中,每个处理器都有自己的通知缓存,它们共享一个统一的主存,如下图:多个处理器的计算任务涉及到同一个主存块,需要一个协议来保证数据一致性,此类协议包括 MSI、MESI、MOSI 和 Dragon 协议。 Java虚拟机内存模型中定义的内存访问操作类似于硬件缓存访问操作。

java虚拟机内存模型

一致性.png

另外,为了充分利用处理内部的算术单元,处理可能会优化传入和传出代码的乱序执行(Out-Of-Order Execution),处理器将计算后执行计算。对乱序执行的代码进行重新组织,以确保结果的准确性。与处理器的乱序执行优化类似,Java虚拟机的偶数编译器(JIT)也有类似的指令重排(Instruction Recorder)优化。

二、Java 内存模型

Java 内存模型的主要目标是为程序中的每个变量定义访问规则,即在虚拟机中存储变量并从内存的低级细节中移除变量。这里的变量与Java编程中提到的变量不同。它们包括实例字段、静态手势和组成数组对象的元素,但不包括局部变量和方法参数。后者是线程私有的,不会被共享。 .

java内存模型_java虚拟机内存模型_java内存模型面试回答

Java 内存模型规定所有变量都存储在主存中,每个线程都有自己的工作内存(类似于之前的处理器缓存),线程的工作内存存储线程使用情况,将变量复制到一个主存的拷贝,线程对变量的所有操作(读、赋值)都必须在工作内存中进行,不能直接读写主存中的变量。不同的线程不能直接访问对象工作内存中的变量。线程间变量值的传递需要在主存中完成。线程、主存和工作内存的交互如下图所示,与上图非常相似。

java虚拟机内存模型

Java 内存.png

Java 内存区中的主内存、工作内存和 Java 堆、堆栈和方法区不划分为同一级别的内存。

java虚拟机内存模型

主存.png

对于普通变量,在一个线程中更新的值不能立即反映到其他变量中。如果需要在其他线程中立即可见,则需要使用 volatile 关键字作为标识

3、Orderedness:在这个线程中,操作都是有序的;程之外,操作都是无序的。在Java内存模型中,允许编译器和处理重新排序执行,但重新排序的过程并不影响单线程程序的执行,而是影响多线程并发执行的正确性。在 Java 中,可以使用 volatile 关键字来确保某种“顺序”。另外,可以通过synchronized和Lock来保证顺序。很明显,synchronized和Lock保证了每一个时刻都有一个线程来执行同步代码,相当于让线程依次执行同步代码,自然就保证了顺序。对于 volatile,JMM(Java Memory Model)内存屏障插入策略:

内存操作之间的交互:

关于主内存和工作内存之间的具体交互协议,即一个变量如何从主内存复制到工作内存,以及如何从工作内存同步到主内存。 Java内存模型定义了以下8个操作来完成:

java内存模型面试回答_java虚拟机内存模型_java内存模型

java虚拟机内存模型

内存.png

如果将变量从主存复制到工作内存,则需要依次执行读取和加载操作。如果将变量从工作内存同步回主内存,则需要依次执行存储和写入操作。每个操作都是原子的,即在执行过程中不会被中断。 Java内存模型只要求上述操作必须按顺序执行,并不能保证必须连续执行。即在r​​ead和load之间,可以在store和write之间插入其他指令,比如访问内存中的变量a和b,可能的顺序是read a, read b, load b, load a。 Java内存模型还规定,在执行上述八项基本操作时,必须满足以下规则:

三、Reorder

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

编译器优化的重新排序。编译器可以在不改变单线程程序语义的情况下重新安排语句的执行顺序。指令级并行重新排序。现代处理器使用指令级并行技术来重叠多条指令。如果没有数据依赖,处理器可以改变机器指令对应的语句的执行顺序。记忆系统的重新排序。由于处理器使用缓存和读写缓冲区,这使得加载和存储操作似乎是无序执行的。

从Java源代码到最终实际执行的指令序列,会有如下三种重新排序:

java虚拟机内存模型

图像.png

为了保证内存的可见性,Java编译器会在生成的指令序列中的适当位置插入内存屏障指令,以禁止特定类型的处理器重新排序。

java内存模型面试回答_java内存模型_java虚拟机内存模型

四、JVM 架构介绍

为了显示虚拟机进程和.class文件的关系,特画了下图:

java虚拟机内存模型

虚拟机.png

通过上图,我们编译好的.class文件作为Java虚拟机的原材料输入到Java虚拟机中,那么这部分工作谁来做呢?实际上,在Java虚拟机内部,有一个叫做类加载的子系统,用于在运行时根据需要加载类。注意上句中的“根据需要”4个字。 Java虚拟机在执行过程中,只有当他需要一个类的时候,才会调用类加载器来加载这个类,运行时不会加载所有的类。就像一个人饿了才吃东西,而不是一次吃完一年的所有饭菜。一般来说,虚拟机加载类的时间是第一次使用新类的时间。我们将在 Java 虚拟机基础知识-3 加载机制的类型中详细解释。

因为虚拟机加载的类是加载到Java虚拟机内存中的,所以虚拟机读取并执行其中的字节码指令。执行字节码指令的虚拟机部分称为执行引擎。就像人一样,不吃饭就完蛋了,需要消化。执行引擎相当于一个人的胃肠系统。在执行过程中,每个类文件都会动态连接。执行引擎的具体行为以及与动态链接相关的内容也会在Java虚拟机基础知识-类型3加载机制中详细说明。

我们知道Java虚拟机执行自动内存管理。具体来说,它会自动释放无用的对象,而无需程序员编写代码来释放分配的内存。这部分工作由垃圾收集子系统负责。从上面的讨论我们可以知道,一个Java虚拟机实例在其运行过程中需要三个子系统来保证它的正常运行,它们是:

如下图:

java虚拟机内存模型

JVM.png 的三个子系统

要运行虚拟机,必须加载.class文件,并且必须执行class文件中的字节码指令。它做很多事情,必须需要自己的空间。就好像人吃的东西要先放进胃里一样。虚拟机也需要空间来存储这些数据。首先,加载字节码需要单独的内存空间来存储;线程的执行也需要内存空间来维护方法的调用关系,存储方法中的数据和中间计算结果;在执行过程中,不可避免地要创建一个对象,创建的对象需要一个专用的内存空间来存储。关于虚拟机运行时区的内容,我们将在Java虚拟机基础知识-2JVM运行时数据区详细讲解。

喜欢就点个赞吧。每一次您的喜欢,都是我努力与进步的动力!你可能想不到:你的一点点触碰可能会对另一个人产生翻天覆地的影响。 !最后感谢大家的支持和厚爱


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

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

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